用了好多年的線上班會紀錄,前幾天有老師反應輸入資料之後,會出現錯誤訊息,就像第二張圖那樣的錯誤訊息!

具有潛在危險 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 的錯誤畫面。

不過這是針對整個網站做這樣的防護措施,我並沒有測試用這個方法,有興趣的人可以嘗試看看。

 

文章標籤
全站熱搜
創作者介紹
創作者 iron17kimo 的頭像
iron17kimo

高級資深低薪程式設計師

iron17kimo 發表在 痞客邦 留言(0) 人氣(4,551)