りゅうじの学習blog

学習したことをアウトプットしていきます。

2022年3月27日 Node.js CSRFパッケージ

CSRF対策

  1. 書き込みできるドメインを限定する
  2. 適切な画面遷移でデータ登録されている事を確認する(トークン制御を入れる)
  3. キャプチャ(画面認証を入れる)

今回は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クラス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

参考

Udemy Node.js + Express + MySQL で作る 安全な Webアプリケーション 実践

CSRF攻撃対策についてNode.js Expressでアプリを構築して実例で理解する