ASP.NET 內建請求驗證可防範 XSS 攻擊,但在需要接收 HTML 內容(如富文本編輯器)時必須關閉。ASP.NET 4.0 改變驗證時機,導致傳統關閉方式失效。本文解析原因並提供解決方案。
在 ASP.NET 2.0/3.5 中,於 web.config 設定 <pages validateRequest="false" /> 或頁面指令 <%@ Page ValidateRequest="false" %> 即可關閉。但在 4.0 仍會拋出:
A potentially dangerous Request.Form value was detected from the client.
IHttpHandler.BeginRequest 之前,即所有進入 ASP.NET 管線的請求(含 Web Service、HttpHandler、HttpModule)皆會驗證。ValidateRequest 設定,故頁面級設定失效。在 web.config <system.web> 區段加入:
<httpRuntime requestValidationMode="2.0" />
此設定指示 ASP.NET 使用舊版驗證邏輯,僅在頁面處理階段驗證,並尊重頁面/設定檔的 validateRequest="false"。
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false" /> <!-- 全域關閉,或在單頁指令關閉 -->
</system.web>
</configuration>
[ValidateInput(false)](需搭配上述 requestValidationMode="2.0")。[AllowHtml] 屬性(Model 層級),更精確控制。HttpUtility.HtmlEncode、Razor 自動編碼、或 AntiXSS Library)。Core 預設不啟用請求驗證,採用輸出編碼策略(Razor 自動 HTML 編碼),開發者需專注於輸出端安全,較符合現代 Web 安全觀。