简单易用的 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>
总结
这两种方法简单实用,基本可以解决简单的脚本注入问题。