query.sql
次の内容で呼び出されたファイルがあるとします。
SELECT * FROM `users` WHERE `id`!=".$q->Num($_POST['id'])."
そして、「id」という名前の入力を含むhtmlフォームを持つphp-scriptで、次のトリックを実行します。
$sql=file_get_contents('query.sql');
$query= eval("return \"$sql\";");
//here follows something like $mysqli->query($query); and so on..
プリペアドステートメントを使用してチェックを実行しているので、SQLインジェクションについては心配していません。しかし、evalをそのように使用するのは安全ですか?$q->Num
is_int
私が理解している限り、ここで実際に評価されるのは「$ {_ POST ['id']}」であり、ユーザーが入力した文字列値に評価されます。そして、これは、この文字列を2回評価した場合にのみ危険になります。私は文字列を一度だけ評価しますが、ユーザーの入力は単なる文字列であり、コンパイラーによってphp-codeとして解釈することはできず、php-injectionは不可能です。
更新 さまざまな方法論を提案し、準備されたステートメントを使用する必要性を強調していただきありがとうございます。しかし、これは私の質問ではありません。私の質問はすべてphp-injectionsについてです。そのようなevalの使用は悪いですか?はいの場合、なぜですか?