WordPressにはナンス生成/検証メカニズムがあります、そしてなぜそれが正しく機能していないのか理解できません...
ある時点で、ノンスが0-12時間前に生成されたかどうかをチェックします。
wp-includes\pluggable.php:1260
function wp_verify_nonce($nonce, $action = -1) {
$user = wp_get_current_user();
$uid = (int) $user->ID;
if ( ! $uid )
$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
$i = wp_nonce_tick();
// Nonce generated 0-12 hours ago
if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce )
return 1;
// Nonce generated 12-24 hours ago
if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) == $nonce )
return 2;
// Invalid nonce
return false;
}
if
はどのように機能しますか?
// Nonce generated 0-12 hours ago
if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce )
wp_hash($i . $action . $uid, 'nonce')
= 8ae70558afac4a6951e3bc0f9ef1f59a
および$nonce
= 3551
。 $nonce
の-12,10
番目の部分と8ae70558afac4a6951e3bc0f9ef1f59a
をどのように比較すれば、「0-12時間前」のチェックになりますか?
WordPressのナンスはあなたの通常の(一度だけ使用する)ナンスではありません。特定の$action
について、12時間ごとに新しいノンスが生成され、24時間有効なノンスがあるため、任意の時点で、特定の$action
に有効なノンスは2つあります。
ナンスはのハッシュ(の部分文字列)です。
$action
- アクション$uid
- ユーザーID$i
- インクリメント.増分は12時間ごとに1ずつ増加するため、特定のユーザーおよびアクションの現在のnonceがのサブストリングである場合
wp_hash($i . $action . $uid, 'nonce')
それから前の一回きり(同じユーザと行動のための)はの部分文字列です。
wp_hash(($i - 1) . $action . $uid, 'nonce')
どちらも有効なnonceなので、受け取った$nonce
をチェックするときに、両方が一致するかどうかをチェックします。
どのようにWordPress NONCEが実際に機能するか について詳しく説明します。また、承認された回答は、より正確な情報で更新する必要があります。これは、WordPressがノンスを作成するときにセッショントークンも考慮するためです。このリンクは、詳細な説明を加えた長い記事です。
まず、受け入れられた答えは、if
がどのように機能するかを述べていません。
それでは、分析してみましょうか?現在、ユーザーのセッショントークンも考慮に入れているため、現在のバージョンのステートメントを使用していることに注意してください。
$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
PHP関数 substr()
は、文字列の一部を返します。
ここで、wp_hash()
の評価は、substr()
が評価してその一部を返す文字列です。 -12
引数は、文字列の末尾から12文字(wp_hash()
の評価の結果)をカウントするように指示します。substr
は、そうする。
最後に、最後の引数10
は、sub文字列として10文字を返すように指示しています。
そのため、最後から12文字をカウントしてから10を返すので、返された結果から最後の2文字が取り除かれます。
WordPress NONCEをチェックすると、正確に10文字が含まれています。
私が明確にしたい別のポイントは、WP NONCEの寿命です。
実際にはalways lessであるため、ノンスが24時間有効であると言うべきではありません。 NONCEは最大24時間、最小12時間有効です。ベターは、2ティックの間有効です。
@Stephen Harrisが説明したように、ティックはNONCEの現在の寿命の増分です。
デフォルトでは、ティックはUTC時間から計算された12時間を表します。そのため、深夜+1秒と正午+1秒で、ティックの値は1
単位だけ増加します。
$token
が同じままである(ユーザーがログアウトして再度ログインしなかった)場合、wp_hash()
は指定されたアクションとユーザーIDに対して常に同じハッシュを返します。
これは、現在のティック値が1増加するまでtrueのままです。その場合、ハッシュは同じアクション、同じユーザーID、同じトークンに対して異なります。
これは、WordPressが作成された有効なnonce -12時間前とみなす方法です。
WordPressは、以前のティック値を使用してハッシュ関数とノンスを比較することにより、作成された有効なナンス12-24時間前も考慮します。しかし、これはすでに述べたように誤解を招きます。 12-24時間前期間は、指定されたNONCEの実際の明示的な作成時間を意味しません(言い換えるとnot using the- timestampはナンス作成の)ですが、作成されてから12〜24時間の範囲でと表示されます。実際に一意のティック値を参照します(現在の値より1少ない値)
時間の観点ではなく、ティックの観点からnonceの有効性を考慮すると、混乱が少なくなります。
したがって、妥当性を説明する最良の方法は
物事をより明確にしたい