WordPressのajaxを使ったnonce認証ではまった

2018年4月1日

当サイトはアフィリエイト広告を利用しています。

WPのnonce認証。

いわゆるCSRF対策です。
WPのDBを更新することがないユーザー(一般のサイト閲覧のみのユーザー)であれば、基本的には使わなくても大丈夫のようですが、ajax等を処理する場合は、あった方がよいようです。

下記の参考サイトをもとにコードを作成。とりあえず、テストでwp_verify_nonceで、認証確認するようにしました。
(check_ajax_refererとwp_verify_nonceは、認証エラーの場合にdeiがあるかないかの違いです。)

でも、早速、認証が通らずエラーになってしまいました。ソースは間違いもなく、PHP、JS共にエラーはなさそうでした。

しかたないので、全てをechoして原因を調べます。
wp_verify_nonceは、wp-includes/pluggable.phpにソースがあるので、変数をechoで調べました。

wp_verify_nonce関数の場所。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_verify_nonce

echoした結果、どうやら、UID(ログインしたユーザー、ログアウトしたユーザーなど)をチェックしているらしく、それが一致していませんでした。

とった対策としては、管理画面にログインしているアカウントをログアウトしただけ。これで、認証確認すると通りました。
また、管理画面に再度ログインしなおして、認証確認しても、認証されました…orz

ずっと管理画面にログインしたままだったので、そのUIDが新しくソースを書いた時点でのUIDと一致していなかっただけのようです。

※追記
check_ajax_refererに変更する場合、
check_ajax_refererの2番目のパラメータは$_REQUESTの渡す変数名だけです。

wp_verify_nonce( $_REQUEST['nonce'], 'my_ajax_action' )
なら、
check_ajax_referer( 'my_ajax_action', 'nonce', false )というように、2番目のcheck_ajax_refererに渡す変数は、$_REQUEST[]に渡す変数名の部分だけです。

参考サイト
認証方法
http://tokkono.cute.coocan.jp/blog/slow/index.php/wordpress/secured-ajax-with-wp-nonce/
http://chaika.hatenablog.com/entry/2017/09/08/090000

-ワードプレス
-,