WordPress 3.5 进行了一些重大更改以降低某些安全风险,例如SQL 注入。该wpdb::prepare
方法的使用不安全,因为插件开发人员发送完整的查询而不是分离参数。这意味着“准备好的”语句没有准备好,实际上是直接将参数传递到查询中,这是一个安全禁忌。从 3.5 开始,此方法现在需要三个参数。
要解决您当前的问题,请编辑您的 php.ini 文件,找到 for 的行error_reporting
并将其更改为以下...
error_reporting(E_ALL & ~(E_NOTICE|E_WARNING));
重新启动您的服务器。
这将防止报告所有小的脚本错误。
或者,将错误发送到日志文件。在 php.ini 中,找到这一行(取消注释),并将其更改为...
error_log "/path/to/php-error.log"
这将防止错误显示在您的网站上。相反,它们将被写入只有您可以看到的日志。
如果此错误困扰您,您可以尝试让流氓插件使用虚拟值。我们可以看到该wpdb::prepare
方法接受三个参数......
$wpdb->query(
$wpdb->prepare(
"
DELETE FROM $wpdb->postmeta
WHERE post_id = %d
AND meta_key = %s
",
13, 'stack overflow'
)
);
通过让受影响的插件在null
方法中发送 a 作为第二个和第三个参数,它将彻底解决问题。