2017-09-13 7 views
1

答えは見つからないようですが、データベースへの次のクエリがSQLインジェクションに対して脆弱かどうか疑問に思っています。WordPress get_results()データベース関数を使用してSQLインジェクションを防止しますか?

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

これは、使用されるクエリです:tadmanはget_resultsは、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++) 
{ 
    $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

クエリはどのようなものです:

私は、SQLインジェクションを防ぐために、上記のコードを書き換えてきましたか?インジェクションは文字列の補間や連結で行われますが、 '$ querySearchVals'には何も含めることができるので、多分...? – tadman

+0

@tadmanヘルプのおかげで、あなたのためにクエリを追加しました –

+2

ええ、この事は広く開いていて、穴がいっぱいです。 *任意のユーザーデータとすべての*ユーザーデータにプレースホルダ値を使用します。 – tadman

答えて

2

[OK]をクリックします。

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

'LIMIT $ offset'も安全ではありません。 –

+0

@ Michael-sqlbotは、$ offset値が$ _POST var –

+0

から来るので、安全ではありません。今まであなたが所有していなかったクエリに何かを連結することは安全ではありません。 –

関連する問題