用了好多年的線上班會紀錄,前幾天有老師反應輸入資料之後,會出現錯誤訊息,就像第二張圖那樣的錯誤訊息!
具有潛在危險 Request.Form 的值已從用戶端 (ctl00$ContentPlaceHolder1$DetailsV......... 偵測到。
原來這個程式是用VS 2012 C#來開發的,而2012用的是FrameWork4.0,這個機制就會有一個防止惡意攻擊的基本防治功能
而這位老師,可能在網路上去下載會議紀錄然後直接貼到textbox裡面,造成文字內有HTML的語法,所以Frame work4就阻擋這樣的寫法
google了之後發現,.net為了防止XSS (Cross Site Script)攻擊,
頁面在postback之後,如果表單欄位內有包含了 html tag / javascript 的話,ASP.NET就會出現下列這種錯誤訊息
為了解決這個問題,參考了一下google大師,發現真的還有類似的問題,所以就參考這樣的方式,改了我的程式碼,之後就一切ok!~
https://dotblogs.com.tw/chris0920/2011/07/20/31857
接下來我就做了兩件事情
第一步、關掉網路驗證的功能:
在web.config中增加 <httpRuntime requestValidationMode="2.0"/>
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0"/>
</configuration>
第二步、在aspx加入 validateRequest="false"
<%@ Page Language="C#" AutoEventWireup="true" validateRequest="false" %>
這樣就能把這種防攻擊的偵側給關掉。
第三步、但是只有把防護機制關掉還不夠,要手動機上編碼之後再寫入到資料庫,增加安全性
HttpUtility.HtmlEncode(textbox1.text)
HttpUtility.HtmlDecode(textbox1.text)
這樣就可以解決這個問題。
後來大師也有寫到另外一種寫法,就是在
透過 global.asax中的 application_error 來 catch System.Web.HttpRequestValidationException
step1. 在 global.asax 中找到 application_error 的事件,並加入
if (Server.GetLastError().GetType().ToString() == "System.Web.HttpRequestValidationException")
{
Response.Write("HttpRequestValidationException");
}
Server.ClearError();
之後發生 error 時,就會做指定的事,操作者也不會看到 .net 的錯誤畫面。
不過這是針對整個網站做這樣的防護措施,我並沒有測試用這個方法,有興趣的人可以嘗試看看。
