これらは、私のアプリケーションのクエリ モジュールにおけるキーワード競合の問題の 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 インジェクションの問題を簡単な方法で修正する方法だけを気にします。