2012-01-10 30 views
10

のHtmlEncode私はHtml.TextAreaForコントロールを持つASP.Net MVC 3ページを持っています。以下のコードを参照してください。私のような角括弧内のテキストとHTTPのPOSTアクションにページを送信しようとした場合:<test>、私は黄色のエラー画面を取得すると言って:ASP.Net MVC 3 Html.TextAreaFor

を潜在的に危険のRequest.Form値が クライアント(RequestTextから検出されました= "")。

私はネット4に新しい<%: %>構文を言うan article by Scott Guthrieは、自動的に要素をHtmlEncodeます見つけたので、私はこれを取得していますなぜ私は理解していません。私は<%:%>構文をHtml.TextAreaForコントロールに使用しているので、自動的にこれを処理し、山括弧を適切な "& lt"に変換します。 「& gt」の文字列です。

<% using (Html.BeginForm()) 
    { %> 
    <%: Html.ValidationSummary() %> 
    <h2>Enter a description of the support needed</h2> 
    <%: Html.TextAreaFor(m => m.RequestText, 4, 90, null) %> 
    <input type="submit" value="Submit" /> 
<% } %> 

答えて

18

は、基本的には、今、あなたは出力TextAreaForの内容をコードしています。あなたは入力に対処しようとしているので、これは少しもあなたを助けていないあなたが「潜在的に危険な」コンテンツを提出したい場合は

は、あなたはどちらか

1)内RequestTextプロパティを飾るために必要がありますあなたのViewModelは[AllowHtml]です。 (推奨)

[AllowHtml] 
public string RequestText { get; set; } 

2)次に、あなたあなたのリポジトリ層にそれを提出する前に、あなたが適切にそのデータを消毒および/またはあなたのコントローラでそれをコードしていることを確認しなければならないvalidateRequest

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <httpRuntime requestValidationMode="2.0" /> 
</system.web> 

を無効にしますか、データベース。

+0

チェイス - 私はむしろ[AllowHtml]を使用しないで、コントローラアクションにポストバックするときに.netフレームワークhtmlでテキストをエンコードする方法はありませんか? –

+1

コントローラーで手動でエンコードします。これは、エンコードされていないデータをポストしたくないデータレイヤーです。コントローラーレベルでこれを処理する必要があります。 –

+0

基本的にHTMLはデータをエンコードできません。 Javascriptを使用することはできますが、単にJSを無効にできるだけであるため、悪いことです。これを行うための唯一の確実な方法は、クライアントレベルではなくサーバーレベルです。 –

6

あなたはAllowHtmlAttributeとビューモデルにあなたのRequestTextプロパティを飾ることができます:

[AllowHtml] 
public string RequestText { get; set; } 

この方法では、このプロパティだけのためにHTMLを提出するクライアントを許可されています。

<%: %>シンタックスに関する限り、この値はHTMLページに出力する前にHTMLエンコードに使用されます。これは、XSS攻撃から保護するために使用されます。あなたがページに出力していないため、あなたの要求にHTML文字を受け取っているので、あなたのケースでは無関係です。

+0

'@ Html.Raw(model.RequestText)'を使用する必要がありますか?または内部のMVCフレームワークはレンダリング中に注意を払うでしょうか? –