不管老鳥菜鳥小小鳥,一定看過這個
沒錯,這就是 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,'&').replace(/</g,'<').replace(/>/g,'>');
會轉成:<script>alert('中獎')</script>
上述方法是參考 jquery.string.1.0.js 裡的 escapeHTML 方法
最後分享一個最近學到的Jquery解法
簡單來說,他就是透過一個 div 容器,將 input 的 value 放到 div 之中,再透過 .text() 跟 .html() 這兩個方法交互使用來轉換特殊字符
沒有留言:
張貼留言