Nonceの使用
TOPICS
翻訳元記事はこちらです。
WordPress nonces は、URL やフォームを悪用されないようにするために WordPress が生成する一回限りのセキュリティトークンです。
テーマがユーザーにデータの送信を許可している場合、それが管理者であれフロントエンドであれ、nonces はユーザーがアクションを実行する意思があるかどうかを確認するために使用することができ、クロスサイトリクエストフォージェリ(CSRF)から保護するのに役立ちます。
例として、許可されたユーザーが動画をアップロードすることを許可しているWordPressサイトがあります。許可されたユーザーが動画をアップロードすることは、意図的な行為であり、許可されています。しかし、CSRFでは、ハッカーは許可されたユーザーの利用許可を乗っ取り(偽造)、不正な投稿を行うことができます。
nonce によって生成された一回限りの使用ハッシュは、アップロード要求が現在ログインしているユーザによって行われたものであることを検証することで、この種の偽造攻撃の成功を防ぎます。nonce は現在のユーザのセッションにのみ固有のものなので、ログインやログアウトを試みると、ページ上のnonceは無効になります。
Nonceの生成
- wp_nonce_url() – URLにnonceを追加する
- wp_nonce_field() – フォームにnonceを追加する
- wp_create_nonce() – カスタマイズした方法でnonceを使用する。ajaxで特に有用です。
Nonceをチェックする
- check_admin_referer() – 管理画面のURLやフォームで渡されたnonceを検証する。
- check_ajax_referer() – nonce (参照元ではない) をチェックし、チェックに失敗した場合はデフォルトでスクリプトの実行を終了します。
- wp_verify_nonce() – 他のコンテキストで渡された nonce を検証します。
例
以下は、基本的なsubmitフォームの例です。
Nonceの生成
フォームを nonce で保護するには、 wp_nonce_field()
関数を使用してtype="hidden"
の nonce フィールドを作成します。
<form method="post">
<!-- some inputs here ... -->
<?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>
Nonceの検証
この例では、まず nonce フィールドが設定されているかどうかをチェックします。フォームが送信されている場合は、nonce フィールド値関数を使用します。nonce の検証が成功した場合、フォームは処理されます。
if (
! isset( $_POST['name_of_nonce_field'] )
|| ! wp_verify_nonce( $_POST['name_of_nonce_field'], 'name_of_my_action' )
) {
print 'Sorry, your nonce did not verify.';
exit;
} else {
// process form data
}
上記のコードは以下の流れです。
- nonceをwp_nonce_field()関数で生成します
- formをsubmitすると、nonceも送信されます
- wp_verify_nonce()関数を使用して、nonceの値をチェックします。nonceの値が有効でなければ、エラーメッセージを表示して、処理を抜けます。