[解決済み] パラメータ化された文はすべてのSQLインジェクションを止めることができますか?
質問
もしそうなら、なぜ SQL インジェクションの成功例がまだたくさんあるのでしょうか? 一部の開発者がパラメータ化されたステートメントを使用するにはあまりにも間抜けだからでしょうか?
どのように解決するのでしょうか?
私が質問に対するコメントで投稿したリンクは、この問題を非常によく説明しています。 なぜこの問題が続いているのか、私の気持ちを以下にまとめました。
-
始めたばかりの人は、SQL インジェクションをまったく意識していないかもしれません。
-
SQL インジェクションを認識しているが、エスケープが (唯一の?) 解決策であると考えている人もいます。 Google で検索すると
php mysql query
と検索すると、最初に表示されるページがmysql_query
ページで、エスケープされたユーザー入力をクエリに補間する例があります。 代わりにプリペアド ステートメントを使用することについては (少なくとも私が見た限りでは) 言及されていません。 他の人が言ったように、パラメータ補間を使用するチュートリアルは非常に多いので、それがいまだに使用されていることは驚くことではありません。 -
パラメータ化されたステートメントがどのように機能するかについての理解不足。 値をエスケープするための単なる空想の手段だと考えている人もいます。
-
他の人は、パラメタライズド ステートメントを認識していますが、遅すぎると聞いたことがあるため、使用していないようです。 多くの人が、パラメタライズド ステートメントがどれほど信じられないほど遅いかを聞いたことがあっても、実際に自分自身でテストしたことはないのではないでしょうか。 Bill Karwinが講演で指摘したように、プリペアドステートメントの使用を検討する際に、パフォーマンスの違いを要因として用いることはほとんどないはずです。 の利点は 一度準備すれば、何度でも実行できる の利点は、セキュリティやコードの保守性の向上と同様に、しばしば忘れ去られているように見えます。
-
パラメータ化されたステートメントをいたるところで使用するものもありますが、テーブルやカラム名、キーワード、条件演算子など、チェックされていない値を補間して使用します。 ユーザーが多くの異なる検索フィールド、比較条件、およびソート順を指定できるような動的検索は、この典型的な例です。
-
ORM を使用する際の誤った安心感。 ORMはまだSQL文の部分を補間することができます - 5を参照してください。
-
プログラミングは大きく複雑なテーマであり、データベース管理は大きく複雑なテーマであり、セキュリティは大きく複雑なテーマです。 安全なデータベースアプリケーションを開発するのは簡単ではありません。
-
stackoverflow の回答の多くは役に立ちません。 人々が動的 SQL とパラメータ補間を使用する質問を書いたとき、代わりにパラメータ化されたステートメントを使用することを提案する回答は、しばしば不足しています。 何度か、プリペアドステートメントを使うようにという私の提案に反論する人がいましたが、たいていの場合、パフォーマンスのオーバーヘッドが受け入れられないと認識されているからです。 これらの質問のほとんどは、パラメータ化されたステートメントの準備にかかる余分な数ミリ秒が、アプリケーションに致命的な影響を与えるような状況であることを、私は真剣に疑っています。
関連
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] mysql_real_escape_string() を回避する SQL インジェクション
-
[解決済み] PDOのプリペアドステートメントは、SQLインジェクションを防ぐのに十分ですか?
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
-
[解決済み】XKCDコミック「Bobby Tables」のSQLインジェクションはどのように動作するのでしょうか?
-
[解決済み】プリペアドステートメントは、どのようにSQLインジェクション攻撃から保護することができますか?
-
[解決済み] Node.jsの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 実装 サイバーパンク風ボタン
おすすめ
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] テーブルネーミングのジレンマ:単数形と複数形の名前【非公開
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] PDOのプリペアドステートメントは、SQLインジェクションを防ぐのに十分ですか?
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQLiteデータベースで、一度に複数行を挿入することは可能ですか?
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する