问题如下百度搜索时网站标题被篡改:请使用正版授权-盗版主题后果自负-授权购买官网,这问题主要会在ritheme主题上,播播资源网也中招了好几次,导致百度收录下降,主题查找了也没到好方法经过对数据库入手解决该问题。
在 MySQL 数据库中,可以通过创建触发器来禁止修改wp_options 表中的blogname 字段。触发器会在更新操作之前或之后执行,我们可以利用BEFORE UPDATE 触发器来检查并阻止对 blogname 字段的修改。主要目的防止 wordpress 一些主题后门主题篡改网站标题,导致网站标题显示盗版文字。
以下是详细的步骤和代码:注意用管理账号进入phpmyadmin操作,在Navicat 中操作或者宝塔打开数据操作时会提示权限不足
SQL框内执行即可
再来测试后台设置标题修改保存,保存后依然是原来的标题
以下为参考,只需要操作以上面步骤即可
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 ;
说明:
- 触发器名称:prevent_blogname_update。
- 触发时机:BEFORE UPDATE,在更新操作之前触发。
- 检查条件:
- OLD.option_name = 'blogname':确保操作的是blogname 字段。
- OLD.option_value != NEW.option_value:确保option_value 字段的值被修改。
- 阻止操作:
- 如果满足条件,使用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. 注意事项
- 备份数据库:
- 在创建触发器之前,建议备份数据库,以防操作失误。
- 权限要求:
- 创建触发器需要数据库用户具有TRIGGER 权限。
- 直接修改数据库:
- 触发器只能阻止通过 SQL 语句修改blogname 字段。如果通过其他方式(如 PHPMyAdmin 或直接修改数据库文件)修改,触发器不会生效。
- 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 ;