我正在尝试了解何时生成或插入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: #'ring.middleware.anti-forgery/*anti-forgery-token*" />
我不明白的是“Unbound”值是什么,也不是什么时候(通过响铃?)转换成实际的令牌。我特别不明白连接到网站的几个用户是如何获得不同的令牌(每个会话)。
该变量是否始终为“未绑定”?何时/如何变得“束缚”(如果它?)?
另外,如果我有戒指会话ID(比如“ring-session = 310678be-9ef6-41a7-a12a-b2417de4a79f”),我怎么能看到Clojure REPL(在服务器端),相应的防伪令牌的值?
答案 0 :(得分:4)
它仅限于单个请求的上下文(动态环境,当前堆栈,如果愿意)。将其视为线程局部变量/绑定。在从REPL查看应用程序状态时,您不在请求的上下文中。
必须是这种方式,因为它必须是每个用户的不同值。如果您在不允许对动态环境进行此类控制的环境中工作,则可以通过显式查找调用来模拟类似的行为。
在请求期间,在中间件中建立了对正确会话值的绑定,目前在此处:
(binding [*anti-forgery-token* (session-token request)]
;; ...
)