ASP.Net MVC-無効なURLパラメーターの処理
-
04-07-2019 - |
質問
訪問者が独自のURLを作成し、IDになりたいものを好きなものに置き換えるための最良の方法は何ですか?
例:
ただし、ユーザーはURLを次のように簡単に置き換えることができます。
https://stackoverflow.com/questions/foo
すべてのコントローラー関数パラメーターを String
にし、それらに Integer.TryParse()
を使用することを考えました-それが成功した場合、IDがあり、続行します。それ以外の場合は、ユーザーをUnknown / not-foundまたはindexビューにリダイレクトできます。
Stack Overflowはそれをうまく処理しますが、私もやりたいと思います-どのようにそれを行いますか、または何を提案しますか?
解決
これは、番号に制約があるあなたのようなルートの例です:
routes.MapRoute(
"Question",
"questions/{questionID}",
new { controller = "StackOverflow", action = "Question" },
new { questionID = @"\d+" } //Regex constraint specifying that it must be a number.
);
ここでは、questionIDに少なくとも1つの番号を設定します。これにより、整数以外を含むURLもブロックされ、null可能なintが不要になります。
注:これは、Int32の範囲(-2147483647-+2147483647)より大きい数値を考慮しません。私はこれを解決するための演習としてユーザーに任せます。 :)
ユーザーがurl" questions / foo"を入力すると、パラメーターアクションに失敗するため、ユーザーは質問アクションにヒットせず、そのアクションに失敗します。必要に応じて、キャッチオール/デフォルトルートでさらに処理できます。
routes.MapRoute(
"Catchall",
"{*catchall}", // This is a wildcard routes
new { controller = "Home", action = "Lost" }
);
これにより、ユーザーはホームコントローラーのロストアクションに送られます。ワイルドカードの詳細については、こちらをご覧ください。 。
NB:CatchallはLASTルートとして存在する必要があります。 ASP.NET MVCのルートのレイジーな性質を考えると、チェーンのさらに上に配置すると、その下にある他のすべてを処理します。
他のヒント
ここで役立つ役立つ情報をいくつか紹介します。 アクションメソッドがある場合
public ActionResult Edit(int? id)
{}
その後、誰かが入力した場合
/Home/Edit/23
パラメータIDは23です。 ただし、誰かがを入力した場合
/Home/Edit/Junk
then idはnullになり、かなりクールです。私はそれがキャストエラーか何かを投げると思った。 idがnull値でない場合、それは有効な整数であり、db相互作用のためにサービスなどに渡すことができることを意味します。
これにより、テスト中に見つけた情報が提供されることを期待してください。
ASP.NET MVCでは、IActionFilterインターフェイスを実装するフィルターを定義できます。この属性を使用してアクションを装飾し、アクションの実行前、実行前、実行後に実行できるようになります。
あなたの場合、「前に」実行されるように定義します。あなたの行動。そのため、渡されたパラメーターにエラーがある場合は、キャンセルすることができます。ここでの主な利点は、渡されたパラメーターを一度だけチェックするコードを記述し(つまり、フィルターで定義する)、コントローラーアクションの任意の場所で使用することです。
MVCフィルターの詳細については、 http:// haackedをご覧ください。 com / archive / 2008/08/14 / aspnetmvc-filters.aspx
制約を正規表現として指定するか、カスタム制約を定義できます。詳細については、このブログ投稿をご覧ください:
ID 43243がIActionFilterとして、またはコントローラーで直接処理できるものにマップされない状況に対処する必要があります。
このアプローチの問題は、ページにマップされない整数を渡す可能性があることです。 " foo"の場合と同じように、もしそうなら404を返します。セキュリティに明確な影響がない限り、心配する必要はありません。