[解決済み】プリペアドステートメントは、どのようにSQLインジェクション攻撃から保護することができますか?
質問
どのように 準備されたステートメント を防ぐのに役立ちます。 SQLインジェクション の攻撃を受けたことがありますか?
ウィキペディアによると
プリペアドステートメントは、SQLインジェクションに強いです。 パラメータ値は、後で別の方法で送信されます。 プロトコルを正しくエスケープする必要はありません。元のステートメント テンプレートが外部入力から派生していない場合、SQL インジェクションは起こりません。 が発生します。
理由がよくわからないのですが。簡単な英語と例で説明するとしたら、どのようなことが考えられますか?
どのように解決するのですか?
アイデアは非常にシンプルです - クエリとデータはデータベースサーバーに送信されます。
別々に
.
以上です。
SQLインジェクション問題の根源は コードとデータが混在している。
実際、私たちのSQLクエリは 正規のプログラム . そして、そのようなプログラムを動的に作成し、その場でデータを追加しているのです。したがって、そのデータが干渉して プログラムコード SQLインジェクションの例が示すように、SQLインジェクションは、それを変更することさえあります(すべての例はPHP/Mysqlで)。
$expected_data = 1;
$query = "SELECT * FROM users where id=$expected_data";
は、通常のクエリを生成します
SELECT * FROM users where id=1
このコードの間
$spoiled_data = "1; DROP TABLE users;"
$query = "SELECT * FROM users where id=$spoiled_data";
は、悪意のあるシーケンスを生成します。
SELECT * FROM users where id=1; DROP TABLE users;
これは、プログラム本体に直接データを追加しているため、プログラムの一部となり、データがプログラムを変更する可能性があり、渡されたデータに応じて、通常の出力またはテーブルのいずれかを作成することになります
users
を削除しました。
一方
プリペアド・ステートメントの場合は、プログラムを変更しないので、そのままです。
そこがポイントですね。
を送信しています。 プログラム をまずサーバーに送信します。
$db->prepare("SELECT * FROM users where id=?");
ここで、データはいくつかの 変数 パラメータやプレースホルダと呼ばれるものです。
全く同じクエリが、データなしでサーバーに送信されることに注意してください! そして、データを送信する際に セカンド のリクエストで、基本的にクエリ自体から分離されています。
$db->execute($data);
というように、プログラムを改変して害を及ぼすことがないようにします。
実にシンプルですね。
いつもどのマニュアルでも省略されていることを、唯一付け加えるとしたら。
プリペアドステートメントで保護できるのは
データリテラル
他のクエリパーツと併用することはできません。
そのため、一度、例えば動的な
識別子
- プリペアド・ステートメントでは、例えばフィールド名などには対応できません。私は
最近、この問題について説明した
ということで、繰り返さないことにします。
関連
-
[解決済み] PostgreSQL - json 型の等値演算子を識別できませんでした。
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] PHPでユーザー入力をサニタイズするにはどうすればよいですか?
-
[解決済み] mysql_real_escape_string() を回避する SQL インジェクション
-
[解決済み] PDOのプリペアドステートメントは、SQLインジェクションを防ぐのに十分ですか?
-
[解決済み】XKCDコミック「Bobby Tables」のSQLインジェクションはどのように動作するのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ERROR: 参照されたテーブル "bar" の与えられたキーに一致するユニークな制約がありません。
-
[解決済み】SQLクエリ「00904. 00000 - "%s: 無効な識別子"
-
[解決済み】一括読み込みデータ変換エラー(指定されたコードページに対して型の不一致または無効な文字)1行目4列目(年)について)
-
[解決済み】SQL Server: 無効なカラム名
-
[解決済み] DELETE文の競合REFERENCE制約
-
[解決済み] エラー (ORA-00923: 期待された場所に FROM キーワードが見つかりませんでした)
-
[解決済み] エラー: 名前解析スクリプトで正しい関数に渡された長さのパラメーターが無効です。
-
[解決済み] SQLです。最初の出現箇所のみを返す
-
[解決済み] アクセスクエリーエラー(from句のシンタックスエラー)
-
[解決済み] SQLサーバーで文字列をsmalldatetimeデータ型に変換する際、変換に失敗しました(静的値を除く)。