現在Node.js+ExpressでWebアプリを作成しています。
CSRF対策としてcsurfモジュールを利用しております。
GithubにあるREADMEを参考に記述しておりますが、Expressで開発していることを外部に分からないようにしたいので、Cookieのキーをデフォルトの'_csrf'から変更したいのですが、__403 invalid csrf token__となってしまい、うまく動作しません。
Routerモジュール
Jaavascript
1'use strict'; 2const express = require('express'); 3const router = express.Router(); 4const cookieParser = require('cookie-parser'); 5const bodyParser = require('body-parser'); 6const csrf = require('csurf'); 7 8// csrfProtection = csrf({ cookie: true })だと 9// デフォルトの{ key: '_csrf', path:'/' }が適用される 10const csrfProtection = csrf({ cookie: { key: 'my_csrf', path: '/' } }); 11const parseForm = bodyParser.urlencoded({ extended: false }) 12 13router.use(cookieParser()); 14 15router.get('/form', csrfProtection, function (req, res) { 16 // pass the csrfToken to the view 17 res.render('send', { csrfToken: req.csrfToken() }) 18}) 19 20app.post('/process', parseForm, csrfProtection, function (req, res) { 21 res.send('data is being processed') 22})
Viewテンプレート
pug
1form(method="post", action="/schedules").my-3 2 // - != は内容をエスケープせずに出力する 3 input(type="hidden" name="my_csrf" value!=csrfToken)
そもそも、デフォルトのキー名'_csrf'でも問題ないのでしょうか?
デフォルトのキー名では問題なく動作し、さらにoption指定で、デフォルトの値と同じものを指定した場合も問題なく動きます。
キー名を変更した場合のみエラーが生じています。
javascript
1// デフォルト指定では問題なし 2csrfProtection = csrf({ cookie: true }) 3// オプション指定で、デフォルトの値と同じものを記述しても動作する 4const csrfProtection = csrf({ cookie: { key: '_csrf', path: '/' } }); 5// キー名を変更した場合のみinvalid csrf tokenとなる 6const csrfProtection = csrf({ cookie: { key: 'my_csrf', path: '/' } });
こちら、解決策や参考になる文献等ご教示いただければ幸いです。
あなたの回答
tips
プレビュー