2012-03-20 9 views
7

現在、私たちはASP.NET MVCプロジェクトのXSSに関するいくつかの問題を扱っています。私は2つの問題を発見しました - 最初のものはリクエストの検証パターンと関係しています。攻撃者はこのセキュリティホールを使用して、データベースの不正なコンテンツを削除することができます。標準のHtml.DisplayTextFor()にHTMLエンコーディングはありませんか?

第2の問題は、このコンテンツをどのように表示するかで、Html.DisplayTextForメソッドを使用することで、「破損している」ようです。

だけにHomeControllerでこれを入れて、新しいMVC 3 WebAppのを作成します。

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Message = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"; 

     User foo = new User(); 
     foo.Name = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"; 

     return View(bla); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

public class User 
{ 
    public string Name { get; set; } 
} 

ビュー:DisplayTextForの

@Html.TextBoxFor(m => m.Name) <br/> ||| <-- will be encoded 

@Html.Encode(ViewBag.Message)<br/> ||| <-- will be double encoded 

@Model.Name <br/> ||| <-- will be encoded 

@Html.DisplayTextFor(m => m.Name) <-- no encoding 
<br/> ||| 

出力は、文字列全体<script xss="" src="htpp://ha.ckers.org/css.js">

質問になりますバグ、機能、または私はそれを間違って使用していますか?

答えて

2

Html.DisplayTextForは、実際には[DisplayFormat]属性(see MSDN)と対話するためのものです。

安全でない値を使用している場合は、このことに気づき、プロパティで [DisplayFormat(HtmlEncode = true)]を使用する必要があります。

編集:HtmlEncodeプロパティが実際にDataAnnotationsModelMetadataProvider(およびDisplayTextFor)によって強制されていないように見えます。

+0

したがって、値が不正確な単純な文字列を出力したいだけで、DisplayFormat属性ですべてのプロパティをデコレートしたくない場合は、DisplayTextForではなく@ Model.Nameを使用する必要があります。基本型(string/int/double/...)の既定の動作をオーバーライドすることは可能ですか? –

+0

'@ Model.Name'は単純なケースに最適です。基本型については、明示的に 'ToString()'を明示的に呼び出して、書式または書式プロバイダを指定することができます。 @Model.Number.ToString( "N") ' – bhamlin

+0

[DisplayFormat(HtmlEncode = true)]属性を使用すると、DisplayTextForの値がまだエンコードされていないのではないでしょうか?私はちょうど私のモデルの "名前"プロパティに配置します。他に何か必要はありますか? –

関連する問題