2017-04-07 36 views
3

我试图了解何时将环形防伪标记生成或插入到HTML页面中。我使用Compojure/ring/hiccup,但我认为我的问题真的是关于响铃。我本身没有任何问题:我只想知道什么时候以及如何“注入”防伪标记。什么时候插入了环形防伪标记?

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

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

如果我在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*" /> 

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

> ring.middleware.anti-forgery/*anti-forgery-token* 
=> #object[clojure.lang.Var$Unbound 0x1eae055 "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"] 

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

这个变量是否总是“未绑定”?什么时候/如何变得“受限制”(如果有)?

另外,如果我已经得到了环会话ID(比如“环会话= 310678be-9ef6-41a7-A12A-b2417de4a79f”),我怎么能看到,在Clojure的REPL(在服务器端),相应的防伪标记的值?

+0

尝试https://github.com/ring-clojure读取源/ring-anti-forgery/blob/master/src/ring/middleware/anti_forgery.clj,它没有做任何特别的幻想。一旦你这样做了,如果你对这个机制有特定的问题,那么这可能是一个很好的问题。 – amalloy

+0

@amalloy:好吧,我已经读过,我根本不明白。这可能不是因为我不仅不了解* ring *而且还有Clojure(这可以解释为什么使用源码不能帮助我,为什么我会问这个问题)。我认为一个问题的答案会帮助我理解这个机制:*“当两个用户登录我的网站并且我知道他们的环会话ID时,我怎么能从REPL读取两个不同的反伪造令牌?” *。这真的会帮助我理解底下发生了什么。 –

回答

3

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

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

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

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

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

oooh,这对我来说是全新的东西。感谢您的解释:现在感觉不那么神秘,我明白为什么我一直把这看作是REPL的“无约束”。 –

相关问题