😉
PHPのif条件判定文のインジェクション
こんにちは、今日はPHPのif文条件判定のカッコ内で出来ることを整理します。
知らなくても、困ることはないでしょうが、
知っておくといいこともあるのかなと思います。
判定カッコ内では変数の展開不可
下が最初どうなるのかなと考えたのか発端です。
結論を言えば、インジェクションは出来ないです。
expand_variable.php
<?php
$a = "true){echo "Evil message...";}if(false";
if($a){
echo "\$a was true!";
}
$a was true!
これは$aが文字列として扱われ、"Evil message..."は表示されません。
$a = "false"ですらtrue扱いなので、ある意味当然なのですが。
判定カッコ内では関数は実行される
では、関数にしたらどうでしょう?
execute_function.php
<?php
if(print("Print executed!<br />")){
echo "Also shown!";
}
これ出力は
Print executed!
Also shown!
になります。ifのカッコ内では関数実行は可能なんです。
出力は大抵、成功時にtrueを返す関数が多いですから、
多くの工夫した利用ができそうですね。
例えば、ファイルアップロードの成否とか、
データベースアクセスのfetch関数とか、
おなじみだと思います。
ちなみに"echo"は関数ではなく言語構造だから、
"print"を"echo"にするとエラーになります。
セキュリティでインジェクションとか学んでいると、
アクセスの権限の判定で
if(!$_SESSION['logged_in']){
header("location:login.php");
exit;
}
みたいな書き方まで心配になってきますが、
「変数は展開されないから、大丈夫だよ!」という事なんですね。
今日はここまで、お疲れ様でした!
Discussion