koa-csrf

koa-csrf

Cross-Site Request Forgery 跨站请求伪造

koa-csrf

原理

它在session中保存一个secret字段,然后使用它生成token,其中salt是随机生成的字符串,长度可自定。每次请求时都会重新生成salt,于是每次token也会不同。

1
2
3
4
5
var hash = crypto
.createHash('sha1')
.update(salt + '-' + secret, 'ascii')
.digest('base64');
token = salt + '-' + hash;

验证的时候,只需要取出token头部的salt,再从session中取出secret,再生成expected,与token对比

默认不检查GET,HEAD,OPTIONS请求

使用

与session配合使用,在请求时附带字段_csrf:token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var koa = require('koa')
var csrf = require('koa-csrf')
var session = require('koa-session')
var Router = require('koa-router');
var bodyParser = require('koa-bodyparser');
var app = koa();
var router = Router();
app.use(bodyParser());
app.keys = ['session secret']
session(app)
app.use(csrf());
router.get('/', async ctx => {
ctx.body = ctx.csrf;
})
router.post('/', ctx => {
ctx.body = ctx.request.body
});