根据之前的SO问题,已成功获得csrf中间件在Express中工作。它正在生成令牌,但它拒绝提交所有表单。
我能看到的唯一可能的冲突是我使用redis作为会话存储,使用connect-redis并将socket.io插入会话中,但我已经注释掉了套接字位,它仍然没有很好用。< / p>
这是我称之为中间件的顺序,有些可能在这里搞砸了吗?
(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,不确定哪里开始寻找问题。任何帮助,甚至只是在哪里开始挖掘非常感谢。
干杯。
答案 0 :(得分:4)
如果您查看Connect - csrf documentation,则令牌的input
标记应如下所示:
<input type="hidden" name="_csrf" value="{token}" />
使用您的示例令牌:
<input type="hidden" name="_csrf" value="5ODFxml1QAhQvOmq1QE6Qd7n" />
目前Connect(Express使用Connect引擎)试图找到名为“_csrf”的字段但找不到它,因为它在您的表单中不存在。因此,它禁止访问。