Echo框架不自动设置SameSite属性,必须显式配置Lax或Strict;若未设,浏览器按宽松策略处理,跨站POST可携带Cookie,导致CSRF防护失效。

Echo 框架本身不自动设置防 CSRF 的 Cookie 行为,必须显式配置 SameSite 属性并配合 gorilla/csrf 或自定义中间件,否则 Cookie 仍会被跨站请求携带——哪怕你用了 token,也可能因 Cookie 泄露导致校验失效。
Cookie 的 SameSite 属性必须显式设为 Lax 或 Strict
默认情况下,Echo(或底层 net/http)生成的 Cookie 不带 SameSite,浏览器会按宽松策略处理,允许跨站 POST 请求携带认证 Cookie。这直接破坏 CSRF 防御前提。
-
SameSite=Strict:完全阻止跨站请求携带 Cookie,适合高敏操作(如转账),但可能导致用户从外部链接跳转后需重新登录 -
SameSite=Lax:允许安全的 GET 跳转携带 Cookie(如点击链接访问首页),但阻止跨站 POST/PUT/DELETE,是大多数场景的合理默认值 - 绝不能设为
SameSite=None,除非你同时强制启用Secure=true且只用于 HTTPS 场景;否则现代浏览器会直接拒绝该 Cookie - 在 Echo 中设置方式:调用
c.SetCookie()时传入http.SameSiteLaxMode或http.SameSiteStrictMode,不是字符串
gorilla/csrf 中间件要求 Cookie HttpOnly=false 且 SameSite=Lax
gorilla/csrf 依赖前端 JS 读取 token 并塞进请求头或表单字段,所以它下发的 token Cookie 必须能被 JS 访问——即 HttpOnly=false。但这和常规会话 Cookie 安全要求冲突,必须拆开管理。
- 会话 Cookie(如
session_id)应设为HttpOnly=true+SameSite=Lax+Secure=true - CSRF Token Cookie(如
_gorilla_csrf)必须设为HttpOnly=false+SameSite=Lax,否则前端拿不到 token,fetch()或表单提交时无法附带 - 不要把 token 放在 URL 查询参数里:
?_csrf=xxx会被 Referer、代理日志、服务端 access log 记录,等同于明文泄露 - 使用
gorilla/csrf时,确保初始化中间件时传入csrf.Secure(true)(HTTPS 环境)和csrf.HttpOnly(false)
敏感操作必须禁用 GET,且 POST/PUT/DELETE 必须校验 token
CSRF 防护不是“加个中间件就完事”。如果一个删除接口还接受 GET 请求,攻击者只需构造一个 就能触发,token 校验形同虚设。
- 所有修改、删除、状态变更类操作,只允许
POST、PUT、DELETE方法,禁止 GET 带副作用 - 即使用了
gorilla/csrf,也要在 handler 中检查c.Request().Method,对非安全方法强制走 token 校验路径 - 前端提交时,推荐将 token 放在请求头(如
X-CSRF-Token),比隐藏字段更难被第三方脚本篡改;gorilla/csrf默认支持该方式 - 避免“token 复用”:每个表单或页面加载时应生成新 token,或设置较短有效期(如 2 小时),防止长期 token 被截获后反复利用
真正容易被忽略的是 Cookie 分离策略:同一个域名下,会话 Cookie 和 CSRF Token Cookie 必须属性互斥(一个 HttpOnly=true,一个 false),且 SameSite 值要一致(都设 Lax),否则浏览器可能因策略冲突拒绝发送任一 Cookie。这不是框架 bug,而是 HTTP 规范对 Cookie 同源策略的硬性约束。











