XssFilter 在 Fiber 中失效,因其不走 Servlet 过滤器链;需手动注册中间件且顺序关键:xssMiddleware 必须在路由前、BodyParser 后,否则无法拦截 multipart 字段名或处理原始 body。

直接用 XssFilter 会失效,因为 Fiber 默认不走 Servlet 过滤器链
Fiber 是基于 Go 的轻量 HTTP 框架,它完全绕开了 Java 的 Filter / Servlet 生命周期。若依(RuoYi)那种基于 Spring Boot + XssFilter 的配置(如 xss.enabled、excludes)在 Fiber 里根本不会被加载或执行——不是配错,是压根没机会运行。
fiber.New() 后必须手动注册中间件,且顺序不能错
Fiber 的中间件执行顺序严格依赖注册顺序,XSS 过滤必须放在路由匹配之前,否则可能漏掉表单体、JSON Body 或 query 参数。
- 正确位置:
app.Use(xssMiddleware)要在app.Get()/app.Post()之前 - 错误写法:
app.Post("/api/data", xssMiddleware, handler)—— 这里xssMiddleware只对这个路由生效,且无法拦截 multipart/form-data 中的字段名(如<script></script>作为 key 出现) - Body 解析必须提前:如果用了
app.Use(fiber.BodyParser()),要确保它在 XSS 中间件之后,否则原始 raw body 已被消费,无法重读
别信“正则替换 <script>”这种粗暴方案
单纯用 strings.ReplaceAll(body, "<script> 或正则删标签,既拦不住编码绕过(如 <code>%3Cscript%3E</script>),也破坏合法 HTML 内容(比如富文本编辑器提交的 <pre><code>)。真正安全的做法是:
- 对所有入参(query、form、json、path param)统一做 HTML 解码 → 转义 → 白名单过滤
- 推荐用
golang.org/x/net/html+bluemonday库,例如:policy := bluemonday.UGCPolicy() cleaned := policy.SanitizeBytes(input)
- 对非富文本字段(如用户名、标题),直接用
html.EscapeString()即可,更轻更快 - 注意:不要在中间件里修改
c.Body()原始字节——Fiber 不允许二次读取,应改用c.Locals存清洗后值,后续 handler 从 locals 取
最易忽略的点:上传文件字段名和 JSON key 也会被注入
攻击者常把恶意脚本塞进 multipart/form-data 的字段名(如 Content-Disposition: form-data; name="<script>alert(1)"</script>)或 JSON 的 key({"<img src="https://img.php.cn/" alt="Fiber框架怎么安全过滤XSS跨站脚本">": "value"}),这类 payload 不经过常规 body 解析,容易被跳过。
必须在中间件中显式遍历:
– c.MultipartForm() 的 Value 和 File 的 Filename 字段
– json.RawMessage 解析前的原始 bytes(用 json.Decoder 逐 token 扫描 key)
否则,哪怕 body 内容被清干净了,攻击仍可通过字段名触发 DOM-based XSS。


















