Go框架默认不提供安全防护,Gin/Echo/Fiber仅作请求分发,XSS需html/template转义或CSP头,SQL注入须参数化查询,CSRF需gorilla/csrf令牌+SameSite Cookie,所有安全头及JWT校验均需手动实现。

Go 框架本身不带安全默认值,gin.Default()、echo.New()、fiber.New() 启动的服务等于裸奔——XSS、SQL 注入、CSRF、信息泄露全靠你自己补。
为什么 Gin/Echo/Fiber 默认不防 XSS 和 SQL 注入
它们只是请求分发器,不是安全网关。框架把 POST /user 交给你的 handler,但不会拦住 <script>alert(1)</script> 进模板,也不会阻止 "' OR 1=1 --" 拼进 SQL 字符串里。
-
html/template才会自动转义{{.Name}};用text/template或直接fmt.Fprintf输出,XSS 就在等你 -
db.Query("SELECT * FROM users WHERE id = " + id)是典型注入点;必须用db.Query("WHERE id = ?", id)或db.Prepare - 框架不检查 URL 参数是否含
javascript:、onerror=,也不过滤 JSON body 里的恶意字段
必须手动加的三个安全响应头
浏览器不认“应该安全”,只认明确的响应头。漏掉任何一个,都可能让攻击者绕过防护。
-
X-Content-Type-Options: nosniff:防止.jpg文件被当text/html执行,必须显式设 -
X-Frame-Options: DENY:禁用 iframe 嵌套,防点击劫持,gin.Use()里统一加比每个 handler 写一遍更可靠 -
Content-Security-Policy: default-src 'self':最小权限起步,后续再按需放开script-src或img-src
注意:Strict-Transport-Security 只能在 HTTPS 下发,r.TLS != nil 判断不能省;本地开发 localhost 不该设它。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
立即学习“go语言免费学习笔记(深入)”;
JWT 中间件最容易跳过的两个校验点
很多项目只检查 token.ExpiresAt,却放行签名无效或 issuer 错误的 token——等于锁了门,钥匙孔留着没堵。
- 没调
token.Valid或没检查jwt.Parse的第三个返回值err→ 签名被篡改的 token 也会通过 - 没比对
token.Claims.(jwt.MapClaims)["iss"]→ 攻击者用另一个系统的 token 冒充你用户 - 密钥硬编码在代码里(如
[]byte("secret"))→ 生产环境必须从环境变量或 Vault 加载
CSRF 防护不能只靠 gorilla/csrf
gorilla/csrf 能生成和校验 token,但若 cookie 属性设错,token 就可能被窃取或失效。
- CSRF token 必须随
HttpOnly=false的 cookie 下发(JS 才能读取),但必须配SameSite=Lax或Strict - 不要把 token 放 URL 查询参数里——会被日志、Referer、代理缓存泄露
- GET 请求不校验 token,但也不能用于删/改操作;敏感动作一律用 POST/PUT/DELETE + token 校验
真正难的是组合:CSP 头限制脚本执行、SameSite Cookie 阻断跨域携带、CSRF token 验证一致性——少一环,攻击链就闭合了。

















