目前在作的項目存在XSS安全漏洞!安全
緣由是有一些頁面使用了富文本編輯框,爲了使得其內容能夠提交,爲相關action設置了[ValidateInput(false)]
特性:markdown
[HttpPost]
[ValidateInput(false)]
public ActionResult MailPreview(FormCollection collection)
{
return View();
}
但問題來了,同一頁面還有其餘字段內容,如今HTML、js腳本都能提交,再也不受限,要麼提交的時候所有都檢查,不然就有XSS漏洞。我在某個文本框裏輸入<script>alert(0);</script>
,提交成功後,頁面展現提交內容,竟然執行了!spa
因此說,千萬當心不能輕易開啓這個[ValidateInput(false)]
特性。我以爲根本就不該該開啓。能夠醬紫:code
public class MailVM
{
public string Title { get; set; }
public string Time { get; set; }
[AllowHtml]
public string Mess { get; set; }
}
針對這個實體類的單個字段設置 [AllowHtml] ,這樣提交的時候,系統就會放過該字段。orm
問題是,action不能使用 FormCollection 來接收提交數據,而應該使用實體類。不然[AllowHtml]特性不起做用。究其原理,這種檢查應該是系統的過濾器在攔截,你一個FormCollection,過濾器怎麼着力?因此,上面的代碼應改成:ip
[HttpPost]
public ActionResult MailPreview(MailVM model)
{
return View();
}
用實體類固然沒有FormCollection靈活,不過對於這種特定場合,仍是必須的。特別提一下,實體類能夠只在提交的時候使用,頁面輸出時並不要求綁定實體類,頁面的文本框等控件,也不必定要寫成 @Html.TextBoxFor 這種形式。只須要get
[HttpPost]
public ActionResult MailPreview(MailVM model)
{
……
}
系統會自動按照model來裝配提交數據。string