私はPHP eval()の悪用についてもっと学びたいと思っていて、このシナリオに出くわしました:
<?php
$test = array();
$test[0] = "command0 ";
$test[1] = $_GET["cmd1"];
$test[2] = "command2 ";
$test[3] = "command3 ";
$params = "";
for ($i = 0; $i < count($test); $i++) {
$params .= "\$test[$i]";
}
echo $params;
echo "<br>";
$cmd = "echo \"" . $params . "\";";
echo $cmd;
echo "<br>";
eval($cmd);
?>
$ _GETパラメータに二重引用符とバックスラッシュのいくつかの組み合わせを挿入しようとしましたが、$ cmd文字列を抜け出すことができませんでした。
XSSバグを超えて、このコードスニペットは脆弱ですか?これは、PHPコードインジェクションで悪用される可能性がありますか?
いいえ、これはPHPコードインジェクションに対して脆弱ではありません。
eval()
に渡される文字列は、単にユーザーが制御するものではありません。ソース_$_GET["cmd1"]
_からシンクeval()
へのパスはありません。
eval()
の引数は_$cmd
_です。$cmd
_は、固定文字列と_$params
_からアセンブルされます。$params
_は、固定文字列と_$i
_から累積されます。$i
_は、配列_$text
_の(固定)長さに依存する反復変数です。とはいえ、生成された配列をevalを介して渡すのは確かに良いスタイルではなく、出力をサニタイズしていないため、コードがXSSに対して脆弱になります。
ここで評価しているコードは実際には完全に修正されているため、PHPここではコードインジェクションはできません。
eval
edを取得するコードは常に:
echo "$test[0]$test[1]$test[2]$test[3]";
これらの変数は文字列データとして参照されるため、安全です(XSSを除く)。