12

通常、ASP.Net MVC アプリケーションを見ると、Route テーブルは起動時に構成され、その後は変更されません。

それについていくつか質問がありますが、それらは互いに密接に関連しています。

  • 実行時にルート テーブルを変更することは可能ですか?
  • スレッド化の問題を回避するにはどうすればよいですか?
  • 動的 URL を提供するためのより良い方法はありますか? ID などが URL に表示される可能性があることは知っていますが、これが達成したいことにどのように適用できるかわかりません。
  • デフォルトのコントローラー/アクション ルートを定義していても、そのデフォルト ルートが特定の組み合わせで機能しないことを回避するにはどうすればよいですか。

背景:コメント スパマーは通常、Web サイトから投稿 URL を取得し、自動スパムを実行するために Web サイトを経由することはありません。投稿 URL を定期的にランダムな URL に変更すると、スパマーはサイトに戻って正しい投稿 URL を見つけてスパム行為を試みる必要があります。その URL が頻繁に変更されると、スパマーの作業がより退屈になる可能性があると思います。つまり、通常は、影響を受ける URL を諦めることになります。

4

2 に答える 2

12

独自の IRouteHandler を実装し、カスタム ロジックをカスタム ControllerActionInvoker に配置することを検討します。それはどのように機能しますか?ルート テーブルは動的に変更されませんが、カスタム ControllerActionInvoker でルート パスのランダム パラメータをチェックインし、対応するアクションを呼び出すかどうかを指定できます。

私のルート:

routes.Add 
( 
    new Route 
        ( 
            "blog/comment/{*data}", 
            new RouteValueDictionary(new {controller = "blog", action = "comment", data = ""}), 
            new MyRouteHandler() 
        ) 
); 

私の I ルートハンドラ:

    class MyRouteHandler : IRouteHandler 
{ 

public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
        return new MyHttpHandler(requestContext); 
    } 
}`

私のハンドラ:

class MyHttpHandler : MvcHandler 
{ 
    public MyHttpHandler(RequestContext requestContext) : base(requestContext) 
    { 
    } 

    protected override void ProcessRequest(HttpContextBase httpContext) 
    { 
        IController controller = new BlogController(); 
        (controller as Controller).ActionInvoker = new MyActionInvoker(); 
        controller.Execute(RequestContext); 
    } }`

そして、アクションを処理するかどうかのカスタムロジックをコーディングする必要がある私のアクションivoker:

    class MyActionInvoker : ControllerActionInvoker 
{ 
    protected override ActionResult InvokeActionMethod(MethodInfo methodInfo, IDictionary<string, object> parameters) 
    { 

        var data = ControllerContext.RouteData.GetRequiredString("data"); 


 // put my custom logic to check whetever I'll handle the action or not. The data could be a parameter in the database for that purpose.

        return base.InvokeActionMethod(methodInfo, parameters); 
    } 
} 

それが最善の解決策かどうかはわかりませんが、今のところ、それが私の頭に浮かぶものです。

于 2010-03-29T09:38:16.150 に答える
4

実際の問題の背景を考慮すると、通常のアプローチは、動的に作成されたトランザクション番号を含めることです。非表示のフォーム フィールドとサーバー側のセッション ディクショナリに格納する必要があり、厳密に 1 つの要求に対してのみ有効です。

今日、多くのフレームワークがこのようなセキュリティ メカニズムを提供していると思います。一方、この攻撃の種類は、クロスサイト リクエスト フォージェリ (csrf) として知られています。

于 2014-08-07T15:56:56.690 に答える