検証:GET値を比較演算子で比較する

Read More

実行結果メモ


一言でいうと
挙動が理解できない



以下のようなURIがあるとする
http://hoge.com/?flg=0



このURIを叩いた時、
レシーバ側でどのif文が実行されるか
<?php
$aryExe = array();
if($_GET['flg']==0) {// 左辺と右辺が等しい
  $aryExe[] = 'exe1';
}
if($_GET['flg']===0) {// 左辺と右辺が等しく、かつ同じデータ型である
  $aryExe[] = 'exe2';
}
if($_GET['flg']=='0') {
  $aryExe[] = 'exe3';
}
if($_GET['flg']==='0') {
  $aryExe[] = 'exe4';
}
echoecho($aryExe, 'aryExe');
?>




答えは、
array (
  0 => 'exe1',
  1 => 'exe3',
  2 => 'exe4',
)

である


このことからわかることは、
URIのGETパラメータで0を渡したら、
文字列の0
として受け取っている、ということだ

ここまでは良い


次に、
http://hoge.com/?flg=0

と渡す。
わかりずらいかも知れないが0は全角の0(ゼロ)だ


この結果は
array (
  0 => 'exe1',
)

こうなる


???


URLエンコードあたりを疑ったりしたのだが違うようだ。

唯一つ言えることは、GET値には
単純な比較演算子(==)を使うのは×
ということが言える


Comments(2)

1  シラサヤ  2010/11/10 (水) 21:39 ID:XXXXXXXXX
追加検証

レシーバ側に以下の二つを追加
if($_GET['flg']=='あ') {
$aryExe[] = 'exe9';
}
if($_GET['flg']==='あ') {
$aryExe[] = 'exe10';
}

この状態で
http://hoge.com/?flg=あ
とした


実行結果は、
array (
0 => 'exe1',
1 => 'exe9',
2 => 'exe10',
)

となった

やはり0の単純比較(==)がヒットしている


GETパラメータは特に容易に値を変更することができるので、
セキュリティ的に、
必ず厳格な比較(===)を使用した方が良いと思われる。


でないと思わぬ実行結果になりかねない

2  シラサヤ  2011/01/26 (水) 17:19 ID:XXXXXXXXX
ここに答えっぽいことが書いてあった
http://techblog.ecstudio.jp/tech-tips/php-string-compare.html

今度ちゃんと検証してみる