1. 程式人生 > >ASP.NET MVC 頁面使用富文字控制元件的XSS漏洞問題

ASP.NET MVC 頁面使用富文字控制元件的XSS漏洞問題

目前在做的專案存在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來裝配提交資料。