ASP.NET 4 validateRequest 失效的解法(較安全版
- 2011-12-21
- 38504
- 0
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版了唷)
回應討論