wpdb-> insert:我需要针对SQL注入做准备吗?


14

我需要在wpdb-> insert之前使用wpdb prepare吗?

如果我要使用wpdb-> insert将值插入wordpress表中,我是否需要在插入数据之前“清理”我的数据,或者此方法(wpdb-> insert)对我有用吗?

Answers:


21

不,您不应该准备或转义数据,这是由wpdb班级为您完成的。

wpdb类参考

资料

(数组)要插入的数据(在列=>值对中)。$ data列和$ data值均应为“原始”(均不应使用SQL转义)。

但是,如果您是在编写自己的SQL而不是使用该insert方法,那么可以,请使用进行转义prepare


8
要添加一个提示:这insertupdate不需要这样。但应与结合使用query
kaiser

1

以下是wpdb类的警告。

https://codex.wordpress.org/Class_Reference/wpdb

一个警告

此类中的某些函数将SQL语句作为输入。您必须对SQL合并到SQL查询中的所有不受信任的值进行SQL转义,以防止SQL注入攻击。检查文档,以了解您打算使用的函数是为您自己转义了SQL还是希望它已被预转义。

因此,我将其读为-wpdb类不会自动为您准备或转义数据。

我非常确定,如果您不能100%信任代码中的数据源,那么建议您使用prepare类(?)。

不要认为使用prepare类会在未正确使用prepare类的情况下对其进行修复。我对此很陌生,所以如果我不正确,请发表任何更正作为答复。

$ wpdb-> prepare(“ SELECT * FROM table WHERE ID =%d AND name =%s”,$ id,$ name);

在上面的语句中,有2个额外的属性。一个用于ID,一个用于名称。据我阅读,每一个都对应于您查询中的项目数。另外,%s =字符串,%d =整数,%f =浮点数。

另外,根据我的阅读,如果您不添加额外的属性,那么prepare实际上将无济于事。会有警告,但是如果您将其关闭,也许您将不会知道。

这是来自类引用本身的示例,其中他们在下面的INSERT中添加了prepare类。

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

$ wpdb-> query($ wpdb-> prepare(“插入$ wpdb-> postmeta(post_id,meta_key,meta_value)VALUES(%d,%s,%s)”,array(10,$ metakey,$ metavalue) ));

我担心的是,根据“没人”引用的同一页面,被投票的答案是错误的。我假设您使用的是prepare(),但未使用其他标准的php逃逸方法,因为我也认为这个答案是正确的……直到我更深入地研究为止。

无论如何...也许自原始答案以来情况已经发生了变化。


嗯,这听起来更像是一个问题,而不是答案
Mark Kaplun '18

接受的答案是正确的。当使用$wpdb->insert()$ wpdb-> update()之类的函数或$wpdb->delete()数据应为RAW时。在使用eg $wpdb->query()并将SQL语句作为输入传递的情况下,应转义不受信任的数据。
nmr

NMR,我想我现在明白了。因此,为了澄清起见,出于我的理智,您作为示例使用的是“插入方法和删除方法”,而不是我使用的使用“查询方法”的示例...(%wpdb ->查询)。我要删除答案吗?还是离开?
Felixius

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.