WordPress自定义PHP校验函数无理由无法正确返回布尔值问题咨询
问题原因及修复方案
核心故障原因:函数变量作用域错误
PHP函数内部默认无法直接访问外部定义的变量,你代码中gfedit_verify_user_entry函数内用到的$lid_mail和$user_email都属于全局作用域变量,既没有作为参数传入函数,也没有在函数内用global关键字声明,因此这两个变量在函数内部都是未定义的NULL值。NULL == NULL的判断结果恒为true,就是你确认两个变量实际不等,但函数始终返回true的根本原因。
其他附带问题
$wpdb->prepare使用不规范:你直接把$lid拼接到SQL语句中,完全没有起到预编译防SQL注入的作用,属于高危安全漏洞。- 逻辑顺序不合理:当前代码先执行数据库查询,再判断用户是否登录,未登录的访客也会触发无效的数据库请求,浪费服务器资源。
- 缺漏判空逻辑:未判断
$_GET['lid']是否存在、数据库查询返回的$row是否为空,直接调用对应索引会触发PHP警告,你直接echo函数返回值时页面加载失败,就是因为触发了未定义变量的报错,站点关闭错误显示时就会表现为白屏。
修复代码示例
global $current_user, $wpdb; // 先判断登录状态,避免无效逻辑执行 if(!is_user_logged_in()){ header("Location: https://example.com/my-account/?login=true&back=home&page=1"); exit(); } // 判空后再获取参数、查库 if(!isset($_GET['lid'])){ echo "access denied!"; exit(); } $lid = $_GET['lid']; // 正确使用prepare占位符,数字类型用%d,字符串类型替换为%s $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM wp_edit_gf WHERE lid = %d", $lid), ARRAY_A); if(empty($row)){ echo "access denied!"; exit(); } $user_id = $current_user->ID; $user = get_user_by('id', $user_id); $user_email = $user->user_email; $lid_mail = $row['user_mail']; // 函数接收参数,避免全局变量污染 function gfedit_verify_user_entry($lid_mail, $user_email){ return $lid_mail == $user_email; } if(!gfedit_verify_user_entry($lid_mail, $user_email)){ echo "access denied!"; exit(); } else { // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者Nima
相关产品推荐
相关产品推荐

