什么时候插入戒指防伪标记?

时间:2017-04-07 18:48:49

标签: clojure csrf-protection ring

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

来自anti-forgery-field的{​​{1}}功能实现如下:

ring.util.anti-forgery

如果我在REPL调用此函数,我会得到:

(html (hidden-field "__anti-forgery-token" *anti-forgery-token*)

仍然在REPL,如果我试图得到这个var我得到相同的“未绑定”变量:

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*" />

我不明白的是“Unbound”值是什么,也不是什么时候(通过响铃?)转换成实际的令牌。我特别不明白连接到网站的几个用户是如何获得不同的令牌(每个会话)。

该变量是否始终为“未绑定”?何时/如何变得“束缚”(如果它?)?

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

1 个答案:

答案 0 :(得分:4)

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

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

在请求期间,在中间件中建立了对正确会话值的绑定,目前在此处:

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

(binding [*anti-forgery-token* (session-token request)]
  ;; ...
  )