所以我有点困惑为什么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()方法,是否会带来非常严重的安全风险?
2条答案
按热度按时间sqxo8psd1#
您是对的,为了防止SQL注入,您必须使用查询参数。
为LIKE“转义”字符串的目的与防止SQL注入的目的不同。
%
和_
字符是LIKE表达式中的通配符。但是,如果要按字面匹配这些字符,该怎么办?SQL提供了一个解决方案:
https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like
若要测试通配符的文本示例,请在其前面加上转义符。
默认转义字符为
\
。pokxtpni2#
WordPress使用一种独特的、不完全文档化的方案来处理
$wpdb->prepare()
。显示一些以这种方式准备的SQL,您就会明白我的意思--出现了长的uniqueid字符串,稍后在->execute()
阶段被理顺。->esc_like()
是这个方案的一部分。当然,这其中很大一部分是为了防止注入。