# 如何抵御 XSS 攻击
# 什么是 XSS 攻击?
XSS 是跨站脚本攻击,让浏览器渲染 DOM 的时候意外的执行了恶意 JS 代码。
XSS 攻击的原理是:在网页中嵌入一个恶意脚本。
<img src="null" onerror='alert(document.cookie)'
1
如上代码,在宝贝详情里面添加了 img 标签, 由于 src 是 null,加载图片出错,就会触发 onerror 事件,就把你的 cookie 弹出来了。这只是一个抛砖引玉,可以利用类似的手段执行其他的代码。
如下图:在内容里面写入这个恶意代码,你的网页在渲染这个内容的时候,直接用 html 模式渲染,就导致了恶意代码的执行
# XSS 的危险之处
浏览器是一个沙箱环境,JavaScript 不可以读写本地文件、不可以连接数据库、不可以创建线程。
但是有一些技术绕过这个机制,如 flash、java applet 程序。
XSS 不会对系统造成破坏,但是却可以盗用账户信息
# HTML 格式邮件 XSS 攻击
通过邮箱发送 HTML 格式的邮件,你打开之后,就有可能执行恶意代码了。
这种类型的只有靠邮箱运营商来过滤这种恶意脚本了。
# 内容转义
那么怎么对要保存在数据库的数据进行恶意脚本过滤?
这里可以使用 AntiSamy 这个开源的 Java 库,可以用来过滤 XSS 恶意代码
compile group: 'org.owasp.antisamy', name: 'antisamy', version: '1.5.9'
1
import org.owasp.validator.html.*;
public class AntisamyTest {
public static void main(String[] args) throws PolicyException, ScanException {
String temp = "你好,这个是一个破坏代码<img src='null' onerror='alert(123456)'>";
String path = AntisamyTest.class.getResource("/antisamy.xml").getPath();
Policy policy = Policy.getInstance(path);
AntiSamy samy = new AntiSamy();
CleanResults scan = samy.scan(temp, policy);
System.out.println(scan.getCleanHTML());
}
}
# 输出结果为
你好,这个是一个破坏代码<img src="null" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
对于 antisamy.xml 是 antisamy 的一个策略配置文件,自带的 jar 包中,已经包含了好几个规则,有宽松的,有严格的(可以吧 img 标签都删除)。
# 本章要点回顾
电商系统,秒杀的时候如何避免商品超售?
数据库使用乐观锁,使用 Redis 的事务机制。
为什么不用存储过程?
不适合集群场景。
如何预防电商交易中,卖家偷换商品信息?
商品信息修改要备份。相当于做快照