为什么wordpress wpdb->准备将%更改为随机guid

时间:2018-02-19 19:51:00

标签: wordpress

这开始于我试图弄清楚如何让某些东西起作用并被我得到的输出感到困惑。当我测试以确保我清楚地写出这个问题时,我偶然发现了答案。现在这个问题变成了为什么它会以这种方式表现,因为它让我非常困惑,并让我相信问题与它完全不同。

我需要查询我创建的wordpress数据库中的自定义表。我需要多个列,可能有多行,所以我使用了$wpdb->get_results。但是,我知道防止sql注入非常重要,因此强烈建议将它与$wpdb->prepare结合使用。在我看过的所有例子中,有几种方法似乎适用于其他方式,例如:

$wpdb->get_results($wpdb->prepare(
    "SELECT * FROM %s WHERE ADDRESS LIKE %%%s%%", $tableName, $address
));

$wpdb->get_results($wpdb->prepare(
    "SELECT * FROM %s WHERE ADDRESS LIKE %s", $tableName, '%' . $address . '%'
));

然而,在我开发这个时,我正在使用变量并打印到屏幕以进行调试,例如:

$theQuery = $wpdb->prepare(
    "SELECT * FROM %s WHERE ADDRESS LIKE %s", $tableName, '%' . $address . '%'
);
printf(nl2br("theQuery: " . $theQuery . PHP_EOL));

当我查看结果时,我会收到:

theQuery: SELECT * FROM 'wp_table' WHERE ADDRESS LIKE '{38f7caa660e456637b3924006588169e1912b28c0a81d0a4ae0d77885704a425}11th ST{38f7caa660e456637b3924006588169e1912b28c0a81d0a4ae0d77885704a425}'

似乎$wpdb->prepare语句导致%被转换为某种类型的GUID。每次刷新页面时,GUID都会更改值,因此每次都会为%符号生成新的GUID。这显然是它提供安全防止sql注入的方式的一部分,但由于我不知道它会以这种方式表现并且从未在文档中看到过,我认为这是我的问题。我尝试了很多组合,它总是无法检索任何结果,我一直认为这是因为它与那些GUID错误行为。我最终发现ACTUAL问题包括表名作为prepare语句中的参数。它导致查询在表名周围有单引号,导致MySQL语法错误,并且不返回任何结果。

为什么它会生成这些GUID,并且在测试过程中有没有办法将它们作为%打印到浏览器进行调试?

谢谢!

1 个答案:

答案 0 :(得分:2)