具有潛在危險 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是一個欄位。
參考資料: