什么时候插入环防伪令牌?

Ced*_*tin 5 clojure ring csrf-protection

我试图了解何时在 HTML 页面中生成或插入环防伪令牌。我正在使用 Compojure / ring / hiccup 但我认为我的问题真的是关于戒指。我本身没有任何问题:我只是想知道何时以及如何“注入”防伪令牌。

anti-forgery-field从功能ring.util.anti-forgery实现是这样的:

(html (hidden-field "__anti-forgery-token" *anti-forgery-token*)
Run Code Online (Sandbox Code Playgroud)

如果我在 REPL 中调用这个函数,我会得到:

REPL>  (println (anti-forgery-field))
<input id="__anti-forgery-token" name="__anti-forgery-token" type="hidden" value="Unbound: #&apos;ring.middleware.anti-forgery/*anti-forgery-token*" />
Run Code Online (Sandbox Code Playgroud)

仍然在 REPL 中,如果我尝试获取此变量,则会得到相同的“未绑定”变量:

> ring.middleware.anti-forgery/*anti-forgery-token*
=> #object[clojure.lang.Var$Unbound 0x1eae055 "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"]
Run Code Online (Sandbox Code Playgroud)

我不明白的是“未绑定”值是什么,也不知道它何时(通过环?)转换为实际交付的令牌。而且我特别不明白连接到网站的几个用户如何获得不同的令牌(每个会话)。

该变量总是“未绑定”吗?它何时/如何成为“绑定”(如果有?)?

另外,如果我有环会话 ID(比如"ring-session=310678be-9ef6-41a7-a12a-b2417de4a79f"),我怎么能在 Clojure REPL(在服务器端)看到相应的反伪造令牌的价值?

Sva*_*nte 5

它仅在单个请求的上下文(动态环境,当前堆栈,如果您愿意)中绑定。将其视为线程局部变量/绑定。从 REPL 查看您的应用程序状态时,您不在请求的上下文中。

必须是这种方式,因为对于每个用户它必须是不同的值。如果您在不允许对动态环境进行这种控制的环境中工作,您将通过显式查找调用来模拟类似的行为。

在请求期间在中间件中建立与正确会话值的绑定,当前在这里:

https://github.com/weavejester/ring-anti-forgery/blob/master/src/ring/middleware/anti_forgery.clj#L67

(binding [*anti-forgery-token* (session-token request)]
  ;; ...
  )
Run Code Online (Sandbox Code Playgroud)