首页 文章

CSRF中间件导致Node.JS Express出现问题

提问于
浏览
4

已成功获得csrf中间件按照以前的SO问题在express中工作 . 它正在生成令牌,但它拒绝所有表单提交 .

我能看到的唯一可能的冲突是我使用redis作为会话存储,使用connect-redis并将socket.io插入会话中,但我已经注释掉了套接字位,但它仍然没有很好用 .

这是我称之为中间件的顺序可能会在这里搞砸了吗?

(CoffeeScript的)

app.configure ->
    app.set 'views', __dirname + '/views'
    app.set 'view engine', 'jade'
    app.use express.bodyParser()
    app.use express.methodOverride()
    app.use express.cookieParser()
    app.use express.session
        secret: "itsasecret"
        store: sessionStore
    app.use express.csrf()
    app.dynamicHelpers
        token: (req, res) ->
        req.session._csrf
    app.use app.router
    app.use express.static(__dirname + '/public')

这是响应发布数据的路由 .

(这不是开发代码,只是我学习节点我很清楚,如果我把它放在网上这将是一个怪物)

app.post '/admin/logintry', (req, res) ->
    if req.body.username is 'Tim' and req.body.password is 'TempPassword'
        req.session.adminIn = true
        res.redirect '/admin/home'
    else
        res.redirect '/admin/login?failed=true'

以下是到达表单页面上的浏览器的HTML:

<input type="hidden" token="5ODFxml1QAhQvOmq1QE6Qd7n">

从“/ admin / logintry”收到的回复:

Forbidden

Node,Express和SO的新手,最近才正确学习javascript,不确定哪里开始寻找问题 . 任何帮助,甚至只是在哪里开始挖掘非常感谢 .

干杯 .

1 回答

  • 4

    如果查看Connect - csrf documentation,令牌的 input 标记应如下所示:

    <input type="hidden" name="_csrf" value="{token}" />
    

    所以使用您的示例令牌:

    <input type="hidden" name="_csrf" value="5ODFxml1QAhQvOmq1QE6Qd7n" />
    

    目前Connect(Express使用Connect引擎)试图找到名为“_csrf”的字段但找不到它,因为它在您的表单中不存在 . 因此,它禁止访问 .

相关问题