本文共 1169 字,大约阅读时间需要 3 分钟。
1 输入检测
之前在 XSS 攻击中有讲过,攻击者主要是通过构造特殊字符来注入脚本,所以输入检测就很有必要。
输入检测,必须在服务端实现。因为,攻击者可以绕开 JavaScript 展开攻击。业界的普遍做法是:同时在客户端与服务端进行输入检测。客户的误操作引起的问题,可以通过客户端 JavaScript 检测出来,从而节约服务器资源。而攻击者的特殊字符入参,大部分可以在服务端被拦截下来。
输入检测中,可以加入 XSS 特征检测,这就是 XSS Filter。比如是否包含 <script>
标签等等。
但 XSS Filter 并不能真正理解语境、甚至可能出现改变客户输入语义的问题。比如输入公式:1+1 < 3。 XSS Filter 会把敏感字符转译或者过滤掉,这就不是客户希望看到的。
2 输出检测
2.1 非富文本输出情境
非富文本输出情境下,可以编码或转义可能造成 XSS 攻击的特殊字符。
JavaScript 中可以使用 ESAPI 中的 DefaultEncoder#getInstance()#encodeForJavaScript()
来处理页面输出。
这里的 ESAPI 是 2.x。
除了 JavaScript ,这个类还针对 CSS、HTML、SQL、XML 等可能造成攻击风险的点,也提供了相应的编码方法:
也可以使用 apache 的 org.apache.commons.text.StringEscapeUtils#escapeXxx()
方法。
lang3 中的 StringEscapeUtils,已过时。
注意: 编码后的数据,长度可能发生变化,而这有可能会对现有功能造成影响,开发的时候需要注意。
XSS 的防御方法与输出位置强相关,我们要根据具体的输出语境,选择相应的 ESAPI 方法对用户的输入变量进行编码,说明如下:
输出位置 | ESAPI 对应方法 |
---|---|
HTML 标签 | encodeForHTML |
script 标签和事件 | encodeForJavaScript |
CSS | encodeForCSS |
URL 地址 | encodeForURL |
2.2 富文本输出情境
富文本一般来说,是 HTML 代码。我们首先可以通过 HTML Parser 解析出 HTML 标签、属性以及 JavaScript 事件。因为富文本主要用于展示,所以应该严格禁止 JavaScript 事件。
富文本 HTML 标签与属性的选择,应该采用白名单模式。比如只允许使用 <a>
、<img>
、<div>
等相关安全的标签。
因为用户自定义的 CSS 与 style 也可能导致 XSS 攻击,所以也需要禁止。如果业务场景必须使用样式,那我们可以使用 CSS Parser 对其进行解析,过滤掉其中所包含的危险代码。
转载地址:https://deniro.blog.csdn.net/article/details/100053808 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!