PHP は型付けが弱い言語であり、データ型変換を自動的に実行します。これは間違いなく開発に大きな利便性をもたらします。しかし、本当にそうなのでしょうか?今日は == から始めます。
例
まず、このコードを見てください。結果がどうなるか予想してください
<?php var_dump(md5('240610708') == md5('QNKCDZO')); var_dump(md5('aabg7XSs') == md5('aabC9RqS')); var_dump(sha1('aaroZmOk') == sha1('aaK1STfY')); var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m')); var_dump('0010e2' == '1e3'); var_dump('0x1234Ab' == '1193131'); var_dump('0xABCdef' == ' 0xABCdef'); var_dump(0 == 'abcdefg'); var_dump(1 == '1abcdef'); ?>
一見すると、これらがすべて false であることは明らかですが、コードを実行した後、それらはすべて true であることがわかりました。
なんと!
これはなぜでしょうか?
PHP は弱い型付け言語であると冒頭ですでに述べました。 == を使用して 2 つの変数を比較する場合、一方の変数が整数の場合、もう一方の変数も整数に変換されます。これは、0 == 'abcdefg' と 1 == '1abcdef' が真である理由も説明します。
しかし、他のコードはどうでしょうか?文字列は引き続き変換できますか?
PHP マニュアルに説明があります。
数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、比較は数値的に実行されます。
つまり、次のような 2 つの文字列を比較する場合です。数値 (例: "0") の場合、各文字列は数値に変換されます。
ここで、私は言わなければなりません: PHP は最高の言語です!
危険性
当社のWebサイトがソルトを追加せずにMD5またはSha1によって直接暗号化されており、ユーザーのパスワードの暗号化に数字が含まれている場合、解読される可能性があります。衝突により!
解決策
1. 開発プロセス中は、2 つの変数の値を判断するために == をできるだけ使用しないでください。
2.パスワード暗号化のpassword_hash()またはsalt md5($pwd.$salt)を使用するのが最善です
PHP関連の知識の詳細については、PHP中国語Webサイトをご覧ください。
以上がPHP における「==」のいくつかの落とし穴の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。