我正在尝试在 MySql 中编写一个将采用单个参数的存储过程,然后检查该参数是否包含任何包含“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
即使它包含我的任何“可过滤”单词,它仍然会执行查询。任何帮助将不胜感激,或者如果有更好的做某事的方法,我会全力以赴。