首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSRF: Yesod runFormPost CSRF

CSRF: Yesod runFormPost CSRF
EN

Stack Overflow用户
提问于 2015-08-01 18:57:26
回答 1查看 148关注 0票数 1

为代码转储预先道歉。我对Yesod和Haskell都很陌生,我正在努力解决CSRF的问题。据我所知,问题是表单的_token与环境令牌不匹配(运行runFormPostNoToken运行得很好)。我有两条路线:

代码语言:javascript
复制
/           HomeR      GET
/upload     UploadR    POST

HomeR的处理程序定义如下:

代码语言:javascript
复制
getHomeR :: Handler Html
getHomeR = do
    ((res, uploadWidget), enctype) <- runFormPost imgForm
    setTitle "Title"
    $(widgetFile "homepage")

表单本身和上传处理程序是:

代码语言:javascript
复制
imgForm :: Html -> MForm (HandlerT App IO) (FormResult Img, Widget) 
imgForm hiddenInput = do
    (titleRes, titleView)   <- mreq textField uploadFormTitleSettings Nothing
    (descRes, descView)     <- mopt textareaField uploadFormDescriptionSettings Nothing
    (fileRes, fileView)     <- mreq fileField uploadFormAttachmentSettings Nothing

    let imgRes =  Img
              <$> titleRes
              <*> descRes
              <*> fileRes
              <*> pure (Likes 0)
              <*> pure (Dislikes 0) 
              <*> pure (UserID 1) 
              <*> pure (Community 1) 

    let imgUploadWidget = do
                      toWidget
                          [whamlet|
                              ^{ fvInput titleView }
                              ^{ fvInput descView }
                              ^{ fvInput fileView }
                              #{ hiddenInput }
                              <button type="submit">Submit
                          |]

    return (imgRes, imgUploadWidget)

postImgUploadR :: HandlerT App IO Html
postImgUploadR = do
    ((imgRes, imgUploadWidget), enctype) <- runFormPost imgForm
    let submission :: HandlerT App IO Html
        submission = case imgRes of
            FormSuccess upload -> defaultLayout [whamlet|The form was uploaded|]
            FormMissing -> defaultLayout [whamlet|The form is missing|]
            FormFailure upload -> defaultLayout [whamlet|The form failed.|]
    submission

不幸的是,我甚至不知道这里要问什么问题--希望我的代码有明显的问题,有人可以指出正确的方向。我花了一些时间阅读这些函数的源代码,我想我理解它,但我不知道第二个错误的CSRF令牌是从哪里来的(我假设它是在会话变量中设置的,因此不会改变)。几个小时过去了,我所有的努力都失败了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-03 09:10:22

事实上,这是我处理过的最费时的错误之一,也是我处理过的最平凡的答案之一。

不久前,我将sslOnlySessions添加到makeSessionBackend中,并忘记了这一点。我试着把我脑子里的每一种可能做错的事情都想一想,然后退了一步,想出一个不同的角度来处理这个问题,它像一堆砖块一样击中了我。

我把这个答案发布在10年后的某个人会犯同样愚蠢的错误的可能性上,在搜索他们的代码后,最终启动Google并找到一个简单的答案。

祝你好运,未来的哈斯凯勒。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31765108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档