# 如何抵御 XSS 攻击

# 什么是 XSS 攻击?

XSS 是跨站脚本攻击,让浏览器渲染 DOM 的时候意外的执行了恶意 JS 代码。

XSS 攻击的原理是:在网页中嵌入一个恶意脚本。

<img src="null" onerror='alert(document.cookie)'
1

如上代码,在宝贝详情里面添加了 img 标签, 由于 src 是 null,加载图片出错,就会触发 onerror 事件,就把你的 cookie 弹出来了。这只是一个抛砖引玉,可以利用类似的手段执行其他的代码。

如下图:在内容里面写入这个恶意代码,你的网页在渲染这个内容的时候,直接用 html 模式渲染,就导致了恶意代码的执行

image-20200611224913567

# 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

对于 antisamy.xml 是 antisamy 的一个策略配置文件,自带的 jar 包中,已经包含了好几个规则,有宽松的,有严格的(可以吧 img 标签都删除)。

# 本章要点回顾

  • 电商系统,秒杀的时候如何避免商品超售?

    数据库使用乐观锁,使用 Redis 的事务机制。

  • 为什么不用存储过程?

    不适合集群场景。

  • 如何预防电商交易中,卖家偷换商品信息?

    商品信息修改要备份。相当于做快照