URLからパラメーターとして文字列を受け取るMVC4.NETアプリケーションにコントローラーがあります。これは、Route.config
のコントローラーにリダイレクトされたaspxページからのものです。
クライアントのパラメーターにこの値を送信すると、次のようになります。fwdgerhb+bhrth+ftrgbhrt
サーバーで次の値を取得します:fwdgerhb bhrth ftrgbhrt
サーバーはURLパラメーター値をエンコードされたURLとして解釈し、+
を。に置き換えます。ただし、URLエンコードされていません。これは、特別な文字の他の組み合わせがパラメーター値に含まれている場合に発生します。
IISサーバーにこの値をURLデコードしないようにサーバーを構成するための構成パラメーターはありますか?
リクエストの例:
mypage.aspx?value=cat+dog (NOT ENCODED)
ルート構成
static void RegisterRoutes(RouteCollection routes)
{
routes.MapRouteLowercase(
name: "MyRouter",
url: "mypage.aspx",
defaults: new { controller = "My", action = "DoLog" }
);
}
コントローラー:
public class MyController : Controller
{
[AllowAnonymous]
public ActionResult DoLog(string value)
{
//Here value has "cat dog"
}
}
はい、MVCはアクションパラメーターを自動的にURLデコードしますが、クエリ文字列を介してURLエンコードされたバージョンにアクセスできます。この質問でわかるように: MVC2 ASP.Net URLDecodingは自動的に実行されますか?
UNENCODED_URLという名前のサーバー変数にアクセスすることもできます。このシナリオの詳細については、次を参照してください。 RL書き換えモジュール構成リファレンス
以下を使用して、コントローラーからクエリ文字列を手動で取得できます。
Request.QueryString.Get("value");
または、ビューから取得するには:
Html.ViewContext.HttpContext.Request.QueryString.Get("value");
しかし、正直なところ、ルーティングを介して送信する前に、文字列を自分でエンコードしてみませんか。
HttpUtility.UrlEncode(value);
そして、値を再度取得すると、次のようになります。
HttpUtility.UrlDecode(value);
そうすれば、文字列を制御できます
更新
次の手順を実行して、routeConfigで「+」属性を許可することもできます。
<location path="CustomHttpHandler">
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
</location>
これをオンまたはオフにすることの浮き沈みを説明する質問があります: ダブルエスケープを有効にすることは危険ですか?