我想在Go Web应用程序中实现CSRF预防。用户未登录,但他们确实填写了表格并付款(通过Stripe Checkout)。
发布内容会在 session 变量(cookie)中设置 key ,以便他们以后可以编辑已发布的内容,并且电子邮件中的URL允许他们在cookie过期后返回,并在需要时再次进行编辑。
从我所看到的,我可以将https://code.google.com/p/xsrftoken/与“双重提交的cookie”方法结合使用,以通过以下方式实现CSRF预防:
if session.Values["id"] == "" {
session.Values["id"] = uuid.NewV4()
}
csrfToken := xsrftoken.Generate(csrfKey, session.Values["id"], "/listing/new/post")
session.Values["csrfToken"] = csrfToken
...
<input type="hidden" id="_csrf" value={{ .csrfToken }}>
csrfToken
与 session 中的ojit_code相匹配,如果是,请使用xsrf软件包对其进行验证以确认它尚未过期:userID := session.Values["id"]
if session.Values["csrfToken"] != r.PostFormValue("csrfToken") {
http.Redirect(w, r, "/listing/new", 400)
}
if !xsrftoken.Valid(session.Values["csrfToken"], csrfKey, userID, "/listing/new/post") {
http.Redirect(w, r, "/listing/new", 400)
}
我的相关问题是:
最佳答案
经常重新生成 token 和 session ID是一个好主意。给定持久的攻击者和可行的进入媒介,攻击者获得两者都只是时间问题。但是,如果在攻击者能够破解当前标识符之前,两个标识符中的至少一个重新生成,则没有问题。
如果您想给客户大量时间填写表格,则可以通过AJAX更新cookie和CSRF token 。
token 与需要身份验证的特定操作的绑定(bind)越紧密,您所拥有的控制就越精细。如果您可以唯一地标识应用程序中的每种表单,那么我就说吧。
关于security - Go Web应用程序中的CSRF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19129985/