CREATE TABLE sql_blacklist (
pattern VARchar(255),
description VARchar(255)
);
insert INTO sql_blacklist (pattern, description)
VALUES
('select * from', '禁止使用 select * from 语句'),
('UNION select', '禁止使用 UNION 和 select 组合'),
('insert INTO', '禁止使用 insert INTO 语句'),
('update', '禁止使用 update 语句'),
('delete from', '禁止使用 delete from 语句'),
('drop TABLE', '禁止使用 drop TABLE 语句'),
('CREATE TABLE', '禁止使用 CREATE TABLE 语句'),
('ALTER TABLE', '禁止使用 ALTER TABLE 语句'),
('truncate TABLE', '禁止使用 truncate TABLE 语句'),
('exec', '禁止使用 exec 语句'),
('CALL', '禁止使用 CALL 语句'),
('PROCEDURE', '禁止使用 PROCEDURE 语句'),
('FUNCTION', '禁止使用 FUNCTION 语句'),
(';drop DATABASE', '禁止使用 ;drop DATABASE 语句');
CREATE PROCEDURE sql_check (
sql VARchar(255)
)
BEGIN
DECLARE banned VARchar(255);
DECLARE result BOOLEAN;
select pattern
INTO banned
from sql_blacklist
where sql LIKE CONCAT('%', pattern, '%');
IF banned IS NOT NULL THEN
select '非法 SQL 语句:' || banned || ' - ' || description AS error_message;
SET result = TRUE;
ELSE
SET result = FALSE;
END IF;
select result AS check_result;
END;