2017-09-13 4 views
1

Impossible de trouver une réponse mais de se demander si la requête suivante vers la base de données est vulnérable à l'injection sql.L'utilisation de la fonction de base de données get_results() WordPress empêche-t-elle l'injection SQL?

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

C'est la requête qui est utilisée:

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

Vive

+1

Quelle est la requête? L'injection se produit avec une interpolation de chaîne ou une concaténation, mais '$ querySearchVals' pourrait contenir n'importe quoi ici, donc ... peut-être? – tadman

+0

@tadman J'ai ajouté la requête pour vous, merci pour l'aide –

+2

Ouais, cette chose est grande ouverte et super plein de trous. Utilisez des valeurs d'espace réservé pour * toutes les données utilisateur * et toutes. – tadman

Répondre

2

Ok afin Tadman a expliqué les get_results n'empêche pas l'attaque d'injection sql.

La fonction de préparation doit être utilisée.

J'ai re écrit le code ci-dessus pour empêcher l'injection 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' n'est pas sûr non plus. –

+0

@ Michael-sqlbot est-ce parce que la valeur $ offset vient de $ _POST var –

+0

Cela ne le rend pas sûr. Il n'est pas prudent de concaténer quoi que ce soit dans une requête qui n'a jamais été en votre possession. –