【WordPress】【セキュリティ対策】WordPressのnonceの挙動を知ろう
こんにちは、webエンジニアのゾノ( @ozonosho )です。
前回の記事に続いて、今回もWordPressを利用したサイトのセキュリティ対策について書きます。
今回はWordPressのnonceの挙動についてです。
突然ですが、世の中にはサイトの送信データを自由に書き換えることができるリクエスト改ざんツールというものが存在します。
リクエスト改ざんツールを利用すると、たとえば「フォーム送信後に送信内容を書き換え、フォームの制御を無視してスクリプト情報を送信する」といった攻撃ができてしまいます。
(補足しておくと、リクエスト改ざんツール自体はセキュリティチェックのためにも使うので悪いものではありません)
不正リクエストはサーバー側でのバリデーション(送信データを受け取った際に変なデータが無いか判別する処理)を適切に入れることで防げますが、まず最初に「正規のページからきちんと送信された情報かどうか」をチェックすることでセキュリティを強固にできます。
このような、不正リクエスト攻撃への対策をCSRF対策と呼びます。
CSRF対策の根幹となる手法はトークン発行&認証です。
WordPressだと「wp_create_nonce」関数等を利用してnonce(=トークン)を発行できます。
- トークン発行&認証の流れ
-
- データを送信する前にランダムなトークンを発行し、送信時にトークン情報をセッションに保存したうえで送信する
- データを受け取った際に、セッションに保存したトークン情報と送信データ内にあるトークン情報を比べて、一致しない場合(=不正リクエストの場合)は処理しない
このような流れで、正規の手順を踏んだユーザーからのリクエスト以外を弾くようにします。
とても重要な対策なので、WordPressに元々備わっている機能(パスワード変更、投稿削除、などなど)にはすべてWordPressのnonceが利用されています。
そのため、ご自身でフォームを作成する場合や、既存機能をカスタマイズする場合にはnonceの概念を知っておく必要があります。
※簡単な使い方例はCodex参照
※近々「WordPressで自作のログインフォームを作ってみよう」なんて記事を書こうと思っているのでそこでも実例を記載します
ただ、このWordPressのnonce。
通常利用されるnonceとは少し異なる特徴を持っていて、良い面と悪い面があるんですよね。
WordPressのnonceの特徴
CSRF対策をおこなううえで必須とも言えるnonce(=トークン)の発行&承認ですが、WordPressのnonceは通常のnonceと少し異なる特徴を持っています。
知っておいたほうが良い大きな特徴は下記2点です。
- WordPressのnonceの特徴
-
- 1回限りのワンタイムトークンではなく一定期間値の変わらないトークン(たしか12-24時間ごとに更新)
- 同じユーザーでも状態によってトークンの値が変わる
②について補足すると、「ログインしているかしていないか」「どのユーザーとしてログインしているか」などの状態が加味されてトークンの値が変わります。
(ちなみにログインしていないユーザーには一律で同じトークン値が割り当てられるっぽいです)
WordPressのnonceは発行から認証まで関数が用意されているので使いやすい反面、この①②の特徴によってデメリットがある、と個人的には感じています。
- ①のデメリット
-
- たとえばパスワード変更時、URLにWordPressのnonceを付与して承認するような作りにすると、(nonceとは別で制御しない限り)nonceの期限が切れるまで同じURLで何度もパスワード変更できてしまう
- フォーム送信ページなどで送信後に同ページをリロードすると(nonceとは別で制御しない限り)同じ処理が認証されてもう一度送信されてしまう
- ②のデメリット
-
- 非ログインユーザーのトークン値が一律で同じ値なのでセキュリティリスクがある
- URLにnonceを付与して承認する作りのページがある場合、ログイン時にURLを発行し、非ログイン時に承認しようとすると承認できない
(たとえば登録アドレスの変更をしようと思ってログイン状態でアドレス変更確認メールを送信、その後、非ログイン状態でnonce値付きリンクをクリックすると承認されない)
こんな感じです。
個人的には使いやすさよりもデメリットのほうを強く感じてしまうので、、、最近はCSRF対策にWordPressのnonceは利用せず独自にトークン発行&承認をするようにしています。
おわりに
以上、今回の記事ではWordPressのnonceの挙動について紹介させていただきました。
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。