WordPress数据库查询的安全处理

esc_sql( string|array $data )

esc_sql() 函数用于转义字符串或者数组,但是一般还是建议使用 wpdb::prepare(),因为后者更安全些。

使用范围

  1. 在一些 IN 语句中
  2. 字符串中包含‘%’百分号的查询
  3. 比如LIKE 语句

使用注意

使用该函数的时候,变量在SQL代码里面应该被单引号包括。如下

<?php
$name   = esc_sql( $name );
$status = esc_sql( $status );
$wpdb->get_var( "SELECT something FROM table WHERE foo = '{$name}' and status = '{$status}'" );
//错误示范
//$wpdb->get_var( "SELECT something FROM table WHERE foo = {$name} and status = {$status}" );
?>
wpdb::prepare( string $query, array|mixed $args )

wpdb::prepare() 函数被用于安全的执行SQL查询,类似于PHP里面的sprintf()输出,变量在后,查询代码里面使用占位符。

使用

可以在查询字符串中使用三种占位符:%d(整数)%f(浮动)%s(字符串),按照实际情况使用。

$wpdb->query(
    $wpdb->prepare(
        "SELECT id FROM wp_posts WHERE id > %d AND `post_status` = %s", 
        $min_id, $status 
    )
);

使用注意

  1. 占位符在查询里面不得使用任何符号包括,比如引号,括号等等
  2. 查询字符串里面确实包含【%】的话,比如【LIKE查询】,改写为【%%】
  3. 查询里面并不是所有都需要做占位符替换的,但是占位符和后置的变量数目必须一致
  4. 后置变量可以是单独的几个,也可以用数组包围起来,但是不能混用

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据