私はmysqli_stmt_bind_param関数を何度も使ってきました。しかし、SQLインジェクションに対して保護しようとしている変数を分離すると、エラーに陥ります。準備文の中でテーブル名をパラメータ化できますか?
ここではいくつかのサンプルコードです:
function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol)
{
$statement = $mysqli->prepare("INSERT INTO " .$new_table . " VALUES (?,?,?,?,?,?,?);");
mysqli_stmt_bind_param($statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol);
$statement->execute();
}
それが何らかの形で別のバインド・パラメータ文を作る、別の疑問符文を使用して.$new_table.
連結を交換、またはSQLインジェクションから保護するために、既存のものに追加することは可能ですか?
function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol)
{
$statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
mysqli_stmt_bind_param($statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol);
$statement->execute();
}
いいえ、パラメータ化されたクエリは、パラメータ値をクエリ文字列にドロップするだけではなく、RDBMSにパラメータ化クエリとパラメータを別々に提供します。しかし、このようなクエリは、パラメータとしてテーブル名またはフィールド名を持つことはできません。これを行う唯一の方法は、すでに行ったようにテーブル名をクエリ文字列に動的にコード化することです。この文字列が攻撃の可能性がある場合は、最初に検証する必要があります。許可されたテーブルのホワイトリストリストなどに対して適用されます。 – MatBailie
mysqli拡張の使用は安全です、先に進んでください!しかし、あなたのすべての文字列を浄化し、検証することを忘れないでください。 – B4NZ41
サニタイズするのに好きな機能は何ですか? – GK1667