伪造/ CSRF令牌与最新版本的ring / compojure?

我复制了一些在compojure 1.1.18和其他旧版本库中工作的旧代码,但是使用最新版本无法使其工作。

这里是我从这个最小的例子复制的最小示例代码,以演示最新的ring和compojure库,当我发送一个http POST ,即使使用了头文件集,我也会得到一个错误。

lein ring server启动它,然后执行

curl -X GET --cookie-jar cookies "http://localhost:3000/"导致如下所示:

{"csrf-token":"7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF"}

但是当我这样做

curl -X POST -v --cookie cookies -F "email=someone@gmail.com" --header "X-CSRF-Token: 7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF" http://localhost:3000/send

我得到<h1>Invalid anti-forgery token</h1>

难道我做错了什么?

我借用的代码是为了回答这个问题。


问题在于ring-defaults (替换compojure> = 1.2中的compojure.handler命名空间)在通常的使用模式下自动使用ring anti-forgery forgery:

(defroutes app-routes
  (GET "/" [] (generate-string {:csrf-token
                                *anti-forgery-token*}))
  (POST "/send" [email] "ok")
  (resources "/")
  (not-found "Not Found"))

(def app
  (-> app-routes
   (wrap-defaults site-defaults)))

因此,两个防伪标记正在生成,并且GET请求提供了无效标记。 去除wrap-anti-forgery线解决了问题。

链接地址: http://www.djcxy.com/p/85193.html

上一篇: forgery / CSRF token with latest version ring/compojure?

下一篇: gcc doesn't accept pack expansion in default template argument