数据库被频繁挂马?教你一招搞定!
用phpmyadmin登录数据库,选择会被挂马的表(内容表),选择右上角的触发器,添加触发器
触发器名称:check_before_update
以海洋 CMS 为例来说明,表选择'sea_data'
时机:'BEFORG' (BEFORG 是执行前,AFDER是执行后)
事件:'UPDATE'
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 '45000'
SET MESSAGE_TEXT = '请勿输入非法字符!';
END IF;
END
同上,再建一个'check_before_insert'触发器,事件选择 'INSERT'
代码逻辑解析
当对表进行 UPDATE 或 INSERT 操作时,触发器会自动检查以下字段:
NEW.v_name
NEW.v_pic
NEW.v_spic
NEW.v_actor
匹配检查
匹配(%不分大小写%)字段值中是否包含危险标签,如果匹配到任意一个字段,则通过 SIGNAL 抛出错误,阻止操作并提示 "请勿输入非法字符!"。
错误处理
SQLSTATE '45000' 是MySQL自定义错误状态码,表示用户定义的异常。
MESSAGE_TEXT 提供具体的错误信息。
优化建议:
可以使用正则,规避更多XSS 攻击,示例代码:
LOWER(NEW.v_actor) REGEXP '(<\\s*(script|iframe|svg|link)|javascript\\s*:|on(load|error|mouseover)\\s*=';
如果你的数据库经常被挂马而得不到解决,可以使用这种方法从根本上杜绝,虽然有点影响性能但毕竟安全第一!

