WPDB: Update table

时间:2021-03-23 作者:Jonas

我目前正在开发我的第一个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功能来说是不必要的:$应取消对数据的转义(函数将为您转义)。键是列,值是值"E;(https://codex.wordpress.org/Data_Validation#Database).

2 个回复
SO网友:Sally CJ

现在我了解到,我更改数据库的方式在SQL注入方面是不安全的。

所以我想知道你是从哪里/怎么知道的?

除此之外,您应该检查这两个POST变量是否已实际设置toggle_status() 代码在我看来很好$wpdb->update() 是在WordPress中更新数据库中记录的简单方法,因此您应该只使用该函数,而不必使用;“长”;版本:$wpdb->query( $wpdb->prepare( "UPDATE ...", ... ) ).

实际上,如果要使用该版本,那么正确的语法是:

$wpdb->query(
    $wpdb->prepare( "UPDATE $tablename SET active = %s WHERE id = %d", $active, $id )
);
一、 e.不要将查询值占位符括在引号中,例如%s 而不是\'%s\', 对于每个占位符,将其替换值作为直接参数传递给$wpdb->prepare() 而不是像在代码中那样作为数组的一部分。

是的,有$wpdb->update(), 您应该传递原始数据,而不是转义数据,例如传递"foo" 原封不动\\"foo\\". 否则,函数会将该转义值加倍转义为\\\\\\"foo\\\\\\"...

SO网友:Frackl3

如果您检查source code 对于$wpdb->update() 它所做的最后一件事是准备查询,然后运行它并返回它。

因此,要回答您的问题,它是安全的,并且文档是正确的。