パラメータ化されたステートメントはテーブル名を処理できますか?
プリペアド ステートメントでテーブル名をパラメータ化しようとしたときに問題が発生しました。 SQL インジェクションに対する保護を目的とした変数を分離すると、エラーが発生しました。
指定したコードには、新しいテーブル名を疑問符ステートメントとしてバインドしようとする関数 insertRow が含まれています。
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(); }
残念ながら、プリペアドステートメントでテーブル名をパラメータ化することはできません。準備されたステートメントでは、パラメーターを SQL ステートメントの「値」要素にバインドすることのみが許可されます。テーブル名は実行時の値ではなく、ステートメントの有効性を変更し、その意味が変わる可能性があります。
PDO のようなデータベース インターフェイスでどこでもプレースホルダー置換が許可されていたとしても、テーブル プレースホルダーの値は、 SQL。無効な SQL になります。
SQL インジェクションから保護するには、テーブルのホワイトリストを使用し、このリストに対してユーザー入力をチェックすることが不可欠です。コードは次のようになります:
if (in_array($mytable, $whitelist)) { $result = $db->query("SELECT * FROM {$mytable}"); }
以上が準備されたステートメントは SQL のテーブル名をパラメータ化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。