问题如下百度搜索时网站标题被篡改:请使用正版授权-盗版主题后果自负-授权购买官网,这问题主要会在ritheme主题上,播播资源网也中招了好几次,导致百度收录下降,主题查找了也没到好方法经过对数据库入手解决该问题。

在 MySQL 数据库中,可以通过创建触发器来禁止修改wp_options 表中的blogname 字段。触发器会在更新操作之前或之后执行,我们可以利用BEFORE UPDATE 触发器来检查并阻止对 blogname 字段的修改。主要目的防止 wordpress 一些主题后门主题篡改网站标题,导致网站标题显示盗版文字。

20250317013125950

以下是详细的步骤和代码:注意用管理账号进入phpmyadmin操作,在Navicat 中操作或者宝塔打开数据操作时会提示权限不足

SQL框内执行即可

20250317013934424

再来测试后台设置标题修改保存,保存后依然是原来的标题

以下为参考,只需要操作以上面步骤即可


1. 确认wp_options 表结构

在 WordPress 中,wp_options 表的结构如下:

列名 类型 描述
option_id bigint(20) 选项 ID(主键)
option_name varchar(191) 选项名称(如blogname)
option_value longtext 选项值(如网站标题)
autoload varchar(20) 是否自动加载

我们需要针对option_name 为blogname 的行,禁止修改option_value 字段。


2. 创建触发器

以下是创建触发器的 SQL 语句:

DELIMITER $$

CREATE TRIGGER prevent_blogname_update
BEFORE UPDATE ON wp_options
FOR EACH ROW
BEGIN
-- 检查是否是 blogname 字段
IF OLD.option_name = 'blogname' AND OLD.option_value != NEW.option_value THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '修改 blogname 字段被禁止';
END IF;
END$$

DELIMITER ;

说明:

  1. 触发器名称:prevent_blogname_update。
  2. 触发时机:BEFORE UPDATE,在更新操作之前触发。
  3. 检查条件
    • OLD.option_name = 'blogname':确保操作的是blogname 字段。
    • OLD.option_value != NEW.option_value:确保option_value 字段的值被修改。
  4. 阻止操作
    • 如果满足条件,使用SIGNAL 抛出错误,阻止更新操作。
    • 错误代码45000 是自定义错误代码,MESSAGE_TEXT 是错误提示信息。

3. 测试触发器

创建触发器后,可以尝试修改blogname 字段的值,验证触发器是否生效。

测试 SQL:

UPDATE wp_options

SET option_value = '新标题'
WHERE option_name = 'blogname';

预期结果:

  • 如果触发器生效,执行上述 SQL 时会抛出错误:

    复制

    ERROR 1644 (45000): 修改 blogname 字段被禁止

  • 如果修改其他字段(如siteurl),则不会触发错误。

4. 删除触发器

如果需要取消触发器的限制,可以使用以下 SQL 删除触发器:

DROP TRIGGER IF EXISTS prevent_blogname_update;


5. 注意事项

  1. 备份数据库
    • 在创建触发器之前,建议备份数据库,以防操作失误。
  2. 权限要求
    • 创建触发器需要数据库用户具有TRIGGER 权限。
  3. 直接修改数据库
    • 触发器只能阻止通过 SQL 语句修改blogname 字段。如果通过其他方式(如 PHPMyAdmin 或直接修改数据库文件)修改,触发器不会生效。
  4. WordPress 多站点
    • 如果使用 WordPress 多站点(Multisite),wp_options 表可能为wp_X_options(X 为站点 ID),需要根据实际情况调整表名。

6. 扩展:禁止插入或删除blogname 字段

如果需要更严格的限制,可以创建额外的触发器,禁止插入或删除blogname 字段。

禁止插入:

DELIMITER $$

CREATE TRIGGER prevent_blogname_insert
BEFORE INSERT ON wp_options
FOR EACH ROW
BEGIN
IF NEW.option_name = 'blogname' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '插入 blogname 字段被禁止';
END IF;
END$$

DELIMITER ;

禁止删除:

DELIMITER $$

CREATE TRIGGER prevent_blogname_delete
BEFORE DELETE ON wp_options
FOR EACH ROW
BEGIN
IF OLD.option_name = 'blogname' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '删除 blogname 字段被禁止';
END IF;
END$$

DELIMITER ;


通过创建BEFORE UPDATE 触发器,可以有效地禁止修改wp_options 表中的blogname 字段。这种方法适用于需要严格保护网站标题的场景。如果需要更全面的保护,可以结合禁止插入和删除的触发器来实现。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。