2

MySql で 1 つのパラメーターを受け取るストアド プロシージャを作成しようとしています。そのパラメーターに、'DROP'、'INSERT'、'UPDATE'、'TRUNCATE' などを含むテキストがないかチェックします。これは SELECT ステートメントではありません。理想的ではないことはわかっていますが、残念ながら SELECT ステートメントはクライアント側で構築されており、何らかの中間者による変更を防ぐために、サーバーからのセキュリティ レベルが追加されているだけです。

私はそれを達成するためにいくつかの手段を試しましたが、うまくいきません。私はこれに似たものを思いつきました:

CREATE PROCEDURE `myDatabase`.`execQuery` (in INC_query text)
BEGIN

#check to see if the incoming SQL query contains INSERT, DROP, TRUNCATE, 
#or UPDATE as an added measure of security
IF (
    SELECT LOCATE(LOWER(INC_query),'drop') OR
    SELECT LOCATE(LOWER(INC_query),'truncate') OR
    SELECT LOCATE(LOWER(INC_query),'insert') OR
    SELECT LOCATE(LOWER(INC_query),'update') OR
    SELECT LOCATE(LOWER(INC_query),'set')
    >= 1) 
THEN
    SET @command = INC_query;
    PREPARE statement FROM @command;
    EXECUTE statement;
ELSE
    SELECT * FROM database.otherTable; #just a generic output to know the procedure executed correctly, and will be removed later. Purely testing.

END IF;

END

「フィルター可能な」単語が含まれていても、クエリは実行されます。何か助けていただければ幸いです。または、何かを行うためのより良い方法があれば、私はすべて聞いています。

4

1 に答える 1

1

またはという列がある場合はどうなりますupdated_atsettings?これが意図したとおりに機能することは期待できません。この種のテクニックは、ウェブ上にclbutticへの参照が非常に多い理由です。

あなたがこの道を行くならば、あなたは本当に物事を台無しにするつもりです。

これにアプローチする唯一の合理的な方法は、構築するクエリの種類のパラメータを送信してから、許可された用語の精査されたホワイトリストを使用してアプリケーションでクエリを構築することです。JSONで表現された例:

{
    "select" : {
      "table" : "users",
      "columns" : [ "id", "name", "DROP TABLE users", "SUM(date)", "password_hash" ],
      "joins" : {
         "orders" : [ "users.id", "orders.user_id" ]
      }
}

この種のものを出力するクエリコンストラクターと、それを有効なクエリに変換する別のコンストラクターを作成する必要があります。この例のように、特定の列は非公開または内部のみであり、開示されない可能性があるため、クエリ用に特定の列のみを一覧表示することをお勧めしますpassword_hash

また、特定のグループ化操作または条件(SUM|MIN|MAX|AVG)\((\w+)\)をキャプチャするようなパターンを許可することもできます。JOINそれはあなたがこれをどこまでやりたいかによります。

于 2012-11-28T01:27:22.317 に答える