現在、私たちは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">
質問になりますバグ、機能、または私はそれを間違って使用していますか?
したがって、値が不正確な単純な文字列を出力したいだけで、DisplayFormat属性ですべてのプロパティをデコレートしたくない場合は、DisplayTextForではなく@ Model.Nameを使用する必要があります。基本型(string/int/double/...)の既定の動作をオーバーライドすることは可能ですか? –
'@ Model.Name'は単純なケースに最適です。基本型については、明示的に 'ToString()'を明示的に呼び出して、書式または書式プロバイダを指定することができます。 @Model.Number.ToString( "N") ' – bhamlin
[DisplayFormat(HtmlEncode = true)]属性を使用すると、DisplayTextForの値がまだエンコードされていないのではないでしょうか?私はちょうど私のモデルの "名前"プロパティに配置します。他に何か必要はありますか? –