私はチャレンジを解決しようとしています、そしてそれは PHP juggling に関係しているのではないかと思います。これは、このbase64エンコードされたjson cookeを応答{"User":"foo","MAC":"bar"}
として取得するためです。
バグ#2
計算されたMAC(つまり、
hash_hmac()
の結果)は、16進文字を含む文字列です緩やかな比較を使用すると、JSONペイロードで整数が提供された場合、HMAC文字列は数値に変換されます
MACの場合、たとえば"ff6d0...5885d"
の場合、PHPジャグリングは、最初の数値であるため、int(6)
と比較されます。私の考えは、POSTとbase64エンコードされたjson:{"User":"Admin","MAC":6}
しかし、これはうまくいきませんでした...ジャグリングは、数値で始まるMACでのみ機能しますか?
アルゴリズムPHP文字列を整数に強制変換するために使用するものは ここに記載されています です。特に:
値は文字列の最初の部分によって与えられます。文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は0(ゼロ)になります。
あなたの仮定はそれでした:
MAC、たとえば「ff6d0 ... 5885d」では、PHPジャグリングは最初の数値なので、int(6)と比較されます。
ただし、_6
_はその文字列の先頭には表示されず、非数値シーケンスff
の後にのみ表示されます。したがって、値はint(0)
に強制変換されます。
ただし、「6ffd0 ... 5885d」などの別のハッシュがある場合、_6
_は文字列の先頭に表示されるため、文字列はint(6)
に強制変換されます。
ご想像のとおり、この強制は特定の状況での比較中に発生する可能性があります マニュアルの比較演算子に関する注記 で説明されています。