-
Notifications
You must be signed in to change notification settings - Fork 0
MS_HTTPMethodControl
- 戻る
-
セキュリティ云々での対策の場合、
補足(この注意書きが本ページの核心): 脆弱性診断で
「TRACE / OPTIONS / PUT / DELETE が有効」と指摘され、
反射的に禁止設定を入れようとする——という場面が典型的だが、
原文が言う通り多くは対処不要である。
メソッド 実際のリスク 対処 TRACE Cross-Site Tracing (XST)。IIS は既定で無効 既定のままでよい OPTIONS 情報が漏れるわけではない。CORS で必要 禁止しない(CORS が壊れる) PUT / DELETE WebDAV が有効な場合のみ危険 WebDAV を入れない PROPFIND / COPY / MOVE 等 WebDAV 由来 同上 HEAD GET と同等 禁止しない **XST(TRACE を悪用した Cookie 窃取)**は、
現在のブラウザがXMLHttpRequestでの TRACE を禁止しているため
実質的に成立しない。本当に効く対策は、メソッドの禁止ではなく、
HttpOnly属性(スクリプトから Cookie を読ませない)- WebDAV を入れない(既定で入っていない)
- 不要なハンドラー/モジュールを削除する
といった点である。
ただし、診断報告書への対応として設定を入れる必要がある場合は、
以下の方法で対応できる。
Web サイト(IIS)全体に対する設定。
-
設定を行う場合は、requestFiltering セクションを使用する。
-
requestFiltering セクションの verbs の allowUnlisted を
-
true に設定した場合、
black リスト化される(add で verb を指定、allowed を false にする)。 -
false に設定した場合、
white リスト化される(add で verb を指定、allowed を true にする)。
-
-
OPTIONS を black リスト登録した例。
<configuration>
<system.webServer>
<security>
<requestFiltering>
<verbs allowUnlisted="true">
<add verb="OPTIONS" allowed="false" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
</configuration>※ GUI(IIS マネージャ)からの設定も可能。
補足(ホワイトリストが推奨): 原文が挙げる 2 方式のうち、
allowUnlisted="false"(ホワイトリスト)が望ましい。<!-- 許可するメソッドだけを列挙する --> <requestFiltering> <verbs allowUnlisted="false"> <add verb="GET" allowed="true" /> <add verb="POST" allowed="true" /> <add verb="HEAD" allowed="true" /> <add verb="OPTIONS" allowed="true" /> <!-- CORS を使うなら必須 --> </verbs> </requestFiltering>
ブラックリスト( allowUnlisted="true")ホワイトリスト( false)新種のメソッド 素通りする 自動的に拒否 保守 危険なものを列挙し続ける必要 使うものだけ書けばよい 事故 列挙漏れ 許可漏れ(すぐ気付く)
OPTIONSを禁止すると CORS のプリフライトが壊れるため、
REST API を提供している場合は必ず許可する。
同様に、REST で PUT / PATCH / DELETE を使うなら許可が要る。応答は
404.6(Verb Denied)になる。
ログでsc-status 404/sc-substatus 6が出ていれば
この設定によるものと判別できる。
補足(WebDAV を無効化する方が確実): PUT / DELETE 等が
問題になるのは WebDAV モジュールが入っている場合である。
フィルターで塞ぐより、モジュール自体を外す方が確実。<system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer># サーバの役割ごと外す Uninstall-WindowsFeature Web-DAV-PublishingREST API で PUT / DELETE を使っていて 405 が返るという現象は、
ほぼこの WebDAV モジュールがメソッドを横取りしていることが原因である。
Web アプリケーション(ASP.NET)に対する設定。
-
*.config の handlers セクションで、HttpForbiddenHandler を設定する。
-
handlers セクションは、.NET の HTTP ハンドラに関するセクション。
-
ポイント
- 全てを禁止する場合、path="*" が使用できる。
- HTTP メソッドの指定は、verb で設定できる。
<add verb="*" path="*"
type="System.Web.HttpMethodNotAllowedHandler" />移行メモ(本文と例が食い違っている): 本文は
HttpForbiddenHandler(403 Forbidden)と述べているが、
例はHttpMethodNotAllowedHandler(405 Method Not Allowed)である。
両者は別のハンドラーなので、意図に応じて使い分ける。
ハンドラー 応答 用途 HttpForbiddenHandler403 拡張子へのアクセスを禁止( .cs、.config等)HttpMethodNotAllowedHandler405 メソッドを禁止 HttpNotFoundHandler404 存在を隠す <!-- ① メソッドを禁止する(405) --> <add verb="TRACE,OPTIONS" path="*" name="BlockVerbs" type="System.Web.HttpMethodNotAllowedHandler" /> <!-- ② 特定の拡張子へのアクセスを禁止する(403) --> <add verb="*" path="*.cs" name="BlockSource" type="System.Web.HttpForbiddenHandler" />原文の例(
verb="*" path="*")はすべてを 405 にするため、
そのまま入れるとアプリが動かなくなる。
verbを絞って書く必要がある点に注意。なお、
.cs/.config等は既定でHttpForbiddenHandlerに
割り当てられている(プリコンパイル 参照)ため、
② の設定は通常不要である。
補足(ASP.NET Core での対処/最新化): 本ページの設定は
System.Webのhandlersセクションに依存しており、
ASP.NET Core では使えない。
層 対処 IIS(前段) requestFilteringは引き続き有効(web.config)ASP.NET Core ミドルウェアで判定する ルーティング 許可するメソッドだけをマップする(推奨) // ① そもそも許可するメソッドしかマップしない(最も素直) app.MapGet("/items", ...); app.MapPost("/items", ...); // → 未定義のメソッドは自動的に 405 // ② 全体で弾く必要がある場合はミドルウェア app.Use(async (ctx, next) => { var allowed = new[] { "GET", "POST", "HEAD", "OPTIONS" }; if (!allowed.Contains(ctx.Request.Method)) { ctx.Response.StatusCode = StatusCodes.Status405MethodNotAllowed; return; } await next(); });ASP.NET Core では、ルーティングが既定で 405 を返すため、
「定義していないメソッドは通らない」状態が自然に得られる。
明示的な禁止設定が要るのは、前段の IIS / リバース プロキシか、
診断報告書への形式的な対応が必要な場合に限られる。
-
web config - Disable HTTP OPTIONS, TRACE, HEAD, COPY and UNLOCK methods in IIS - Stack Overflow
https://stackoverflow.com/questions/12131266/disable-http-options-trace-head-copy-and-unlock-methods-in-iis -
Microsoft Learn
- Request Filtering <requestFiltering>
https://learn.microsoft.com/en-us/iis/configuration/system.webserver/security/requestfiltering/ - Verbs <verbs>
https://learn.microsoft.com/en-us/iis/configuration/system.webServer/security/requestFiltering/verbs/
- Request Filtering <requestFiltering>
-
@IT > Webフォーム
- .NET TIPS [ASP.NET]特定の拡張子に対するアクセスを制限するには?
https://www.atmarkit.co.jp/fdotnet/dotnettips/117asphttp/asphttp.html - .NET TIPS [ASP.NET]特定のサービスを無効にするには?
https://www.atmarkit.co.jp/fdotnet/dotnettips/121aspconfext/aspconfext.html
- .NET TIPS [ASP.NET]特定の拡張子に対するアクセスを制限するには?
-
Handlers <handlers>
https://learn.microsoft.com/en-us/iis/configuration/system.webserver/handlers/
Tags: 移行, Windows, IIS, .NET開発, ASP.NET
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。