Node.js 防止跨站请求伪造(CSRF)
示例
CSRF是一种攻击,它迫使最终用户在当前已通过身份验证的Web应用程序上执行不需要的操作。
之所以会发生这种情况,是因为Cookie随每个请求一起发送到网站-即使这些请求来自其他站点。
我们可以使用csurf模块创建csrf令牌并对其进行验证。
例
var express = require('express') var cookieParser = require('cookie-parser') //用于cookie解析 var csrf = require('csurf') //csrf模块 var bodyParser = require('body-parser') //用于身体解析 //设置路由中间件 var csrfProtection = csrf({ cookie: true }) var parseForm = bodyParser.urlencoded({ extended: false }) //创建快递应用 var app = express() //解析Cookie app.use(cookieParser()) app.get('/form', csrfProtection, function(req, res) { //生成并将csrfToken传递给视图 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>