WordPress PHP,为什么esc_like方法是需要的LIKE类型的查询?

13z8s7eq  于 2022-12-22  发布在  WordPress
关注(0)|答案(2)|浏览(149)

所以我有点困惑为什么WordPress上有一个像esc_like()这样的方法:https://developer.wordpress.org/reference/classes/wpdb/esc_like/建议LIKE使用的参数必须使用esc_like()进行转义以确保安全,如下所示:

$wild = '%';
$find = 'only 43% of planets';
$like = $wild . $wpdb->esc_like( $find ) . $wild;
$sql  = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE %s", $like);

但为什么呢?

$sql  = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE %s", $like);

在这种情况下,正确地准备LIKE参数还不够吗?我不明白不使用esc_like会在哪里出错,如果不使用esc_like方法,是否真的会导致漏洞。
据我所知,$wpdb-〉prepare应该足够了,但最近了解到这一点,我不确定。
所以主要的问题是,如果不使用$wpdb-〉esc_like()方法,是否会带来非常严重的安全风险?

sqxo8psd

sqxo8psd1#

您是对的,为了防止SQL注入,您必须使用查询参数。
为LIKE“转义”字符串的目的与防止SQL注入的目的不同。
%_字符是LIKE表达式中的通配符。但是,如果要按字面匹配这些字符,该怎么办?
SQL提供了一个解决方案:
https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like
若要测试通配符的文本示例,请在其前面加上转义符。
默认转义字符为\

pokxtpni

pokxtpni2#

WordPress使用一种独特的、不完全文档化的方案来处理$wpdb->prepare()。显示一些以这种方式准备的SQL,您就会明白我的意思--出现了长的uniqueid字符串,稍后在->execute()阶段被理顺。
->esc_like()是这个方案的一部分。当然,这其中很大一部分是为了防止注入。

相关问题