Web安全:XSS跨站脚本攻击详解
1. XSS概述
XSS(Cross-Site Scripting)是一种代码注入攻击,攻击者通过在网页中注入恶意脚本代码,当用户浏览该页面时,恶意代码会在用户浏览器中执行,从而盗取用户信息、劫持会话等。
2. XSS类型
2.1 反射型XSS
非持久化攻击,恶意代码作为用户请求参数被服务器返回:
// 不安全的实现 func handleSearch(c *gin.Context) { query := c.Query("q") // 直接将用户输入返回,没有转义 c.HTML(200, "search.html", gin.H{ "query": query, }) }2.2 存储型XSS
恶意代码被永久存储在服务器端:
// 不安全的评论功能 func postComment(c *gin.Context) { comment := c.PostForm("comment") // 直接存储用户输入,没有过滤 db.Exec("INSERT INTO comments (content) VALUES (?)", comment) }2.3 DOM型XSS
完全在客户端执行,不涉及服务器:
// 不安全的JavaScript代码 document.getElementById("output").innerHTML = location.hash;3. XSS防护措施
3.1 输入过滤
import "github.com/microcosm-cc/bluemonday" func sanitizeInput(input string) string { p := bluemonday.UGCPolicy() return p.Sanitize(input) } // 使用 func handleComment(c *gin.Context) { comment := c.PostForm("comment") sanitized := sanitizeInput(comment) db.Exec("INSERT INTO comments (content) VALUES (?)", sanitized) }3.2 输出编码
import "html" func escapeOutput(input string) string { return html.EscapeString(input) } // HTML模板中使用 func renderUserInput(c *gin.Context) { input := c.Query("input") c.HTML(200, "output.html", gin.H{ "input": html.EscapeString(input), }) }3.3 Content Security Policy
func CSPMiddleware() gin.HandlerFunc { return func(c *gin.Context) { c.Header("Content-Security-Policy", "default-src 'self'; "+ "script-src 'self' 'unsafe-inline'; "+ "style-src 'self' 'unsafe-inline'; "+ "img-src 'self' data:;") c.Next() } }3.4 HTTPOnly和Secure Cookie
import "github.com/gin-gonic/gin/sessions" session := sessions.Default(c) session.Options(sessions.Options{ Path: "/", MaxAge: 86400 * 7, HttpOnly: true, // 防止JavaScript访问Cookie Secure: true, // 仅在HTTPS传输 SameSite: http.SameSiteStrictMode, })4. 前端XSS防护
4.1 React自动防护
React自动转义JSX中的表达式:
// React会自动转义 const userInput = "<script>alert('xss')</script>"; return <div>{userInput}</div>;4.2 Vue防护
<!-- Vue也会自动转义 --> <template> <div>{{ userInput }}</div> </template> <!-- 使用v-html需要谨慎 --> <div v-html="unsafeContent"></div>5. 安全工具
5.1 OWASP ZAP
自动化Web应用安全扫描工具:
# Docker运行ZAP docker run -t owasp/zap2docker-stable zap-baseline.py -t https://example.com5.2 扫描工具集成
# GitHub Actions集成安全扫描 name: Security Scan on: [push] jobs: zap-scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: ZAP Baseline Scan uses: zaproxy/action-baseline@v0.7.0 with: target: 'https://example.com'6. 总结
XSS是常见的Web安全漏洞,通过输入过滤、输出编码、Content Security Policy等措施可以有效防护。开发时应始终假设用户输入是不可信的,并采取相应的安全措施。