2010-01-26 11 views
0

J'ai une requête MySQL qui exige que les paramètres soient enfermés dans « » ou « »,citations dans les requêtes

si j'ai un tableau passé à cette fonction:

function orderbyfield($column, array $selection) 
{ 
// will it be alright (secure) to do this? 
foreach ($selection as $s) 
{ 
    $s = '"' . $s . '"'; 
} 
$string = implode(',', $selection) 
return array($column, $string); 
} 

et le transmettre à

function generate_sql() 
{ 
$fields = $this->orderbyfield(); // assuming the code is in a class 
$sql = 'SELECT FIELDS FROM TABLE ORDER BY FIELD (' . $fields[0] . ',' . mysql_real_escape_string($fields[1])); 
} 

Y aura-t-il des problèmes de sécurité avec cette approche?

EDIT suppose que le code est dans une classe, a fait plus nécessaire de $ this->

EDIT faute de frappe sur le foreach

+0

On dirait que vous avez oublié les paramètres de l'appel orderbyfield. – chiborg

Répondre

0

Comme d'autres ont dit que vous devez utiliser mysql_real_escape_string au point où vous créez la chaîne de requête. En outre, bien que la base de données peut être en mesure de jeter entre les types, toutes les variables doivent être citées dans les requêtes:

function enclose($val, $dbh) 
{ 
    if (($val==='') || (is_null($val))) { 
     return 'NULL'; 
    } 
    // is it a number? 
    if (preg_match('/^[\+-]*\d+\.?\d*$/', $val)) { 
     return($val); 
    } 
    // its a string 
    return("'" . mysql_real_escape_string($val, $dbh) . "'"); 
} 

Le traitement nul pourrait avoir besoin d'être peaufiné. (Ci-dessus est coupé à partir d'une interface générique j'utilise qui se lit aussi la structure de la table à l'aide DESCRIBE pour obtenir des conseils sur le moment de citer/utilisation, etc.) nulls

C.

0

Parce que vous utilisez la fonction mysql_real_escape_string, il est assez sûr en ce qui concerne les chaînes. Voir dealing with sql injection pour plus d'informations.

0

Vous devez ajouter des guillemets arround votre chaîne, mais il y a des citations dans vos cordes elles-mêmes devraient aussi être échappées - cela peut être fait en utilisant mysql_real_escape_string, mysqli_real_escape_string ou PDO::quote, selon le type de fonctions/méthodes que vous utilisez pour vous connecter à votre base de données.

Faire ce (Comme vous le faites déjà - ce qui est agréable) devrait éviter les injections SQL (au moins pour la chaîne: vous devez également vérifier que les valeurs numériques correspondent en effet à des données numériques, par exemple)


Une autre solution, peut-être un peu plus facile une fois que vous l'aurez, serait d'utiliser des instructions préparées.
Voir: