2013-01-16 13 views
6

小さな背景:私はこの会社の唯一のプログラマーです。私は既存のフレームワークで作業しています。SQL注入保護を心配する場合

つまり、同社には「必要なすべてのデータベースのやりとりが含まれている」dll(Database.dll)があります。 inと同様にQuery()Update()Insert()などです。私が書いているプロジェクトでは、Database.dllへの参照が設定されています。私のプロジェクトでは、ユーザーの入力はゼロです。ユーザー入力に最も近いのは、ユーザーが日付を選択できるドロップダウンボックスです。 SQLインジェクションについてまだ心配する必要があるのであれば、それほど多くの経験はありません。もしそうなら、照会は

var query = string.Format("SELECT timestamp FROM table1 WHERE date = \"{0}\" 
          AND measured_dist = bit_loc AND rop > 0" , Date)) 

のように書かれていますか?すべてのクエリの実行は、既存のQuery()によって処理されることを覚えておいてください。これは、使用する必要があり、編集できないということです。

EDITは

このプログラムのWinFormアプリケーションです。

+19

正解は「常に」です。 –

+0

あなたは常にそれに気を付けるべきですが、開発者の外にいる誰かがデータベース要求を提出できる唯一の方法は、ドロップダウンの選択だから、何かを注入する可能性はほとんどありません。これはWebアプリまたはコンソールアプリですか?Webアプリを使用すると、投稿方法が異なるためにリスクが大幅に増加します。コンソールアプリケーションを使用するとおそらくそれほど大きな問題にはなりません。 – Robert

+3

パラメータ化できないものをやっていない限り、パラメータ化してください。セキュリティは別として、パフォーマンスが向上する可能性があります。パラメータ化によって、RDBMSにクエリ自体をパラメータ化して実行計画と一致させる作業が軽減されます。クライアント側では、たくさんの文字列を割り当てたり、コードを整えたりする必要がありません。 –

答えて

6

コメントに記載されているとおり、答えは「常に」です。 なので、にパラメータを追加して、正しく連結するのではなく、正しく行うことができます。ちょうど最初に実行してください。また、あなたが示したコードで注射だけが問題ではないと考えましたか?そのコードは、ローカリゼーション/国際化の影響を受けやすい。異なるカルチャーにPCを設定しているユーザーの場合はどうなりますか?日付と数字は別々にレンダリングされ、頻繁に壊れます。それはパラメータでは起こりません。また、名前にアポストロフィがあることがよくあります。

+0

@ Marc Gravell - 非常によく言った。私はちょうどそれらの事について尋ねるつもりだった。 +1 – Brian

+0

@MarcGravell:私が照会しているデータベースは、すべてのケースで同じフォーマット(YYYY-mm-dd)を持っています。私がパラメータ化されたクエリについて読んでいるところから、コマンド実行が別の方法で処理されるときにそうすることは可能ですか?私は[this](http://blog.divergencehosting.com/2009/04/09/using-parameters-parameterized-queries-database-interactions-cshar-vbnet/)を読んできましたが、クエリはそれを実行するのと同じ方法で作成されます。 – MyCodeSucks

+0

@MarcGravell - これはC#のローカルアプリケーションです。パラメータでは不十分です。特定のユーザーとストアドプロシージャ(ユーザーが持っている唯一のアクセス)が必要です。そうでなければ、アプリケーションを見て接続文字列を取得して町に行くのは簡単です。 – Hogan

4

@ KirkWollの非常に有効なコメントを拡張すると、ユーザー入力(または自動化されたソースからの入力)をSQLステートメントに組み込むときはいつでも、プログラムをSQLインジェクションの危険にさらします。

このような入力を使用して独自のSQL文を作成することは決して避けてください。

入力を常にサニタイズし、SQLインジェクションに対する最初の防衛線として常にパラメータ化されたクエリを使用します。

あなたが前にそれを見ていない場合は、XKCDに大きなイラストがあります

http://xkcd.com/327/

+3

ハハ、私は小さなボビーテーブルが大好きです。その笑いをありがとう。 +1 – MyCodeSucks

+0

+1ボビーテーブル – SmartK8

+0

これは非常に面白い漫画です。 –

1

ユーザインタラクションがドロップダウンであっても、それが値を挿入するために、洗練された攻撃者のために可能ですそれは選択リストに含まれていません。だから、はい、あなたはまだSQLインジェクションに注意する必要があります。

+0

「洗練された」攻撃者でもありません。控えめなプログラミングスキルを持つ人は、HTML上のソースを表示し、自分の好みに合わせて編集し、元のHTMLの代わりに使用することができます。もう少しスキルのある人は、ブラウザのアドインを使ってプロセスを半自動化することができます。 –

+2

WinFormsアプリでさえ? –

+0

ええ、それは具体的にはHTMLインタフェースかどうかという疑問から私には分かりませんでした。もしそれが何らかの種類のデスクトップアプリケーションであれば、Bartのコメントにはもっと精巧さが必要かもしれない。 – jimbojw

0

SQLインジェクションのようなものがなくても、私は準備済みのステートメントを使います。それらは使いやすく、場合によってはデータベースがその文をキャッシュすることができ、次回の使用時にコンパイルする必要がありません。オラクルは、SQL Serverはそうしていると思いますが、MySQLの場合はわかりません。

内部のイントラネットプロジェクトであっても、準備されたステートメントを使用し、CSRFを防ぐためにナンスを使用するハッカーがいると常に仮定してください。

2

これはWinFormsプログラムであるため、データベースにアクセスする唯一の安全な方法は、パラメータを使用するストアドプロシージャを使用することです。次に、のみがそれらのSPにアクセスできるユーザーを作成します。それ以外は安全ではありません。

「攻撃」入力を持つ可能性のあるWebアプリケーションで使用する場合、パラメータを使用したクエリはセキュリティ対策として機能しますが、ローカルアプリケーションと一緒に使用すると失敗し、何も組み立てられずに書き換えられます。 SPセキュリティを提供しないと、あなたは失われます。

関連する問題