【问题标题】:Issues with gorilla/csrfgorilla/csrf 的问题
【发布时间】:2017-11-14 12:49:31
【问题描述】:

所以,对于我的生活,我无法弄清楚如何让大猩猩的 csrf 在不直接注入田地的情况下工作。它一直在谈论通过标头和 cookie 传递它,但我所做的一切似乎都不起作用……这是我的 go 服务器所拥有的:

`

package main
import (
    "gorilla/mux"
    "gorilla/csrf"
    "net/http"
    "log"
    "encoding/json"
    "http/template"
    "time"
)

func showLoginPage(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Set-Cookie", "_gorilla_csrf="+csrf.Token(r))
    templates.ExecuteTemplate(w, "<template_here>", nil)
}


func doLogin(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Set-Cookie", "_gorilla_csrf="+csrf.Token(r))
    /**
    builds resp
    **/
    w.Write(resp)
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/login", showLoginPage).Methods("GET")
    r.HandleFunc("/login", doLogin).Methods("POST")
    r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", http.FileServer(http.Dir("./js"))))
    r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir("./css"))))

    srv := &http.Server{
          Handler:      csrf.Protect([]byte("very-secret-string"), csrf.Secure(false))(r),
          Addr:         "127.0.0.1:8000",
          // Good practice: enforce timeouts for servers you create!
          WriteTimeout: 15 * time.Second,
          ReadTimeout:  15 * time.Second,
    }
    log.Fatal(srv.ListenAndServe())
}

`

然而,在我的前端我有这个,以便所有请求都得到更新: `

var getCookie = function(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for (var i = 0; i < ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0) == ' ') c = c.substring(1);
      if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
  }
  return "";
};
$.ajaxPrefilter(function( options ) {
    options.beforeSend = function (xhr) { 
        xhr.setRequestHeader('X-CSRF-Token', getCookie('_gorilla_csrf'));
    }
});

`

我知道我必须遗漏一些东西,但我真的似乎根本无法理解这一点。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript jquery go gorilla


    【解决方案1】:

    您似乎正在使用此行覆盖大猩猩创建的真实 CSRF 令牌。 Gorilla 正在使用会话存储来保存真实的 CSRF 令牌以进行验证。

    w.Header().Set("Set-Cookie", "_gorilla_csrf="+csrf.Token(r))
    

    请不要碰_gorilla_csrf这个cookie。

    Gorilla 仅通过 form fieldheader 支持 CSRF。所以选择你的选择,他们的readme 有你需要的信息(表单字段、标题和自定义字段名称和标题名称)。

    gorilla/csrf 按此顺序检查 CSRF 令牌:

    gorilla/csrf 在随后的 POST/PUT/PATCH/DELETE/etc 中检查 HTTP 标头(第一个)和表单正文(第二个)。请求令牌。

    【讨论】:

    • 所以,无论出于何种原因(也许我在没有意识到的情况下更改了某些内容) - 但在我按照你说的做之后,我实际上恢复了正确的 _gorilla_csrf - 它以前没有通过。话虽如此,在将 X-CSRF-Token 标头设置为 getCookie 返回的值时,我仍然收到 403 禁止,知道为什么吗?
    • @ReginadScarr 很高兴听到,您得到了正确的 _gorilla_csrf cookie。我相信你可以接受答案。
    • 所以,看起来我实际上并没有得到正确的密钥......它每次都发回同样的东西,没有失败。我不知道在这里做什么。
    • 这很奇怪。好的,让我在最后尝试一下,然后告诉你。
    • 我已经尝试了 gorilla pkg 的示例代码,它运行良好。供您参考play.golang.org/p/jVKR7dtPrV
    猜你喜欢
    • 2016-02-14
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2021-04-09
    相关资源
    最近更新 更多