防止跨站请求伪造(CSRF)
CSRF 是一种攻击,它迫使最终用户在他/她当前经过身份验证的 Web 应用程序上执行不需要的操作。
之所以会发生这种情况,是因为每次向网站发出请求都会发送 cookie - 即使这些请求来自不同的网站。
我们可以使用 csurf
模块创建 csrf 令牌并验证它。
例
var express = require('express')
var cookieParser = require('cookie-parser') //for cookie parsing
var csrf = require('csurf') //csrf module
var bodyParser = require('body-parser') //for body parsing
// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })
// create express app
var app = express()
// parse cookies
app.use(cookieParser())
app.get('/form', csrfProtection, function(req, res) {
// generate and pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
app.post('/process', parseForm, csrfProtection, function(req, res) {
res.send('data is being processed')
})
因此,当我们访问 GET /form
时,它会将 csrf 标记 csrfToken
传递给视图。
现在,在视图内部,将 csrfToken 值设置为名为 _csrf
的隐藏输入字段的值。
例如,对于 handlebar
模板
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
Name: <input type="text" name="name">
<button type="submit">Submit</button>
</form>
例如,对于 jade
模板
form(action="/process" method="post")
input(type="hidden", name="_csrf", value=csrfToken)
span Name:
input(type="text", name="name", required=true)
br
input(type="submit")
例如,对于 ejs
模板
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
Name: <input type="text" name="name">
<button type="submit">Submit</button>
</form>