首页 原创作品 正文
  • 本文约628字,阅读需3分钟
  • 1183
  • 0

数据库被频繁挂马?教你一招搞定!

摘要

本文主要介绍了在数据库层面上防止 XSS 攻击,如果你的数据库经常被挂马而得不到解决就可以使用这种方法,由 nohacks.cn 原创,转载请注明出处。

用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*=';

如果你的数据库经常被挂马而得不到解决,可以使用这种方法从根本上杜绝,虽然有点影响性能但毕竟安全第一!

标签:sql
赞助我
文章目录


    评论
    更换验证码
    友情链接