2017-09-13 22 views
1

似乎無法找到答案,但想知道對數據庫的以下查詢是否容易受到sql注入的影響。是否使用WordPress的get_results()數據庫函數防止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

什麼是查詢?注入發生在字符串插值或串聯,但是'$ querySearchVals'可以包含任何東西,所以......也許? – tadman

+0

@tadman我已經爲你添加了查詢,謝謝你的幫助 –

+2

是的,這個東西是開放的,超級滿洞的。爲任何和所有用戶數據使用佔位符值。 – tadman

回答

2

好了,所以作爲tadman解釋get_results不會阻止SQL注入攻擊。

需要使用準備功能。

我已經重新編寫上面的代碼,以防止SQL注入:

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

'LIMIT $ offset'也不安全。 –

+0

@ Michael-sqlbot是因爲$ offset值來自$ _POST var –

+0

這並不安全。把任何東西連接成一個你所擁有的查詢是不安全的。 –