[解決済み] パラメータを使用しないSQLインジェクションの回避
質問
私たちのコードでパラメータ化されたSQLクエリを使用することについて、職場で別の議論をしています。この議論には 2 つの側面があります。私と、SQL インジェクションを防止するために常にパラメータを使用する必要があると言う他の人たちと、その必要がないと考える他の人たちです。その代わりに、SQLインジェクションを避けるために、すべての文字列でシングル・アポストロフィをツー・アポストロフィに置き換えることを望んでいます。私たちのデータベースはすべてSql Server 2005または2008を実行しており、私たちのコードベースは.NETフレームワーク2.0で実行されています。
C# で簡単な例を挙げてみましょう。
これを使って欲しい。
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
他の連中はこうしたいのに。
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
ここで、SafeDBString関数は以下のように定義されています。
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
さて、クエリ内のすべての文字列値に対してSafeDBStringを使用している限り、安全であるはずです。そうでしょう?
SafeDBString関数を使用する理由は2つあります。1つ目は、石器時代から行われている方法であること、2つ目は、データベース上で実行される実際のクエリを見ることができるので、SQLステートメントのデバッグがより簡単になることです。
それでは。私の質問は、sql インジェクション攻撃を避けるために SafeDBString 関数を使用するだけで本当に十分なのかどうかということです。この安全策を破るコードの例を探しているのですが、そのような例は見当たりません。
これを破ることができる人はいますか?あなたならどうしますか?
EDITです。 今までの返信をまとめると
- Sql Server 2005 または 2008 で SafeDBString を回避する方法は、まだ誰も見つけていません。それは良いことだと思いますが?
- いくつかの返信で、パラメトリッククエリを使用するとパフォーマンスが向上することが指摘されました。その理由は、クエリプランを再利用できるからです。
- また、パラメトリッククエリを使用すると、より読みやすいコードになり、保守が容易になることにも同意します。
- さらに、さまざまなバージョンの SafeDBString、文字列から数値への変換、文字列から日付への変換を使用するよりも、常にパラメータを使用する方が簡単です。
- パラメータを使用すると、自動的な型変換が行われます。これは、日付や10進数を扱うときに特に便利です。
- そして最後に セキュリティを自分で行おうとしないでください JulianRが書いているように。データベースベンダーはセキュリティに多くの時間とお金を費やしています。私たちがそれ以上のことをできるわけがありませんし、彼らの仕事をしようとする理由もありません。
誰もSafeDBString関数の単純なセキュリティを破ることができなかった一方で、私は他の多くの良い議論を得ることができました。ありがとうございます。
どのように解決するのですか?
正解は
自分でセキュリティを行おうとしない . あなたがやろうとしていることに対して、信頼できる、業界標準のライブラリがあれば何でも使ってください、むしろ 試みる を使うようにしましょう。あなたがセキュリティについて行うどのような仮定も、正しくないかもしれません。自分のやり方が安全そうに見えても(よくても不安定に見えても)、何かを見落としている可能性があり、セキュリティに関してそのようなチャンスを本当に得たいですか?
パラメーターを使用する
関連
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] mysql_real_escape_string() を回避する SQL インジェクション
-
[解決済み] PDOのプリペアドステートメントは、SQLインジェクションを防ぐのに十分ですか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。