简单易用的 HtmlEncode
前言
最近在项目中遇到漏洞检查的问题,其中就有 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// java 提供的 API
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); // <script>alert(1);</script>
    }
    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>
总结
这两种方法简单实用,基本可以解决简单的脚本注入问题。

