すべての *.php、*.cgi などのリクエストをブロックするにはどうすればよいですか。IIS7 でホストされている ASP.NET MVC 1.0 アプリ内のページは?
-
20-09-2019 - |
質問
パス情報に関係なく、.php または .cgi へのリクエストをブロックしたいと考えています。
たとえば、次の URL が使用される場合:
http://私のサイト/Admin/Scripts/Setup.php
既存のルートと一致します。
routeCollection.MapRoute("Admin", "admin/{controller}/{action}/{uid}/{*pathInfo}", new { controller = "Admin", action = "Index", uid = "" });
ただし、スクリプト用のコントローラーがないため、MVC は以下をスローします。
icontrollerfactory ''は、「スクリプト」という名前のコントローラーのコントローラーを返しませんでした。
私が本当に望んでいるのは、MVC がコントローラーに到達する前に、要求が単純にハード フェイルで満たされることです。
Global.asax で Application_BeginRequest をフックし、新しい HttpException(404, "Not Found") をスローすることでこれを実行できることはわかっていますが、それは私が探しているまったくエレガントな解決策ではありません。
私はこれがうまくいくことを本当に望んでいました:
routeCollection.IgnoreRoute("{resource}.php/{*pathInfo}");
しかし、そうではありません。
注記:Sean Lynch の答えはうまく機能しますが、それでも System.Web.Routing または System.Web.Mvc ベースのソリューションが本当に欲しいです。こうすることで、ユーザーが実行時に独自の除外を追加できるようになります。
解決
あなたがホスティングした場合、プロバイダはその後、IIS7 URL書き換えモジュールをサポートしていますが、このリンクをチェックアウトすることができます:
http://learn.iis.net /page.aspx/499/request-blocking---rule-template/する
ここでの更新は、あなたがsystem.webserverセクションであなたのweb.configファイルに入れてしまうものです。
<system.webServer>
<rewrite>
<rules>
<rule name="RequestBlockingRule1" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{URL}" pattern="*.php*" />
</conditions>
<action type="CustomResponse" statusCode="403" />
</rule>
</rules>
</rewrite>
</system.webServer>
他のヒント
これが古い投稿であることは承知していますが、サブフォルダー内のリクエストを含むphpリクエスト(およびその他のリクエスト)の無視ルートを探している場合は、以下のコードがうまく機能することがわかりました( Phil Haack からの投稿のルートを無視する)
また、時折発生する Apple タッチ アイコン リクエストに対する特定の無視ルートを追加し (さまざまなサイズにワイルドカードを使用)、ファビコンのさまざまなファイル拡張子を許可しました (Google ツールバーや他のブラウザーは、 PNG と GIF のファビコン).
もちろん、すべての画像ファイル拡張子に対して無視ルートを追加することもできますが、私の場合は、それでも他のリクエストの一部をルーティングしたいと考えています。
routes.IgnoreRoute("{*allphp}", new { allphp = @".*\.php(/.*)?" });
routes.IgnoreRoute("{*allcgi}", new { allcgi = @".*\.cgi(/.*)?" });
routes.IgnoreRoute("{*allaspx}", new { allaspx = @".*\.aspx(/.*)?" });
routes.IgnoreRoute("{*favicons}", new { favicons = @".*favicon\.(ico|gif|png)(/.*)?" });
routes.IgnoreRoute("{*allappleicon}", new { allappleicon = @"apple-touch-icon-.*\.png(/.*)?" });
これらの無視ルートがあるにもかかわらず、アクセス権がある場合は、PHP ファイルのリクエスト ブロックを使用することが望ましいと考えています。
見つけました asp.netフォームのURLルーティングでルートを無視する方法 これはこれでうまくいくかもしれません。 StopRoutingHandler クラスであり、.php へのリクエストがルーティングを介して実行される限り、これはおそらく機能します。
.php リクエストがルーティング ハンドラーを経由しない場合、これはおそらく機能しません。
あなたはこれらの拡張機能をブロックすることができます。