2011-01-31 2 views
3

パラメタとURLの間に%20という文字が表示されると、MVCルーティングは文字列を考慮しなくなります。%20の後にスラッシュとそれに続くデータが続くと、ASP.NET MVC 3のルーティングが失敗します。

どうして私のURLの "%20"文字の処理にアプローチできますか?

例URL

http://localhost:40494/ListContents/Delete/asdf%20/5430f394... 

public ActionResult Delete(string DNSName, Guid id) 
{...} 

routes.MapRoute(
    "Delete", // Route name 
    "ListContents/Delete/{DNSName}/{id}", // URL with parameters 
    new { controller = "ListContents", action = "Delete" } // Parameter defaults 
    ); 

しかし 次のURLの両方が細かい

http://localhost:40494/ListContents/Delete/asdf%20SOMETHING_HERE/5430f394... 

http://localhost:40494/ListContents/Delete/%20asdf/5430f394-946c-4f82-ac13-9d5efafe9127 

答えて

3

次のスラッシュの前にURLの任意のセクションの最後に空白がある場合は、System.Web.Util.FileUtil.CheckSuspiciousPhysicalPath()メソッドでHttpExceptionをスローします。このメソッドはMVCによって処理され、HTTP 404応答が返されます。あなたは空のスペースを持つべきではない一般

  1. Visual Studio
  2. Debug
  3. Exceptions
  4. Common Language Runtime Exceptions

はあなたにはThrowのチェックボックスをチェックすることで、自分自身ことを確認することができますあなたのURL。私は個人的に私のURLをフォーマットし、すべてのスペースはダッシュ( - )になります。

+0

これは私が見ているのと同じものであるかどうかをデバッグして見なければなりません。私が持っているスペースは2番目のパラメータのバックスラッシュの前です。 – LamonteCristo

+0

スラッシュの前に空白があるURLのどのセクションでも、私の答えは少し変わった。興味深い。 –

+0

私はMVCの物理パス、データベースの変数だけを扱っているわけではないので、これは有効か有用なチェックですか?おそらくXSSチェックがここでより効果的かもしれません。 – LamonteCristo

0

を働く私は「問題はそれができるので、それが動作しない例であるということだと思います有効なURLとして解析されると、

http://localhost:40494/ListContents/Delete/asdf /5430f394...

代わりに、安全にそのURLから%20を削除するだけで安全です。

+0

別のページの 'HTML.ActionLink'によって自動的に生成されるため、そのスペースがあります。スペースはバッキングデータベースから来ます。これが私のページの残りの部分で起こらないようにする最良の方法は何ですか? – LamonteCristo

+0

@ makerofthings7:URL文字列を検索し、 '%20'の前後に'/'がないことを確認してください - これは私の推測です。私は現時点ではより良い方法を確信していません。 – VoodooChild

0

テーブルのidフィールドが文字列(nchar(x))でないか確認してください。その場合、それぞれのIDが型宣言で定義された正確な長さを持つかどうかを確認します。そうでない場合(文字数が少ない場合)、それが問題です(宣言された長さが間違っているはずです)。これは私のために働いた。

関連する問題