mysql - 使用 WordPress get_results() 数据库函数是否可以防止 sql 注入(inject)

标签 mysql wordpress security sql-injection

似乎找不到答案,但想知道以下对数据库的查询是否容易受到 sql 注入(inject)的攻击。<​​/p>

$searchPostResults = $wpdb->get_results($querySearchVals, OBJECT);

这是使用的查询:

global $wpdb;
$offset = (isset($_POST["moreSearchResults"])) ? $_POST["searchOffset"] : 0;

$querySearchVals = "
    SELECT DISTINCT post_title, ID
    FROM {$wpdb->prefix}posts
    WHERE (";

$sVals = array();
$sVals = explode(" ", $searchVal);

$lastIndex = intval(count($sVals)) - 1;
$orderByCaseVals = "";
for($i = 0; $i<count($sVals);$i++)
{
    $querySearchVals .= " post_title LIKE '%$sVals[$i]%' ";
    if($i != $lastIndex)
        $querySearchVals .= " OR ";

    $orderByCaseVals .= " WHEN post_title LIKE '%$sVals[$i]%' THEN ($i + 2) ";
}

$querySearchVals .= ") 
    AND {$wpdb->prefix}posts.post_type = 'post'
    AND post_status = 'publish' 
    ORDER BY CASE
        WHEN post_title LIKE '%$searchVal%' THEN 1
        $orderByCaseVals
    END
    LIMIT $offset, 6;
";

干杯

最佳答案

好的,正如 tadman 所解释的,get_results 并不能阻止 sql 注入(inject)攻击。

需要使用prepare函数。

为了防止sql注入(inject),我重写了上面的代码:

global $wpdb;
$offset = (isset($_POST["moreSearchResults"])) ? $_POST["searchOffset"] : 0;

$querySearchVals = "
    SELECT DISTINCT post_title, ID
    FROM {$wpdb->prefix}posts
    WHERE (";

$sVals = array();
$sVals = explode(" ", $searchVal);

$lastIndex = intval(count($sVals)) - 1;
$orderByCaseVals = "";
for($i = 0; $i<count($sVals);$i++)
{
    $queryPrep = $wpdb->prepare(" post_title LIKE '%%%s%%' ", $wpdb->esc_like( $sVals[$i] ));
    $querySearchVals .= $queryPrep;
    if($i != $lastIndex)
        $querySearchVals .= " OR ";

    $queryPrep = $wpdb->prepare(" WHEN post_title LIKE '%%%s%%' THEN ($i + 2) ", $wpdb->esc_like( $sVals[$i] ));
    $orderByCaseVals .= $queryPrep;
}

$querySearchVals .= ") 
    AND {$wpdb->prefix}posts.post_type = 'post'
    AND post_status = 'publish' 
    ORDER BY CASE";

$queryPrep = $wpdb->prepare(" WHEN post_title LIKE '%%%s%%' THEN 1 ", $wpdb->esc_like( $searchVal ));
$querySearchVals .= $queryPrep;
$querySearchVals .= "
        $orderByCaseVals
    END
";

$queryPrep = $wpdb->prepare(" LIMIT %d, 12", $offset);
$querySearchVals .= $queryPrep . ";";

关于mysql - 使用 WordPress get_results() 数据库函数是否可以防止 sql 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46208353/

相关文章:

mysql - 无法在 MySQL 中找出涉及 4 个表的 SQL 查询

php - 从 WooCommerce 中的产品属性中删除 <p> 标签

security - 盐的目的是什么?

c# - 如何在托管代码中创建 Windows 安全描述符?

Mysql SELECT 并返回多行,但在存在时更喜欢一个列值而不是另一个列值

mysql添加主键

PHP以正确的顺序从五个不同的表中检索信息

wordpress - FullCalendar 的 JSON feed 加载缓慢

mysql - 连接必须有效并使用 vb.net 打开 VB.net 错误

php - PHP 的 $_SERVER ['REMOTE_ADDR' 的可靠性]