ホームページ  >  記事  >  バックエンド開発  >  PHP における「==」のいくつかの落とし穴

PHP における「==」のいくつかの落とし穴

藏色散人
藏色散人転載
2019-10-11 13:13:393140ブラウズ

PHP は型付けが弱い言語であり、データ型変換を自動的に実行します。これは間違いなく開発に大きな利便性をもたらします。しかし、本当にそうなのでしょうか?今日は == から始めます。

まず、このコードを見てください。結果がどうなるか予想してください

<?php
var_dump(md5(&#39;240610708&#39;) == md5(&#39;QNKCDZO&#39;));
var_dump(md5(&#39;aabg7XSs&#39;) == md5(&#39;aabC9RqS&#39;));
var_dump(sha1(&#39;aaroZmOk&#39;) == sha1(&#39;aaK1STfY&#39;));
var_dump(sha1(&#39;aaO8zKZF&#39;) == sha1(&#39;aa3OFF9m&#39;));
var_dump(&#39;0010e2&#39; == &#39;1e3&#39;);
var_dump(&#39;0x1234Ab&#39; == &#39;1193131&#39;);
var_dump(&#39;0xABCdef&#39; == &#39; 0xABCdef&#39;);
var_dump(0 == &#39;abcdefg&#39;);
var_dump(1 == &#39;1abcdef&#39;);
?>

一見すると、これらがすべて 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 サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。