Golang 后端防御 XSS 攻击:用 bluemonday 让富文本发帖更安全

更新日期: 2025-06-12 阅读次数: 70 字数: 591 分类: golang

这两天在用 golang 开发一个论坛的后端接口,遇到了一个 XSS 攻击的场景。 发帖时,前端传递过来的 Content 是 html,经测试发现,如果不对 html 内容进行清理,会导致 XSS 攻击。😰 即,帖子内容中包含了恶意的 js 代码,攻击者可以通过这个 js 代码来窃取用户的 cookie 或者执行其他恶意操作。

什么是 XSS 攻击?

XSS(Cross-Site Scripting)攻击是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本代码,使得这些代码在其他用户的浏览器中执行,从而窃取用户信息、劫持会话等。 XSS 攻击通常发生在用户输入未经过滤或清理的情况下,攻击者可以通过输入框、评论区等地方注入恶意代码。例如,提交的评论内容是这样的:

老师,我发现视频没有声音,想修改一下 <p>正常文本</p>
<script>alert(\"XSS攻击\")</script>
<a href=\"javascript:alert('XSS')\">点击</a>

如何防御 XSS 攻击?

在 Golang 中,可以使用 bluemonday 这个库来清理 HTML 内容,防止 XSS 攻击。Github 地址:

https://github.com/microcosm-cc/bluemonday

bluemonday 简介

bluemonday is a HTML sanitizer implemented in Go. It is fast and highly configurable.

bluemonday 是一个 HTML 清理器,使用 Go 语言实现。它可以快速且高度可配置地清理 HTML 内容。

bluemonday takes untrusted user generated content as an input, and will return HTML that has been sanitised against an allowlist of approved HTML elements and attributes so that you can safely include the content in your web page.

bluemonday 会将不受信任的用户输入(可能包含 js 代码, 引发 XSS 攻击),返回经过允许的 HTML 元素和属性清理的 HTML,以便您可以安全地将内容包含在网页中。

依赖安装

go get github.com/microcosm-cc/bluemonday

使用示例

package main

import (
	"fmt"

	"github.com/microcosm-cc/bluemonday"
)

func main() {
	// Do this once for each unique policy, and use the policy for the life of the program
	// Policy creation/editing is not safe to use in multiple goroutines
	p := bluemonday.UGCPolicy()

	// 这个策略可以用来清理大量输入,并且可以在多个 goroutine 中安全使用
	html := p.Sanitize(
		`<a onblur="alert(secret)" href="http://www.google.com">Google</a>`,
	)

	// 输出:
	// <a href="http://www.google.com" rel="nofollow">Google</a>
	fmt.Println(html)
}

使用论坛发帖数据做测试:

提交内容

{
  "title": "老师,截止日期之后还能修改视频么?",
  "content": "发现视频没有声音,想修改一下 <p>正常文本</p><script>alert(\"XSS攻击\")</script><a href=\"javascript:alert('XSS')\">点击</a>"
}

未使用 bluemonday 的结果

发现视频没有声音,想修改一下 <p>正常文本</p><script>alert("XSS攻击")</script><a href="javascript:alert('XSS')">点击</a>

这个直接在前端渲染,点击按钮后,会执行 alert 那段 js 代码。

使用 bluemonday 的结果

发现视频没有声音,想修改一下 <p>正常文本</p>点击

会看到恶意代码已被自动过滤。

总结

bluemonday.UGCPolicy() 适合大多数富文本场景,能过滤绝大多数 XSS 攻击。👍

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式