16

訪問者が独自の URL を作成し、ID であると思われるものを好きなものに置き換えるのに最適な方法は何ですか?

例えば:

ASP.Net MVC - 不正な URL パラメータの処理

ただし、ユーザーは URL を次のように簡単に置き換えることができます。

https://stackoverflow.com/questions/foo

すべてのコントローラー関数パラメーターを aStringにして、それらを使用Integer.TryParse()することを考えました-それが成功した場合、ID を取得して続行できます。それ以外の場合は、ユーザーを不明/未検出またはインデックス ビューにリダイレクトできます。

Stack Overflow はそれをうまく処理してくれます。私もそうしたいと思っています。

4

5 に答える 5

12

数に制約がある、あなたのようなルートの例を次に示します。

routes.MapRoute(
    "Question",
    "questions/{questionID}",
    new { controller = "StackOverflow", action = "Question" },
    new { questionID = @"\d+" } //Regex constraint specifying that it must be a number.
);

ここでは、質問 ID に少なくとも 1 つの数字を設定します。これにより、整数以外を含む URL もブロックされ、null 許容 int が不要になります。

注:これは、Int32 の範囲 (-2147483647 - +2147483647) より大きい数値を考慮していません。これは、ユーザーが解決するための演習として残します。:)

ユーザーが「questions/foo」という URL を入力すると、パラメーターの制約に違反するため、ユーザーは質問アクションにヒットせず、失敗します。必要に応じて、キャッチオール/デフォルト ルートでさらに処理できます。

routes.MapRoute(
    "Catchall",
    "{*catchall}", // This is a wildcard routes
    new { controller = "Home", action = "Lost" }
);

これにより、ユーザーは Home コントローラーの Lost アクションに送られます。ワイルドカードの詳細については、こちらを参照してください

注意: Catchall は LAST ルートとして存在する必要があります。チェーンのさらに上に配置すると、ASP.NET MVC のルートの遅延性を考慮して、その下にある他のすべてを処理することになります。

于 2008-10-26T02:14:59.413 に答える
5

ここに役立つかもしれないいくつかの有用な情報があります。アクションメソッドがある場合

public ActionResult Edit(int? id)
{}

誰かが入力した場合

/Home/Edit/23

パラメータ ID は 23 になります。

/Home/Edit/Junk

id は null になります。これはかなりクールです。キャストエラーか何かがスローされると思いました。これは、id が null 値でない場合は有効な整数であり、db とのやり取りのためにサービスなどに渡すことができることを意味します。

これにより、テスト中に見つけた情報が提供されることを願っています。

于 2008-10-26T00:08:19.030 に答える
4

ASP.NET MVC では、IActionFilter インターフェイスを実装するフィルターを定義できます。この属性でアクションを修飾して、アクションの前または後に実行されるようにすることができます。

あなたの場合、アクションの「前」に実行されるように定義します。そのため、渡されたパラメーターにエラーがある場合はキャンセルできます。ここでの主な利点は、渡されたパラメーターを一度チェックするコードを書くだけで (つまり、フィルターで定義する)、コントローラーのアクションで必要な場所で使用できることです。

MVC フィルターの詳細については、http: //haacked.com/archive/2008/08/14/aspnetmvc-filters.aspxをご覧ください。

于 2008-10-25T13:13:49.783 に答える
2

制約を正規表現として指定するか、カスタム制約を定義できます。詳細については、このブログ投稿をご覧ください。

http://weblogs.asp.net/stephenwalther/archive/2008/08/06/asp-net-mvc-tip-30-create-custom-route-constraints.aspx

ID 43243 が、IActionFilter として、またはコントローラーで直接処理できるものにマップされないという状況に対処する必要があります。

于 2008-10-25T13:30:06.687 に答える
0

このアプローチの問題は、ページにマップされない整数を渡す可能性があることです。その場合は、「foo」の場合と同様に、404 を返します。明確なセキュリティへの影響がない限り、心配する必要はありません。

于 2008-10-25T12:50:55.987 に答える