6

小さな経歴:私はこの会社の唯一のプログラマーです。私は既存のフレームワークを使用しています。

とは言うものの、この会社には「必要なすべてのデータベース操作」を含むdll(Database.dll)があります。のように、、、Query()などがあります。これで、私が書いているプロジェクトはDatabase.dllへの参照を設定します。私のプロジェクトはゼロのユーザー入力を受け入れます。ユーザー入力に最も近いものは、ユーザーが日付を選択できるドロップダウンボックスです。あまり経験がないので、SQLインジェクションについて心配する必要があるかどうか知りたいですか?もしそうなら、クエリは次のように書かれますかUpdate()Insert()

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

パラメータ化されたクエリとして十分ですか?Query()クエリの実行はすべて、使用する必要があると言われている 既存のものによって処理され、編集できないことに注意してください。

編集

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

4

5 に答える 5

6

コメントに記載されているように、答えは「常に」です。連結ではなく、パラメータを追加して適切に実行するのは非常に簡単なので、最初から正しく実行してください。また、表示したコードの問題はインジェクションだけではないと考えましたか?そのコードは、ローカリゼーション/国際化の影響も受けます。異なる文化でPCを構成しているユーザーはどうなりますか?日付と数字は異なってレンダリングされます-そしてしばしば壊れます。それはパラメータでは起こりません。また、名前にはしばしばアポストロフィが含まれています:)

于 2013-01-16T21:08:00.530 に答える
4

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

ポリシーの問題として、このような入力を使用して独自のSQLステートメントを作成することは絶対にしないでください。

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

これまでに見たことがない方のために、xkcdにすばらしいイラストがあります。

http://xkcd.com/327/

于 2013-01-16T21:05:51.770 に答える
2

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

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

于 2013-01-16T21:20:15.467 に答える
1

ユーザーの操作はドロップダウンである可能性がありますが、高度な攻撃者が選択リストにない値を挿入する可能性があります。そうです、SQLインジェクションにはまだ注意する必要があります。

于 2013-01-16T21:07:16.230 に答える
0

SQLインジェクションのようなものがなくても、プリペアドステートメントを使用します。これらは使いやすく、場合によっては、データベースがステートメントをキャッシュできるようにし、次に使用するときにコンパイルする必要がないようにします。Oracleはそれを行います、SQL Serverはそうだと思いますが、MySQLがそうするかどうかはわかりません。

内部イントラネットプロジェクトであっても、ハッカーがいることを常に想定する必要があります。私はプリペアドステートメントを使用し、CSRFを防ぐためにノンスを使用しています。

于 2013-01-16T21:15:32.947 に答える