【发布时间】:2017-04-07 18:48:48
【问题描述】:
我试图了解环形防伪令牌何时生成或插入 HTML 页面。我正在使用 Compojure / ring / hiccup,但我认为我的问题实际上是关于 ring 的。我本身没有任何问题:我只想知道何时以及如何“注入”防伪令牌。
ring.util.anti-forgery 中的 anti-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: #'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*"]
我不明白“未绑定”值是什么,也不明白它何时被转换(通过环?)为交付的实际令牌。而且我特别不明白连接到网站的几个用户是如何获得不同的令牌(每个会话)的。
那个变量总是“未绑定”的吗?它何时/如何成为“绑定”(如果确实如此?)?
另外,如果我有环会话 ID(比如 "ring-session=310678be-9ef6-41a7-a12a-b2417de4a79f"),我如何在 Clojure REPL (在服务器端),对应的防伪令牌的值?
【问题讨论】:
-
尝试阅读github.com/ring-clojure/ring-anti-forgery/blob/master/src/ring/… 的源代码,这并没有做任何特别花哨的事情。完成此操作后,如果您对机制有具体问题,这可能是一个很好的问题。
-
@amalloy:嗯,我已经读过了,我只是不明白。这可能不是因为我不仅不了解 ring 也不了解 Clojure(这可以解释为什么使用源代码对我没有帮助以及为什么我问这个问题)。我认为一个问题的答案可以帮助我理解该机制是:“当两个用户登录我的网站并且我知道他们的环会话 ID 时,我如何从 REPL 读取两个不同的防伪令牌?”。这真的会帮助我了解幕后发生的事情。
标签: clojure csrf-protection ring