私は私達がここで30秒、filterを使って一回限りのライフタイムを変えることができるという事実を知っています:
add_filter( 'nonce_life', function () { return 30; } );
私は私の残りのapiのためのlogout()関数を持っています。私は成功したログインの後に私が作成した一回だけを期限切れにしたいです:$nonce = wp_create_nonce( 'login'.$user_id );
一回限りの期限切れの問題は、WordPressでは、一回限りの回数という純粋な意味では、一回だけではないということです。そうではなく、WP nonceは、特にユーザーID、アクション名、phpセッショントークンなど、生成された時点の拍子記号を含む文字列の(aの部分文字列)ハッシュです。そのため、一度生成されると、それはそのままで、「使用期限」が焼き付けられているため、期限切れにすることはできません(また、延長することもできません)。
wp-includes/pluggable.php
にナンスがどのように組み込まれているかがわかります。
function wp_create_nonce($action = -1) {
$user = wp_get_current_user();
$uid = (int) $user->ID;
if ( ! $uid ) {
/** This filter is documented in wp-includes/pluggable.php */
$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
}
$token = wp_get_session_token();
$i = wp_nonce_tick();
return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
同じ基準セットがwp_verify_nonce()
で使用されています:nonce_tick(これは時間要素です)、action、token、およびuidはすべて同じ順序で組み合わされてハッシュされ、送信されたnonceと比較されます。そのため、これらのいずれかが変更された場合、ハッシュは一致せず、ナンスは拒否されます。
WPは、送信された文字列がアクションと共にnonce文字列を渡したときに生成される期待値と(phpのhash_equals()
を介して)時間が一致するかどうかによってのみ検証されます。ナンスとアクションが現在のユーザーIDとセッショントークンと組み合わされて、time-hashチェックと一致するハッシュサブストリングを作成する場合は、合格です。
WP nonceを "真の" nonceにすることが欠けているのは、それがすでに一度も使用されているか処理されているかどうかを確認するためのチェックです。
セキュリティの前提は、誰かがnonceとそれに対応するアクションを知らなくても、それが生成されたのと同じユーザーIDとphpセッショントークンを使用して送信する必要があるため、重要ではないということです。ハッカーがあなたのデバイスを乗っ取ってあなたのようにログインしていない限り…しかしそれまでにあなたは別の種類のセキュリティ問題を抱えている。