前言
最近在项目中遇到漏洞检查的问题,其中就有 script 脚本注入的问题,简单的说 script 脚本注入就是在接收用户输入时,将 javascript 脚本提交到服务器了,这样在显示时浏览器就会执行这些脚本,从而进行攻击,常见的有跨站脚本 (XSS) 攻击等。
解决方案
其实解决方案也很简单,就是将其用户的输入信息进行 html 编码,将特殊字符转换为 html 实体,这样就能可以简单的防止了 script 注入的攻击,但是对于业界高手,还要进一步加强安全策略。
服务端转义
可以在服务器端对用户的输入信息进行编码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| String message = Html.Encode(message);
public class HtmlEncode { public static void main (String[] args){ String s = new String("<script>alert(1);</script>"); String str = encodeHtml(s); System.out.println(str); }
public static String encodeHtml(String s){ StringBuffer out = new StringBuffer(); for(int i = 0; i < s.length(); i++){ char c = s.charAt(i); if(c > 127 || c=='"' || c=='<' || c=='>') { out.append("&#" + (int)c + ";"); } else { out.append(c); } } return out.toString(); } }
|
js 前端转义
同样也可以在浏览器端进行转义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| (function(){ 'use strict'; var root = typeof window === 'object' ? window : {};
var htmlEncode = function(value, entry) { if(!entry){ entry = { "'": "'", '"': '"', '<': '<', '>': '>' }; }
if(value){ value = value.replace(/(['")-><&\\\/\.])/g, function ($0) { return entry[$0] || $0; }); } return value; }
if(root){ root.htmlEncode = htmlEncode; }
})();
var message = '<script>alert(1);</script>'; message = window.htmlEncode(message); // "<script>alert(1)</script>" // 在浏览器中显示 <script>alert(1)</script>
|
总结
这两种方法简单实用,基本可以解决简单的脚本注入问题。
ddAnswer更多文章请关注微信公众号: zhiheng博客