[解決済み] プリペアドステートメントでテーブル名をパラメータ化することはできますか?
質問
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();
}
どのように解決するのですか?
ご質問に対する回答は、「いいえ」です。
厳密には、データベース レベルでは、プリペアド ステートメントでは SQL 文の "values" ビットにパラメータをバインドすることのみが許可されます。
これを考える1つの方法は、ステートメントの実行時にその意味を変えることなく代用することができるもの"です。テーブル名は SQL 文自体の有効性 (すなわち、どの列名が有効であるか) を決定し、実行時に変更すると SQL 文が有効であるかどうかが潜在的に変わってしまうため、これらの実行時の値の 1 つではありません。
もう少し高いレベルでは、PDOのような、実際にプリペアドステートメントをデータベースに送信するのではなく、プリペアドステートメントのパラメータ置換をエミュレートするデータベースインターフェースにおいてさえ、どこでもプレースホルダを使用できる可能性があります(これらのシステムではデータベースに送信する前にプレースホルダが置き換えられるため)、テーブルプレースホルダの値は文字列になり、データベースに送信するSQL内でそのように囲まれます、したがって、次のようになります。
SELECT * FROM ?
を
mytable
を指定した場合、実際に送信されるのは
SELECT * FROM 'mytable'
を送ることになり、これは無効なSQLです。
最善の策は、そのまま
SELECT * FROM {$mytable}
しかし
絶対に
が発生した場合に最初にチェックするテーブルのホワイトリストを持っている必要があります。
$mytable
がユーザー入力から来る場合、最初にチェックするテーブルのホワイトリストを持つべきです。
関連
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み] [Solved] Fatal error: メンバ関数 query() の null への呼び出し。
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み] [Solved] Fatal error: 非オブジェクトのメンバ関数fetch_assoc()の呼び出し [重複]。
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。