読み取りまたは書き込み、永続的または一時的のいずれであっても、任意のクエリを挿入できます。インジェクションは、1つのクエリを終了し、別のクエリを実行することで実行できます( mysqli
で可能) )、目的のクエリを無関係にします。
ユーザーからのものであれ、内部からのものであれ、外部ソースからのクエリへの入力は、クエリへの引数、およびクエリのコンテキスト内のパラメータと見なす必要があります。クエリ内のパラメータはすべてパラメータ化する必要があります。これにより、適切にパラメータ化されたクエリが作成され、そこからプリペアドステートメントを作成し、引数を使用して実行できます。例:
SELECT col1 FROM t1 WHERE col2 = ?
?コード> パラメータのプレースホルダーです。
mysqli
の使用 、 prepare
を使用してプリペアドステートメントを作成できます 、 bind_param
を使用して変数(引数)をパラメーターにバインドします 、 execute
を使用してクエリを実行します 。議論を無害化する必要はまったくありません(実際、そうすることは有害です)。 mysqli
あなたのためにそれをします。完全なプロセスは次のようになります:
$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();
パラメータ化されたクエリの間にも重要な違いがあります およびプリペアドステートメント 。このステートメントは、準備されていますが、パラメーター化されていないため、インジェクションに対して脆弱です。
$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
要約すると:
- すべて クエリは適切にパラメータ化する必要があります(パラメータがない場合を除く)
- すべて クエリへの引数は、ソースに関係なく、可能な限り敵対的なものとして扱う必要があります