0

Access データベースに接続する C# フォーム アプリケーションを使用しています。このデータベースの一部、特に文字列", ),やその他の文字を含む部分は私の管理外です。言うまでもなく、その列を使用して他のデータを選択する必要があるため、これはいくつかのクエリを台無しにしています。これは単なるデスクトップ形式のアプリケーションであり、問​​題はエクスポーター機能にあるため、SQL インジェクションなどの懸念はありません。それらを含む可能性のある変数を使用しているときに、クエリで引用符などを無視し、それを Access データベースに格納されているものと一致させるにはどうすればよいですか?

たとえば、1 つの行から複数​​の列を抽出したとします。それらの1つは次のようなものかもしれません:

大 (直径 3-1/16 インチ)

あなたはアイデアを得る。引用符はクエリを壊しています。現在、OleDb を使用してデータベースを掘り下げていますが、今まで問題はありませんでした。少なくとも適切なリファクタリングの準備が整うまでは、私が現在行っていることを助けられるのであれば、それを否定したくはありません。

4

4 に答える 4

3

これは実際には、お分かりのように大きな問題ではありません: SQL クエリを単純な文字列として構築して処理しないでください。SqlCommand クラスを使用し、クエリ パラメータを使用します。このように、SQL エンジンは、直接読み取られるコードと、エスケープされるパラメーターの値を認識するため、すべてを適切にエスケープします。

于 2012-08-14T00:19:43.327 に答える
3

SQL Inject 攻撃から保護しようとしています。https://www.owasp.org/index.php/SQL_Injectionを参照してください。

これらの攻撃を防ぐ最も簡単な方法は、クエリ パラメーターを使用することです。http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

var cmd = new SqlCommand("select * from someTable where id = @id");
cmd.Parameters.Add("@id", SqlDbType.Int).Value = theID;
于 2012-08-14T02:46:15.033 に答える
0

少なくとも一重引用符の場合、別の引用符を追加するとうまくいくようです: ''become '.

インジェクションは問題にならないはずですが、parametersの使用を検討します。それらは、多くの予期しない問題を回避するため、最終的にはより簡単なオプションであり、注射はそれらの1つにすぎません.

于 2012-08-14T00:18:13.373 に答える
0

あなたの質問を読んでいると、C# で文字列としてクエリを作成し、既にクエリされた列の値を連結しています。結果の文字列は、C# で文字列ではなくなるか、アクセス データベースのものと一致しません。 .

問題が C# にある場合は、次のようなエスケープ関数が必要になると思います

stringvar += escaped(columnvalue)
...
private static void escaped(string cv) as string {
  //code to put \ in front of problem characters in cv
}

アクセスに問題がある場合は、

「逃げる」「逃げる」

& 「...」の中に「」を含む列の値を入れることができ、それは機能するはずです。

ただし、実行しようとしている SQL は、サブクエリを使用して一致する値を取得するように再構築する方が適切であり、列名と列名を単純に比較しているというのが私の本当の考えです。

あなたが作成しているクエリが正確に何であるか、およびテーブル構造のヒントについてさらに情報を投稿する場合、私はさらに助けようとします-または他の誰かがあなたに何か建設的なものを与えることができるはずです(あなたはそうするかもしれませんが) Jet SQL 構文ごとに調整する必要があります)

于 2012-08-14T05:22:36.760 に答える