0

これらは、私のアプリケーションのクエリ モジュールにおけるキーワード競合の問題の 1 つです。スマートな解決策を教えてください。

まず、クエリ モジュールでは、各クエリ条件に UI の 3 つの部分が含まれています。

1.フィールド名、その値は固定です。例: origin、finalDest...

2.演算子、「好き」、「好きではない」、「ある」、「ない」、「=」、「!=」を含む選択リストです。

3.値、この部分はユーザーによって入力されます。その後、バックエンドで、UIのクエリ基準に従ってSQLステートメントを組み立てます。たとえば、ユーザーがUIで次のものを入力/選択した場合

Field Name       Operator       Value
origin           like           CHI
finalDest        in             SEL

バックエンドでは、次の SQL が生成されます。

select * from Booking where origin like '%CHI%' and finalDest in ('SEL').

ただし、バグがあります。たとえば、ユーザーが「値」に特殊な記号、たとえば「'」、「_」などを入力すると、生成された SQL にも ' または _ が含まれます。

select * from Booking where origin like '%C_HI%' and finalDest in ('S'EL').

「where」ブロックに特別な記号があるため、SQLを実行できないことがわかります

この問題の解決策は、特殊記号を実行する前に特殊記号の前にエスケープ文字「/」を追加することですが、私が知っているのは、SQLキーワードと競合する「または_」だけです。他に同様の記号があるかどうか知っていますか私は対処する必要がありますか、それとも注射を避けることができるより良いアイデアがありますか

申し訳ありませんが、使用している言語を忘れていました。Java を使用しています。DB は mysql です。休止状態も使用しています。PreparedStatement を使用しなかった理由を多くの人が言います。これは少し複雑です。簡単に言えば、私の会社では、動的クエリと呼ばれる FW があり、SQL フラグメントを XML ファイルで事前に定義し、UI パスイン基準に従って jxel 式を使用して SQL を組み立てます。 PreparedStatement を使用するように変更すると、FW に多くの変更が必要になるので、SQL インジェクションの問題を簡単な方法で修正する方法だけを気にします。

4

3 に答える 3

2

コードは、データベースに情報を送信する前に、サーバー側で SQL インジェクションを停止しようとする必要があります。使用している言語はわかりませんが、これは通常、何らかのバインド変数を含むステートメントを作成することによって実現されます。Java では、これはPreparedStatementです。他の言語にも同様の機能が含まれています。

ステートメントでバインド変数またはパラメーターを使用すると、SQL インジェクションに対する組み込みの保護が活用されます。これは、正直なところ、あなたや私がデータベースに書き込むよりも優れています。Stringサーバー側で連結を行って完全な SQL ステートメントを形成する場合、これは SQL インジェクションのリスクを示しています。

于 2013-07-08T08:36:05.883 に答える
1
0   An ASCII NUL (0x00) character.
'   A single quote (“'”) character.
"   A double quote (“"”) character.
b   A backspace character.
n   A newline (linefeed) character.
r   A carriage return character.
t   A tab character.
Z   ASCII 26 (Control+Z). See note following the table.
\   A backslash (“\”) character.
%   A “%” character. See note following the table.
_   A “_” character. See note following the table

参照

類似の質問を積み重ねる

于 2013-07-08T08:36:19.153 に答える
0

SQL ステートメントではバインド変数を使用する必要があります。すでに述べたように、これは Java の PreparedStatements で行われます。

有効な列名のみが使用されていることを確認するには、データベースに対して入力を検証します。MySQL は、各テーブルの列などのスキーマ情報を INFORMATION_SCHEMA の一部として提供します。詳細については、MySQL のドキュメントを確認してください。

「INFORMATION_SCHEMA COLUMNS テーブル」

于 2013-07-08T08:44:07.110 に答える