WordPress 6.1 的 wpdb::prepare 将转义表和字段名称,加强程序的安全性
作为 WordPress 6.1 版本的一部分,wpdb::prepare() 也更新了,它可以使用 %i
占位符转义标识符(例如表和字段名称)。
这可以确保这些值被正确转义,然后不会导致 SQL 注入漏洞。举个例子:
$table = 'my_table';
$field = 'my_field';
$value = 'my_value';
$wpdb->prepare('SELECT * FROM %i WHERE %i = %s', $table, $field, $value);
// 输出:
// SELECT * FROM `my_table` WHERE `my_field` = 'my_value'
虽然这可以保护免受 SQL 注入攻击,但是还是应该尽可能限制用户(攻击者)从允许的可信值列表中选择,例如:
$fields = array(
'name' => 'user_nicename',
'url' => 'user_url',
'created' => 'DATE(created)',
);
$sql .= ' ORDER BY ' . ($fields[$order_field] ?? 'user_login');
这样的改进,还有一点点的性能方面的改进,添加对 %i
的支持会让正则表达式减少。
以后 WordPress 还将把 %i
占位符的支持放到 WP_Query 的查询中,对整体性能都会有所提高。