WordPressにはnonceという仕組みがあり、そのnonceを使うことで、CSRF対策ができる。
nonceとは
nonceを簡単に説明すると、WordPressが発行するセキュリティトークンのこと。
これを受け取り、認証することで、悪意のない正式なユーザーから、正しくpostされたかを認証できる。
CSRF対策につながる。
これはWordPressなら、必須と言っていいだろう。
使用例
formの中で使用する際はwp_nonce_field()を使う。
<form method="post">
<!-- some inputs here ... -->
<?php wp_nonce_field( 'action_name', 'nonce_field_name' ); ?>
</form>
※action_nameとnonce_field_nameは各自で適宜設定した名前に置き換えてほしい。
関数を引数なしでそのまま使った場合は、actionに-1,nonceに_wpnonceが入るが、セキュリティ的に落ちるので各自で設定しておくとよい。
form送信先では、フロント側か管理画面側で処理が異なる。
フロント側では、wp_verify_nonce関数を使って認証する。
<?php
if ( ! isset( $_POST['nonce_field_name'] ) || ! wp_verify_nonce( $_POST['nonce_field_name'], 'action_name' ) ) {
print 'nonceを認証できませんでした。';
exit;
}
となる。
管理画面側ではcheck_admin_refererで認証する。
<?php
if ( !empty( $_POST ) && check_admin_referer( 'action_name', 'nonce_field_name' ) ) {
// 認証成功
}
なお、check_admin_refererがfalseとなった場合は自動で処理が終了し、failedページが表示される。
参考サイト
Nonces – Common APIs Handbook | Developer.WordPress.org
A nonce is a “number used once” to help protect URLs and forms from certain types of misuse, malicious or otherwise.…
https://wpdocs.osdn.jp/WordPress_Nonce