2

我刚刚在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粉丝

4

0 回答 0