revel 中防范csrf 跨域攻击.

首先 go get github.com/cbonello/revel-csrf

这个是一个csrf的组件, 支持表单submit和ajax请求的验证.

  1. app.conf 加入两行

    csrf.ajax = true

    csrf.token.length = 32

  2. init.go 中加入filter

    csrf.CSRFFilter,

  3. ajax请求在header中, 或者表单中设置一个隐藏字段, 存放服务器生成的token

  4. 因为我在web上使用的是AngularJS, 所以需要改写下代码:

修改csrf.go的cookie的名字, 与AngularJs的约定相同.

cookieName = "XSRF-TOKEN"

headerName = "X-XSRF-TOKEN"

另外不再将token放入到Session这个cookie里面, 而是直接放在外边:

cookieToken := new(http.Cookie)
cookieToken.Name = cookieName
cookieToken.Value = realToken
cookieToken.Path = "/"
c.SetCookie(cookieToken)

共 4 个回复


rn2dy

不用修改 cookieName 和 headerName, 设定 angular 的 $httpProvider.defaults.xsrfHeadreName, $httpProvider.defaults.xsrfCookieName 就可以了。

# 0

bigbear

你试试, 我感觉好像不行, 因为默认的csrf组件, 把cookie写在了revel的session这个cookie项里面了, 代码是: c.Session[cookieName] = realToken. 好像没有另外写一个新的cookie键, 我之前在浏览器里面看cookie的时候, 没这个键.

# 1

rn2dy

我的意思是只用修改cookie的存放位置,就像你所说的。

# 2

wojoo

感觉作用不大。
这个Cookie是明文的,csrf-Token 也不是一成不变,测试一下,得到csrf-Token后还是可以外部提交。
配置 cookie.secure = true ,这个包就不启作用了。

# 3