本文へスキップ
>_ITDITDセキュリティ対策プラットフォーム

フレームワーク別

ASP.NET Coreのセキュリティ対策 — 本番エラー・秘密・認可の守り方

ASP.NET Coreは堅い基盤ですが、事故は設定で起きます。三大=本番の詳細エラー/開発者例外ページの露出/appsettingsへの秘密直書き/認可属性の付け忘れ。加えて安全でないデシリアライズ、モデルバインディングの過剰受け入れ、NuGet依存のCVE。既定を活かしつつ設定の穴を塞ぐ方法を、攻撃手順を伏せて解説します。

公開日 2026-07-02 更新日 2026-07-02 6分で読める

対象:ASP.NET Core でアプリやAPIを運営している人。ここでは攻撃手順は扱わず、堅い基盤を活かしつつ、設定で開く穴を塞ぐ方法を解説します。全体像は フレームワーク別セキュリティの入口 も参照。

三大落とし穴(設定で開く)

ASP.NET Coreの仕組みは優秀ですが、次の3つは設定と作り込みで守る領域です。

① 本番の詳細エラー露出

開発者例外ページ等で内部情報が露出。故意のエラーで抜かれる。

② appsettingsへの秘密

接続文字列・キーを直書き。誤コミット/公開で漏えい。

③ 認可属性の付け忘れ

[Authorize]漏れで誰でも到達。所有者確認も無し。

ASP.NET Coreで開きやすい三大穴。いずれも設定・作り込みの外側。

そのほか、BinaryFormatter 等の安全でないデシリアライズ、モデルバインディングの過剰受け入れ(over-posting)、NuGet依存の既知CVE放置も注意点です。

塞ぎ方(3ステップ)

1

本番は詳細エラーを非表示に

本番環境では開発者例外ページ/詳細エラーを出さない(環境判定を正しく)。汎用エラーページに切り替え、内部情報を外に出さない。デプロイ手順に組み込み毎回確認する。
2

秘密は設定の外部から読み込む

接続文字列やキーをappsettings.jsonに直書きしない。開発はUser Secrets、本番は環境変数やクラウド秘密管理(Key Vault相当)から。万一漏れたら速やかにローテーション(→ 公開ディレクトリに秘密を置かない)。
3

認可を明示し、危険な入力経路を断つ

エンドポイントに[Authorize]と所有者確認を明示(既定は拒否側に)。over-postingはDTOや[Bind]で受け入れフィールドを制限し、信頼できないデータを安全でない形式でデシリアライズしない。NuGet依存はCVE監視+即パッチ(→ IDORとは)。

やりがち(危険)

  • 本番で開発者例外ページを露出
  • appsettings.jsonに秘密を直書き
  • [Authorize]付け忘れ・所有者確認なし
  • モデルに全フィールド受け入れ(over-posting)

正しい

  • 本番は詳細エラー非表示
  • 秘密はUser Secrets/環境/Key Vault
  • 認可を明示(既定拒否・所有者確認)
  • DTO/[Bind]で受け入れ制限

当サイトの視点:堅い基盤でも『設定と認可』は自分の責任

ASP.NET Coreは認証・認可・データ保護の仕組みが整っていますが、本番の設定認可の付与だけは、環境ごと・エンドポイントごとに自分で正しく決める必要があります。当サイトは別スタックですが原則は同じ——本番で内部情報を出さない、秘密を設定の外部に置く、公開入口には必ず認可を書く、依存はCVE監視する。堅い基盤の価値は、正しい設定と明示的な認可があって初めて発揮されます。

次に読む

よくある質問

QASP.NET Core は安全ですか?
A

ASP.NET Core は成熟した堅い基盤で、認証・認可・データ保護(Data Protection)などの仕組みが整っています。正しく使えば強力ですが、事故は本体でなく設定で起きます。とくに本番での詳細エラー露出、appsettingsへの秘密直書き、認可属性の付け忘れは、フレームワーク特有というより設定・運用の問題として繰り返し起きます。

Q秘密(接続文字列やAPIキー)はどこに置くべきですか?
A

appsettings.json にそのまま書かないのが原則です。開発では User Secrets、本番では環境変数やクラウドの秘密管理(例:Key Vault 相当)から読み込みます。appsettings.json はリポジトリに入りやすく、公開ディレクトリや誤コミットで漏れやすいためです。万一漏れたら接続文字列やキーを速やかにローテーションしてください。

Q認可属性の付け忘れはどう防ぎますか?
A

コントローラやエンドポイントに [Authorize] を付け忘れると、認証を通さず誰でも到達できてしまいます。既定を『拒否』側に寄せる(フォールバックポリシーで未認証を弾く)、ロール/ポリシーベースで権限を明示する、リソース所有者の確認を書く、といった設計にします。『ログインしていれば実行可』で止めず、操作対象の所有者まで確認するのが安全です。