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