2012年9月29日 星期六

關於從客戶端中檢測到有潛在危險的 Request.Form 値」之問題

不曉得什麼原因,如果要讓Input可以輸入Html,只需要在頁面上輸入EnableEventValidation="false"即可讓使用者輸入Html
但今天卻碰到,只是輸入EnableEventValidation="false"無效,Google了一下發現,只是輸入這樣原本就是無效的,不曉得為什麼在MoneySave中這樣可以通過
正確的應該是要在頁面上輸入ValidateRequest='false' EnableEventValidation="false"

如下
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Index.aspx.cs" Inherits="Index" ValidateRequest='false'  EnableEventValidation="false"%>


並且在WebConfig加上以下這段才行

  <system.web>
    <httpRuntime requestValidationMode="2.0" />
  </system.web> 


不過隨著這個打開,也就打開了網頁的被攻擊的大門
如果是搜尋的話,我們使用paramater的方式可以解決
如果是輸入的話,限制輸入的長度也可以避免一些簡單攻擊(還是可以透過proxy的方式來攻擊)
但如果是輸入的Note欄位,不限字數時,那們如果有人是輸入了

<p>test
<img src=""INVALID-IMAGE" onerror='location.href="http://www.yahoo.com.tw/"'>!</p>


(上面那段換行的原因,是因為程式碼的大於符號,在網址後面不曉得什麼原因會轉不回來)
則你會發現顯示那篇文章的頁面在進入後,就會直接轉向www.yahoo.com.tw
因此要更安全的作法就是要將輸入欄位加上
Server.HtmlEncode(edtNote.Text)
這樣使用者輸入html會被轉成文字型態呈現於頁面上
如果像可以輸入網址欄位的話加上上述措施,看起來似乎沒有問題,但實際上還不清楚是否會有漏洞產生
順道一題,如果是網址欄位,如果使用者沒有輸入http://的話,會無法正確連到想要的網址
必須多一道工去補上

string WebSite = "www.yahoo.com.tw";
 if (WebSite != "")
 {
         if (WebSite.IndexOf("http://") == -1)
         {
             WebSite = "http://" + WebSite;
         }
 }
 Label1.Text = WebSite;

關鍵字
限定 html EnableEventValidation="false"
requestValidationMode
偵測 textbox html

參考文章
http://www.coffnet.com/a/xy/20120514/957.html
http://www.cftea.com/c/2011/05/O7TRAOUPLFO8BQKB.asp
http://www.dotblogs.com.tw/jimmyyu/archive/2010/02/28/aspnet-40-extensible-request-validation.aspx
http://hi.baidu.com/sucheng1031/item/b3dc060c74a4107cbee97e58
http://demo.tc/Post/732
http://www.chen-qi.com/?p=331

補充說明
如果有時候使用者輸入了Html我們卻想得到不含Html的乾淨字串,可以用正則表達式做處理
可以參考以下文章
http://demo.tc/Post/281
http://demo.tc/Post/634

沒有留言:

張貼留言