ホームページ  >  記事  >  バックエンド開発  >  PHP の == と「暗黙的な変換」

PHP の == と「暗黙的な変換」

WBOY
WBOYオリジナル
2016-06-23 13:34:151687ブラウズ

はじめに

最近、Hacker News (https://news.ycombinator.com/item?id=9484757) に、Web サイトのパスワードの暗号化方式を検出する方法について言及した投稿がありました。

<?phpvar_dump(md5('240610708') == md5('QNKCDZO'));var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));var_dump('0x1234Ab' == '1193131');

結果は次のとおりです:

bool(true)bool(true)bool(true)

Web サイトで 240610708 をパスワードとして使用し、QNKCDZO でログインし、ログインできた場合、パスワードが MD5 に保存されていることを意味します。同様に、パスワードに aaroZmOk を使用し、aaK1STfY でログインできた場合は、パスワードが sha1 モードで保存されていることを意味します。 3 番目のタイプは、もちろん平文ストレージです。

分析

最初の数値セットを例として挙げます:

md5('240610708') 的结果是:0e462097431906509019562988736854md5('QNKCDZO') 的结果是:0e830400451993494058024219903391

PHP は弱い型指定言語であるため、== 記号を使用する場合、数値と文字列を比較する場合、または数値コンテンツを含む文字列を比較する場合、文字列はbe 数値に変換し、数値として比較します。このルールは switch ステートメントにも適用されます。上記の例の 2 つの文字列は科学表記法ではたまたま 0e で始まりますが、これらの文字列は暗黙的に浮動小数点数に変換され、実際には 0×10^0 と同等であるため、同等と比較されます。

<?phpvar_dump( 0 == "a" );var_dump( "0" == "a" );
に似ています

最初のものは true を返し、2 つ目は false を返します

結論

PHP のハッシュ検証では、「==」の代わりに「===」を使用する必要があります。さらに、運用環境のバージョンが十分に高い場合 (PHP >= 5.6.0)、 hash_equals() 関数を使用するのが最善です。

hash_equals() 2 つの文字列を比較する場合、それらが等しいかどうかに関係なく、関数の消費時間は一定であり、タイミング攻撃を防ぐために使用できます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。