unoh.github.com

0 == 'hoge' は true

Mon Apr 17 21:03:11 -0700 2006

こんにちは,ttsuruoka です.
結構有名な話なのですが,知らない人が居たのでここで紹介しておきます.

PHP で文字列を比較するときに,

if ($s == 'mypassword')

のように == 演算子を使うと,
とても簡単に文字列の比較ができて便利なのですが,
$s が整数の 0(あるいは浮動小数点数の 0.0 など)のときに真(true)になってしまいます.
これは,数値と文字列の比較が行われたときに
文字列('mypassword')が自動的に数値に型変換されて,
0 として扱われるためです.

また,どんな文字列でも数値に型変換されると 0 になるか,
というとそうではなくて,例えば,

if ($s == '100yen')

は $s が '100yen' あるいは 100 のときに真になります.
これは $s が 0 でも真になりません.

あと,上の 'mypassword' のように == 演算子を使って
HTML フォームから受け取ったパスワードなどをチェックしているプログラムは
一見脆弱なように見えますが,
HTML フォームから送られたデータは文字列として扱われるので
フォームから数値の 0 を送ろうとしても,

if ('0' == 'mypassword')

のように文字列同士の比較となり,これは真にはならず命拾いします.

数値に変換されると困るとき,厳密に文字列を比較したいときは,
PHP4 から導入されている === 演算子や strcmp() 関数などを使えば OK です.