具有潛在危險 Request.Form 的值已從用戶端 偵測到

 

當在ASP.NET MVC遇到「具有潛在危險 Request.Form 的值已從用戶端 偵測到」問題時,

此為對XSS問題作保護機制,ASP.NET MVC環境預設為不允許使用者輸入敏感的特殊字元,

如果你的網站是要設計給使用者自行編輯文章的話,

則可能會適當允許使用者於指定欄位輸入敏感的特殊字元,

以下介紹三種作法

一、對指定Action允許輸入特殊字元

先準備Model為

using System.Web.Mvc;

namespace WebApplication1.Models
{
    public class Class1
    {
        public string id { set; get; }
        public string name { set; get; }
    }
}

Controller為

using System.Web.Mvc;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Index(Class1 Class1)
        {
            return View();
        }
    }
}

View為

<form action="@Url.Action("Index")" method="post">
    <input type="text" name="id" value="" />
    <br />
    <input type="text" name="name" value="" />
    <input type="submit" value="send" />
</form>

所添加的ValidateInput(false)屬性(黃底部份),

其作用就是「對指定Action允許輸入特殊字元」。

這樣的結果就是Class1的id與name屬性皆可輸入特殊字元。

 

二、對特定屬性允許輸入特殊字元

承上例,或許不需要Action裡所有屬性都允許輸入特殊字元,

應可縮小範圍只允許特定屬性輸入特殊字元,則對Model的Class1做修改,

using System.Web.Mvc;

namespace WebApplication1.Models
{
    public class Class1
    {
        public string id { set; get; }
        [AllowHtml]
        public string name { set; get; }
    }
}

所添加的AllowHtml屬性(黃底部份),

其作用就是「對特定屬性允許輸入特殊字元」。

這樣的結果就是只有Class1的name屬性可輸入特殊字元。

 

三、於特定Action,從request中的指定參數允許輸入特殊字元

於Model的Class1類別,特別將name屬性從屬性修改成欄位,

目地是讓name屬性喪失驗證功能

using System.Web.Mvc;

namespace WebApplication1.Models
{
    public class Class1
    {
        public string id { set; get; }
        public string name;
    }
}

Controller改成

using System.Web.Mvc;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(Class1 Class1)
        {
            var rawComment = Request.Unvalidated.Form["name"];
            return View();
        }
    }
}

「Request.Unvalidated.Form["name"];」作用為,

特別去把request中的name參數挑出來,並允許輸入特殊字元,

前提是Class1類別的name是一個欄位。

 

參考資料:

屬性(Property)與欄位(Field)的差別

Request Validation in ASP.NET

Security Extensibility in ASP.NET4.pdf