准备好的语句在ACF中使用不正确?

时间:2014-05-01 作者:bestprogrammerintheworld

我刚刚更新到WP 3.9,当不正确使用占位符时,它会返回一条警告。我发现一些准备好的语句写得不正确,但当我在ACF插件中看到这一点时,我真的很担心(因为它被广泛使用):(看看插件核心文件中的export.php)

// create SQL with %d placeholders
$where = \'WHERE ID IN (\' . substr(str_repeat(\'%d,\', count($my_options[\'acf_posts\'])), 0, -1) . \')\';

// now prepare the SQL based on the %d + $_POST data
$posts = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->posts} $where", $my_options[\'acf_posts\']));
这似乎是插件的漏洞?(因为实际prepare语句中缺少实际占位符(他们正在使用$where 或者我的假设完全不正确?请引导我:-)

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

我很肯定你是错的。

让我们仔细看看您在问题中提到的这段代码。

在第一行设置$where 变量:

$where = \'WHERE ID IN (\' . substr(str_repeat(\'%d,\', count($my_options[\'acf_posts\'])), 0, -1) . \')\';
所以这条线真正的作用是:

获取一些选项的数目(我们称之为“N”)

  • 重复%d 占位符N次将其附加到字符串WHERE ID IN (\'.
  • So$where 变量包含如下字符串:

    WHERE ID IN (%d, %d, %d, ...)
    
    。。。正如您所看到的,这个字符串包含占位符。

    在这一行之后是真正的查询,它是使用$where 变量,并使用这些占位符插入选项值。

    当您构建查询字符串时,如果这些变量包含安全字符串(即不包含来自用户的值),那么使用变量并没有什么坏处。

    请看下面的代码:

    $sql = "SELECT * FROM {$wpdb->posts} WHERE ID=%d";
    $results = $wpdb->get_results( $wpdb->prepare( $sql, 10 ) );
    
    你认为这也是一种脆弱性吗?

    结束
    准备好的语句在ACF中使用不正确? - 小码农CODE - 行之有效找到问题解决它

    准备好的语句在ACF中使用不正确?

    时间:2014-05-01 作者:bestprogrammerintheworld

    我刚刚更新到WP 3.9,当不正确使用占位符时,它会返回一条警告。我发现一些准备好的语句写得不正确,但当我在ACF插件中看到这一点时,我真的很担心(因为它被广泛使用):(看看插件核心文件中的export.php)

    // create SQL with %d placeholders
    $where = \'WHERE ID IN (\' . substr(str_repeat(\'%d,\', count($my_options[\'acf_posts\'])), 0, -1) . \')\';
    
    // now prepare the SQL based on the %d + $_POST data
    $posts = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->posts} $where", $my_options[\'acf_posts\']));
    
    这似乎是插件的漏洞?(因为实际prepare语句中缺少实际占位符(他们正在使用$where 或者我的假设完全不正确?请引导我:-)

    1 个回复
    最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

    我很肯定你是错的。

    让我们仔细看看您在问题中提到的这段代码。

    在第一行设置$where 变量:

    $where = \'WHERE ID IN (\' . substr(str_repeat(\'%d,\', count($my_options[\'acf_posts\'])), 0, -1) . \')\';
    
    所以这条线真正的作用是:

    获取一些选项的数目(我们称之为“N”)

  • 重复%d 占位符N次将其附加到字符串WHERE ID IN (\'.
  • So$where 变量包含如下字符串:

    WHERE ID IN (%d, %d, %d, ...)
    
    。。。正如您所看到的,这个字符串包含占位符。

    在这一行之后是真正的查询,它是使用$where 变量,并使用这些占位符插入选项值。

    当您构建查询字符串时,如果这些变量包含安全字符串(即不包含来自用户的值),那么使用变量并没有什么坏处。

    请看下面的代码:

    $sql = "SELECT * FROM {$wpdb->posts} WHERE ID=%d";
    $results = $wpdb->get_results( $wpdb->prepare( $sql, 10 ) );
    
    你认为这也是一种脆弱性吗?