demoshop

demo, trying to be the best_

demo 自從開始玩 ASP.NET MVC 以後已經很久沒有寫那麼新的 web form 專案了(能用 4.0 的我都叫他用MVC)這次一寫當然就很自然的會遇到頁面要傳 HTML 到程式的案例,也很合理的會先遇到一下 validateRequest=false 沒有效果的問題,上網搜尋了解法赫然發現有90%的網友都用了很可怕的解決方案,原本只是發在 G+ 和 FB 但是覺得好像是有義務提醒大家,所以刻意又發了一篇文章。

●因為 ASP.NET 4.0 對於頁面到的驗證範圍提高到所有的 Request ,所以從 BeginRequest 就會遇到驗證,並不是和 2.0 一樣只有驗證頁面,所以即使你關閉了頁面的驗證依然是會發生錯誤。

具有潛在危險 Request.Form 的值已從用戶端 (UC11$TextBox1="<a") 偵測到。

●上網一搜才看到原來很多人都這樣用.....都會建議解決方案為修改 web.config

<httpRuntime requestValidationMode="2.0" /> 

讓驗證回到 2.0 的方式,乍看之下問題是解決了,但這是一項非常不明智的作法,實務上的使用不可能每一頁都需要讓使用者輸入 HTML 你可能只有一頁要用,但是你卻開了全世界!

你會因為要把東西放進冰箱就把冰箱門拆了嗎?


●較安全的作法應該是限定頁面來開放,利用 location 來達到限定頁面的開放,範例如下

<location path="admin/htmleditor.aspx">
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
</location>

這樣子方便與安全才能得到一個平衡點

 

PS 這樣一開指定的那頁,就會變得不安全,請特別針對該頁的所有寫入欄位做安全性檢查,比如說使用 AntiXss 套件(它可是已經到了 4.1版了唷)

回應討論