代码之家  ›  专栏  ›  技术社区  ›  Web Dev Guy

使用WordPress get\u results()数据库函数是否会阻止sql注入

  •  4
  • Web Dev Guy  · 技术社区  · 7 年前

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

    $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;
    ";
    

    干杯

    1 回复  |  直到 7 年前
        1
  •  1
  •   Web Dev Guy    7 年前

    正如塔德曼所解释的那样,get\U结果并不能阻止sql注入攻击。

    需要使用prepare函数。

    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 . ";";