消除不受信任的HTML (来防止XSS攻击)

本文介绍如何在网站中防止跨站脚本攻击(XSS),通过使用jsoup库和自定义白名单来清理HTML内容,确保用户评论的安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。

方法

使用jsoup HTML Cleaner 方法进行清除,但需要指定一个可配置的 Whitelist

String unsafe = 
  "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

说明

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。所以我们经常只让用户输入纯文本的内容,但这样用户体验就比较差了。

一个更好的解决方法就是使用一个富文本编辑器WYSIWYG如CKEditor 和 TinyMCE。这些可以输出HTML并能够让用户可视化编辑。虽然他们可以在客户端进行校验,但是这样还不够安全,需要在服务器端进行校验并清除有害的HTML代码,这样才能确保输入到你网站的HTML是安全的。否则,攻击者能够绕过客户端的Javascript验证,并注入不安全的HMTL直接进入您的网站。

jsoup的whitelist清理器能够在服务器端对用户输入的HTML进行过滤,只输出一些安全的标签和属性。

jsoup提供了一系列的Whitelist基本配置,能够满足大多数要求;但如有必要,也可以进行修改,不过要小心。

这个cleaner非常好用不仅可以避免XSS攻击,还可以限制用户可以输入的标签范围。

参见

  • 参阅XSS cheat sheet ,有一个例子可以了解为什么不能使用正则表达式,而采用安全的whitelist parser-based清理器才是正确的选择。

  • 参阅Cleaner ,了解如何返回一个 Document 对象,而不是字符串

  • 参阅Whitelist,了解如何创建一个自定义的whitelist

  • nofollow 链接属性了解


转载于:https://my.oschina.net/ydsakyclguozi/blog/380850

### XSS 攻击在对话窗口中的防护措施 为了有效防止或处理对话窗口中的 XSS 攻击,可以从以下几个方面入手: #### 1. 输入验证与清理 对用户提交的数据进行全面的输入验证和清理操作。这可以通过以下方式实现: - **白名单机制**:仅允许特定字符集内的数据通过并显示在 HTML 中[^5]。这种方法虽然较为严格,但在现代 Web 应用场景下可能不够灵活。 - **转义特殊字符**:对于任何不可信的输入,都需要将其特殊字符(如 `<`, `>`, `&` 等)转换为对应的 HTML 实体编码[^1]。例如,将 `<script>` 转换为 `<script>`。 ```javascript function escapeHtml(unsafe) { return unsafe.replace(/[<>&]/g, function (match) { switch (match) { case '<': return '<'; case '>': return '>'; case '&': return '&'; } }); } ``` #### 2. 使用 Content Security Policy (CSP) Content Security Policy 是一种有效的防御手段,能够减少甚至消除 XSS 的风险。它通过指定哪些外部资源可以在页面上加载来限制潜在恶意脚本的执行[^3]。 配置 CSP 头部如下所示: ```http Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; ``` 此策略表明只允许从当前域以及信任的 CDN 加载 JavaScript 文件和其他资源。 #### 3. 输出上下文中适配的安全编码 根据不同的渲染环境采取相应的安全措施是非常重要的。如果是在属性值中插入内容,则需额外注意引号的转义;如果是 URL 参数部分,则应进行 URI 编码等处理[^2]。 示例代码展示如何根据不同上下文正确地输出字符串: ```html <!-- 属性 --> <img src="image.jpg" alt="{{ user_input | attribute_escape }}" /> <!-- JS 字符串 --> <script> var message = "{{ user_input | js_string_escape }}"; </script> <!-- CSS 样式 --> <div style="color:{{ user_input | css_value_escape }}">Text</div> ``` #### 4. 定期更新依赖库版本 许多流行的前端框架已经内置了一些针对 XSS 的保护功能。因此保持这些工具处于最新状态有助于抵御已知类型的攻击模式[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值