web-dev-qa-db-ja.com

「パスに不正な文字」を許可するにはどうすればよいですか?

次のような1つのルートを持つMVC.NETアプリケーションがあります。

routes.MapRoute("member", "member/{id}/{*name}", new { controller = "member", action = "Details", id = "" }, new { id = @"\d+" });

したがって、リンクは次のようになります。 http:// domain/member/123/any_kind_of_username

これは一般的には正常に機能しますが、パスに不正な文字が含まれている場合(たとえば、double qoute: http:// domain/member/123/my _ "user" _name)、 "System.ArgumentException:Illegalパス内の文字。」

多くのグーグルの後、最良の提案は、URLにそのような文字が含まれていないことを確認することであるようです。残念ながら、この場合、それは私の制御不能です。

これを回避する方法はありますか?

19
hbruce

スコット・ハンゼルマンは、 パスに不正な文字を許可することについての良い要約を投稿しました。

制限されている文字を本当に許可する場合は、web.configを編集してリストから削除します(これはおそらく.NET 4およびIIS7でのみ機能します)。

<system.web>
    <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" />
</system.web>

hbruceが提案するように する必要があるかもしれません:

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

400の「BadRequest-InvalidURL」メッセージが表示されるため、機能しない特定のパス(/ search /%など)がまだいくつかあります。私が見つけた唯一の回避策は、その部分をクエリ文字列として使用することです:/ search?q =%上記の手順で。

9
bkaid

Web.ConfigのrequestFilteringにallowDoubleEscaping = "false"を設定することで、これを回避できることがわかりました。つまり:

<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="false" />
    </security>
  </system.webServer>
</configuration>

おそらく完璧な解決策ではありませんが(より良い解決策の提案は大歓迎です)、それは問題を解決します。

4
hbruce

送信する前に、クライアント側でURLをURLエンコードする必要があります。 rlHelper.Encodeメソッドを使用してみてください。

0
Vince Bowdren