這是一個比較常見的問題了,如果Web表單中有輸入類似於 Html 標簽之類的文本,在通過 Request.QueryString 或者 Request.Form 傳遞這些值的時候,就會觸發這樣的異常,出於腳本注入等安全性考慮,這也是合情合理的。
先簡單的說說 Request.QueryString 和 Request.Form 吧,
Request.QueryString(取得地址欄參數值),獲取地址欄中的參數,意思就是取得 Url ”?"號后面的參數值.如果參數有多個就用 ”&” 符號連接起來。
取值:Request.QueryString["Url地址欄中的參數名稱"]
Request.Form(取得表單參數值),獲取提交的Form中的元素的值。
取值:Request.Form["表單元素的name屬性名稱"]
一般情況下,程序應盡量過濾掉,或者禁止表單上類似文本的輸入,如果業務上非得有這樣的要求,需要輸入標簽性的文本,可以考慮在數據向服務器端傳遞前,將一些敏感字符按照約定規則替換掉,向客戶端輸出時,再還原出原始文本。比如把 "<" 替換成 "<",向客戶端輸出時,再把"<" 替換成 "<"。
以上是個人認為比較正確的做法,當然就解決眼前問題而言,如果是Asp.Net WebForm應用程序,就是在 aspx 文件的 page 指令上添加 ValidateRequest=false 屬性值,這是對單一表單的做法,要想作用於更廣泛的Web表單,自然是在 webconfig 文件中做相同的設置。
另外,如果是Asp.Net MVC應用程序,
Framework4.0:
則需要在webconfig文件的 <system.web> 配置節中加上 <httpRuntime requestValidationMode="2.0"></httpRuntime> 配置(如果已存在 <httpRuntime /> 節點,只需在其中添加屬性 requestValidationMode="2.0" 。),之后,再在 Controller(作用於整個控制器) 或者 Action(作用於單個方法) 頭上添加 [ValidateInput(false)] 的標識,區別大家都知道的,作用域不同而已,這里說的 Asp.Net MVC 是基於 Framework4.0 的環境的,Framework3.5 下沒試過,想來差不多。
Framework4.5:
其實 Framework4.5 下也差不多,只不過 VS 自動生成的 webconfig 配置文件中的 <httpRuntime /> 節點中添加了 Framework 的版本號而已,用法一樣,只需在其中添加屬性 requestValidationMode="2.0"(<httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>),之后,再在 Controller(作用於整個控制器) 或者 Action(作用於單個方法) 頭上添加 [ValidateInput(false)] 的標識即可。