質問: ### 前提・実現したいこと wordpressで 自作問い合わせフォームを作成しております。 問い合わせフォームの確認画面(form1.php)から、「送信」を押した際(form2.phpへpost)、 セキュリティ強化のためにwp_nonce_field()を使い、wp_verify_nonce()でチェックできるようにしました。問題なくデータを渡して処理はできたのですが、 トークンがinput=”hidden”で出力されているのが気になり始め、 フォーラムを参照し、 wp_nonce_field( ‘my_action’ ,’my_nonce’, true, false); wp_referer_field(); と設定しましたところ、うまく処理が進まなくなってしまいました。 (正規のルートなのに、ちゃんとしたアクセスだと認識してくれない。) nonceを非表示にして次ページに渡すにはどうしたらよろしいでしょうか? (またで渡してもセキュリティ的に問題ないでしょうか? タグに出力されているのが気になっております。) ### form1.php ### form2.php
回答: > > nonceを非表示にして次ページに渡すにはどうしたらよろしいでしょうか? > > > 「HTMLにも非表示にするけどPOST時には渡したい」というのであれば、無理です。というのも、POSTは**ブラウザから**行うものである以上、POSTさせる値(JavaScriptで生成するにしても、少なくともその原料となる値)はブラウザに渡さないといけないからです。 一方で、ログイン状態だけで認証を行っていると、有効なログインに乗じて第三者が不適切なデータを投げる**CSRF**が発生しますので、ログイン状態以外の検証ルートを設けるというのはセキュリティ的に必要です。 > > で渡してもセキュリティ的に問題ないでしょうか? > > > nonceは英単語として「その場限りの」というような意味があり、また「number used once」の略ともされるように、次の画面で検証するために生成したその場限り、使い捨ての値です。攻撃者に取得されても、使い道はほぼありません。