我刚刚在Yesod中开启了CSRF保护中间件。
我的 jQuery AJAX 调用正在工作,CSRF 令牌按照正常的脚手架添加到标题中。
现在我有一个普通的 HTML“POST”表单,不是由 Yesod 生成的。我想将 CSRF 保护令牌作为隐藏输入。
到目前为止,我的ExampleHandler.hs
mcsrftoken <- fmap reqToken getRequest
let csrftoken = case mcsrftoken of
Nothing -> "NO_TOKEN"
Just t -> t
(感谢Yesod 1.2 CSRF protection的 Snoymaster )
并在example.hamlet
:
<form method="post" action="@{ExampleR someId}">
<input name="_token" type="text" value=#{csrftoken}>
这种形式有效。
我有很多处理程序,所以我不想在每个处理程序中粘贴代码(或函数)来检索令牌。我也不想将我所有的 HTML 表单都转换为 AJAX。
我尝试将上面的令牌检索片段粘贴到Foundation.hs
, 以在任何地方获取令牌,但随后我得到:
Variable not in scope: csrftoken
在处理程序中example.hamlet
拉入的线上。
如何csrftoken
在所有处理程序的范围内获取变量?
有没有更好的方法将 CSRF 令牌放入非生成的 HTML 表单中?
谢谢haskellers和Yesod粉丝