2022年3月27日 Node.js CSRFパッケージ
CSRF対策
今回は2の対策をしていきます。
パッケージ導入
yarn add csrf
- ミドルウェアとして組み込みではなく、必要な箇所へ実装していくものです。
具体的な実装方法
secretとtokenの生成と検証
const Tokens = require('csrf'); const tokens = new Tokens(); (async function () { // 発行 const secret = await tokens.secret(); const token = tokens.create(secret); // 検証 if (!tokens.verify(secret, token)) { throw new Error("invalid token!"); } })();
- secretはサーバー保持(セッション)
- tokenはクライアント返却(クッキー)
この2つの組み合わせが正しくないとNGだという仕組みがCSRF対策です。
データ登録の直前に検証をします。
例えば登録→確認→完了という遷移をする際に、登録→確認の遷移時(登録の内容をサーバにリクエストする時)にそのリクエストが正当なものか?を検証しても意味ない(あくまで、確認→完了の遷移の際(データ登録時)にそのリクエストが正当である事を確かめる必要がある)
Tokensクラス コンストラクタ
引数 options
- saltLength 内部利用するsalt長さ。デフォルト 8。
- secretLength secret長さ。デフォルト18。
戻り値
- tokensインスタンス
TokensクラスAPI
secret()
- 構文
tokens.secret(callback)
サーバー保存するsecretの生成- 引数 callback
(err, secret) ⇒ {}
secret生成後に呼び出される関数 - 戻り値 引数がない場合はPromise
create()
- 構文
tokens.create(secret)
クライアントへ戻す tokenの生成 - 引数 secret secret()で生成されたsecret文字列
- 戻り値 token文字列
verify()
- 構文
tokens.verify(secret, token)
与えられたsecretとtokenの組み合わせが正しいか検証 - 引数 secret 生成したsecret token 生成したtoken
- 戻り値 組み合わせが正しい場合 true それ以外 false
- 引数 callback