ASP.NET MVC 頁面使用富文字控制元件的XSS漏洞問題
阿新 • • 發佈:2019-01-01
目前在做的專案存在XSS安全漏洞!
原因是有一些頁面使用了富文字編輯框,為了使得其內容可以提交,為相關action設定了[ValidateInput(false)]
特性:
[HttpPost]
[ValidateInput(false)]
public ActionResult MailPreview(FormCollection collection)
{
return View();
}
但問題來了,同一頁面還有其他欄位內容,現在HTML、js指令碼都能提交,不再受限,要麼提交的時候全部都檢查,否則就有XSS漏洞。我在某個文字框裡輸入<script>alert(0);</script>
所以說,千萬小心不能輕易開啟這個[ValidateInput(false)]
特性。我覺得根本就不應該開啟。可以醬紫:
public class MailVM
{
public string Title { get; set; }
public string Time { get; set; }
[AllowHtml]
public string Mess { get; set; }
}
針對這個實體類的單個欄位設定 [AllowHtml] ,這樣提交的時候,系統就會放過該欄位。
問題是,action不能使用 FormCollection 來接收提交資料,而應該使用實體類。否則[AllowHtml]特性不起作用。究其原理,這種檢查應該是系統的過濾器在攔截,你一個FormCollection,過濾器怎麼著力?所以,上面的程式碼應改為:
[HttpPost]
public ActionResult MailPreview(MailVM model)
{
return View();
}
用實體類當然沒有FormCollection靈活,不過對於這種特定場合,還是必須的。特別提一下,實體類可以只在提交的時候使用,頁面輸出時並不要求繫結實體類,頁面的文字框等控制元件,也不一定要寫成 @Html.TextBoxFor 這種形式。只需要
[HttpPost]
public ActionResult MailPreview(MailVM model)
{
……
}
系統會自動按照model來裝配提交資料。