说说如何防御 XSS 攻击
发布日期:2021-06-29 21:01:32 浏览次数:2 分类:技术文章

本文共 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 等可能造成攻击风险的点,也提供了相应的编码方法:

image.png

也可以使用 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:说说 python-docx 解析 word 文档的原理
下一篇:【Linux】一步一步学Linux——tracepath命令(168)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月12日 02时21分08秒