为什么叫终极呢?因为这个方法是从SQL层面入手与程序无关,原理是利用SQL提供给我们的触发器功能,在数据更新前对数据进行检测含有危险字符就进行拦截,除非黑客有数据库root权限,否则是不能修改我们设置的触发器规则的。
操作步骤:
- 宝塔-数据库-管理 -用root账户登陆
- 选择海洋CMS数据库,然后点击右上角的“触发器”,点击靠左的“添加触发器”,出现如下图所示的窗口:
- 按下面设置填写:
触发器名称:check (任意名称)
表:sea_data
时机:BEFORG (BEFORG 是执行前,AFDER是执行后)
事件:UPDATE
定义:
SQL
BEGIN IF NEW.v_name LIKE '%script%' OR NEW.v_pic LIKE '%script%' OR NEW.v_spic LIKE '%script%' OR NEW.v_actor LIKE '%script%' THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '请勿输入非法字符!'; END IF; END
用户:留空
- 点击执行,无出错提示即添加成功,如下图所示:
我们来测试一下:
SQL
update sea_data set v_pic = ‘https://xx.com/xx.jpg “></script><script/**’ WHERE v_id=1
OK,说明设置成功,如果没有出现出错提示而是正常执行,那么请检查下步骤并恢复被修改的数据。
更多使用案例
我要在数据库设置一个触发器,新插入字段body含有http就不插入
为了创建一个触发器,防止在数据库中插入包含“http”的字段,你可以使用以下SQL语句(这里以MySQL为例):
DELIMITER //
CREATE TRIGGER before_insert_your_table_name
BEFORE INSERT ON your_table_name
FOR EACH ROW
BEGIN
IF NEW.body LIKE '%http%' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'HTTP is not allowed';
END IF;
END;
//
DELIMITER ;
请注意以下几点:
- 将
your_table_name
替换为你的实际表名。 - 这个触发器会在插入新行之前检查
body
字段。如果该字段包含“http”,它将引发一个错误。 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'HTTP is not allowed';
这一行会抛出一个错误,提示用户HTTP是不允许的。- 在真实的应用场景中,可能还需要处理其他的URL协议,例如
https
。你可以根据需要调整LIKE模式。 - 如果你使用的是其他数据库系统(如PostgreSQL、SQL Server等),触发器的语法可能会有所不同。
我要在数据库设置一个触发器,新插入字段body含有http或者.com 或者.cc就不插入
要在数据库中设置一个触发器,以防止插入包含特定字符串(例如“http”、“.com”或“.cc”)的字段,你可以使用以下SQL语句(这里以MySQL为例):
DELIMITER //
CREATE TRIGGER before_insert_your_table_name
BEFORE INSERT ON your_table_name
FOR EACH ROW
BEGIN
IF NEW.body LIKE '%http%' OR NEW.body LIKE '%.com%' OR NEW.body LIKE '%.cc%' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'URLs or domain suffixes are not allowed';
END IF;
END;
//
DELIMITER ;
请确保将your_table_name
替换为你的实际表名。这个触发器会在插入新行之前检查body
字段。如果该字段包含“http”、“.com”或“.cc”,它将引发一个错误。
这个例子使用SIGNAL SQLSTATE '45000'
来抛出一个错误,提示用户URLs或域名后缀是不允许的。你可能需要根据你的实际需求和数据库系统进行相应的调整。
NEW.body 什么意思?
在MySQL的触发器中,NEW
是一个特殊的关键字,代表新插入或更新的行的当前值。因此,NEW.body
指的是即将被插入或更新的行的body
字段的值。