2012年8月10日 星期五

validateRequest X JavaScript注入攻擊 X Jquery解法

不管老鳥菜鳥小小鳥,一定看過這個

沒錯,這就是 ASP.NET ValidateRequest 機制

他不允許提交的表單中有特殊的腳本字符

理由是防止 JavaScript注入攻擊 XSS攻擊 等等 (詳情估狗)

但是有時候不得不接收這些字符的提交,因為如果是個留言框,總不能禁止打/>_</這個表情符號吧

又或者根本就需要直接透過頁面編輯HTML,這都是滿常見的需求

最常見的解法是 validateRequest="false"

但是這就像他提供了一套防護衣,但是使你不能靈活運動,為了想要隨心所欲,乾脆全裸上陣

其實要穿防護衣還是要全裸不是真的那麼重要

重要的是到底使用者在提交表單的時候能不能夠安全又符合需求

第二種作法則是使用HTML Encode,將要提交的內容在前端先行編碼,到後端在做處理

HTML Encode 的方法又是方法千百種

先來看看 javascript 原生的編碼 function

escape、encodeURI、encodeURIComponent 的差異

原字串:<script>alert('中獎')</script>

escape()會轉成:%3Cscript%3Ealert%28%27%u4E2D%u734E%27%29%3C/script%3E

encodeURI()會轉成:%3Cscript%3Ealert('%E4%B8%AD%E7%8D%8E')%3C/script%3E

encodeURIComponent()會轉成:%3Cscript%3Ealert('%E4%B8%AD%E7%8D%8E')%3C%2Fscript%3E

雖然可以成功通過 ValidateRequest ,但是中文也變得又臭又長的編碼

於是又有人這麼做,用replace字串的方式把特殊的腳本字符轉換成 HTML 的跳脫字元就好了

例如 字串.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');

會轉成:&lt;script&gt;alert('中獎')&lt;/script&gt;

上述方法是參考 jquery.string.1.0.js 裡的 escapeHTML 方法

最後分享一個最近學到的Jquery解法

簡單來說,他就是透過一個 div 容器,將 input 的 value 放到 div 之中,再透過 .text() 跟 .html() 這兩個方法交互使用來轉換特殊字符

沒有留言:

張貼留言