我目前正在开发我的第一个WordPress插件,目前对如何更改数据库中的记录感到有点困惑。
到目前为止,我已经使用$wpdb::update()函数对其进行了求解:
public function toggle_status() {
global $wpdb;
$id = (int) $_POST["id"];
$active = (int) $_POST["active"];
$tablename = $wpdb->prefix . 'myplugin_table';
$wpdb->update($tablename, array("active" => $active), array("id" => $id)); // Update record
}现在,我已经了解到,对于SQL注入,更改数据库的方式是不安全的。我应该使用$wpml::prepare()函数:
$wpdb->query($wpdb->prepare("UPDATE $tablename SET active = '%s' WHERE id = '%d'", array($active, $id)));$wpdb::update()函数真的不安全吗?
根据文档,这对于$wpdb函数来说不是必需的:"$data应该是未转义的(函数将为您转义它们)。键是列,值是值。“(https://codex.wordpress.org/Data_Validation#Database)。
发布于 2021-03-23 01:19:52
现在,我已经了解到,对于SQL注入,更改数据库的方式是不安全的。
所以我想知道你是从哪里学来的?
除此之外,您应该检查这两个POST变量是否真的设置了,在我看来,您的toggle_status()代码很好,$wpdb->update()是在WordPress中更新数据库中记录的一种简单方法,所以您应该只使用这个函数,而不是使用"long“版本:$wpdb->query( $wpdb->prepare( "UPDATE ...", ... ) )。
实际上,如果要使用该版本,那么正确的语法是:
$wpdb->query(
$wpdb->prepare( "UPDATE $tablename SET active = %s WHERE id = %d", $active, $id )
);也就是说,不要将查询值占位符封装在引号中,例如,仅用%s而不是'%s',对于每个占位符,将其替换值作为$wpdb->prepare()的直接参数传递,而不是像在代码中那样作为数组的一部分。
是的,使用$wpdb->update(),您应该传递原始数据,而不是转义数据,例如传递"foo" as-is,而不是像\"foo\"那样转义。否则,函数将双转义,转义值为\\\"foo\\\".
发布于 2022-01-21 21:40:37
如果您检查源代码的$wpdb->update(),它所做的最后一件事就是准备查询,然后运行它并返回它。
因此,要回答你的问题,它是安全的,文件是正确的。
https://wordpress.stackexchange.com/questions/385544
复制相似问题