[解決済み] Sqlインジェクションを防ぐには、本当にパラメータだけで良いのでしょうか?
質問
私は同僚とSOの両方で、SQLクエリ、特に.NETアプリケーションでパラメータを使用することの良さについて説教してきました。私は、SQL インジェクション攻撃に対する免疫力を与えるものとして、それらを約束するところまで行きました。
しかし、これが本当に真実なのかどうか、疑問に思い始めています。パラメータ化されたクエリに対して成功する既知の SQL インジェクション攻撃はあるのでしょうか? たとえば、サーバー上でバッファ オーバーフローを引き起こすような文字列を送ることはできるでしょうか?
もちろん、Web アプリケーションが安全であることを保証するための他の考慮事項 (ユーザー入力のサニタイズやその他諸々) がありますが、今は SQL インジェクションについて考えています。私は、MsSQL 2005 と 2008 が私の主要なデータベースであるため、これらに対する攻撃に特に興味がありますが、すべてのデータベースが興味深いものです。
編集:私がパラメータとパラメータ化されたクエリによって何を意味するのかを明確にするために。パラメータを使用することで、私は SQL クエリを文字列で構築する代わりに、quot;変数" を使用することを意味します。
だから、これを行う代わりに
SELECT * FROM Table WHERE Name = 'a name'
こうするんです。
SELECT * FROM Table WHERE Name = @Name
で、クエリ/コマンドオブジェクトの @Name パラメータの値を設定します。
どのように解決するのですか?
プレースホルダー はインジェクションを防ぐのに十分です。 それでもバッファオーバーフローの危険性はありますが、これは SQL インジェクションとはまったく異なる種類の攻撃です (攻撃ベクトルは SQL 構文ではなくバイナリです)。 渡されるパラメータはすべて適切にエスケープされるので、攻撃者が「生きたSQL」のように扱われるデータを渡す方法は何もありません。
プレースホルダーの内部で関数を使用することはできません。また、プレースホルダーは文字列リテラルとしてエスケープされ引用されるため、カラムやテーブル名として使用することはできません。
しかし、もしあなたが パラメータ の一部として 文字列連結 を動的クエリの中で使用した場合、文字列はエスケープされずにリテラルとなるため、インジェクションの対象となります。 パラメータに他の型(例えば整数)を使うのは安全です。
のような値を設定するために use input を使用している場合、そのようなことはありません。
security_level
のような値を設定するために use input を使用している場合、誰かがあなたのシステムの管理者になり、自由に使えるようにすることができます。 しかし、これは単なる基本的な入力検証であり、SQL インジェクションとは何の関係もありません。
関連
-
.NET複数データベース一括データ挿入、更新(SqlServer、MySql、PgSql、Oracleをサポートします。)
-
再起動を伴わないNET5の設定変更は自動的に反映される
-
非同期タスクキャンセルと監視のネット実装
-
Application_End イベントをブロックする解決策
-
一時的なクラスを生成できない(result=1)、問題の解決方法
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PDOのプリペアドステートメントは、SQLインジェクションを防ぐのに十分ですか?
-
[解決済み] Visual StudioのApp_Dataフォルダは何に使うのですか?
-
[解決済み] パラメータを使用しないSQLインジェクションの回避
-
[解決済み] パラメータ化された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 実装 サイバーパンク風ボタン
おすすめ
-
.NET複数データベース一括データ挿入、更新(SqlServer、MySql、PgSql、Oracleをサポートします。)
-
ネットのメモリ管理に関する5つの基本
-
ASP.NETでWeb.configからログインする際の正しいアカウントパスワードを確認する
-
ajaxでポップアップアラートボックス
-
[解決済み] web.configの変換で "Replace Or Insert "を行う方法はありますか?
-
[解決済み] イベントログへの書き込み時にSystem.Security.SecurityExceptionが発生する。
-
[解決済み] Asp.Net 4でValidateRequest="false "が動作しない。
-
[解決済み] Razor _layout.cshtml のファイル名の先頭にアンダースコアがあるのはなぜですか?
-
[解決済み] ASP.NET MVCのHtml.ActionLinkに "active "クラスを追加する方法
-
[解決済み] パラメータを使用しないSQLインジェクションの回避