2009-07-22 10 views
1

Est-ce la meilleure façon de le faire?en utilisant mysql_real_escape_string pour nettoyer mes requêtes

Devrais-je faire cela à chaque valeur dans chaque requête? GET et POST?

Est-ce que addslashes(mysql_real_escape_string()) est trop?

+0

duplication possible de [Meilleure façon d'arrêter l'injection SQL en PHP] (http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – outis

Répondre

6

Si vous utilisez mysql_query() alors oui, mysql_real_escape_string() est le meilleur moyen. Et oui, vous devez l'appliquer à tous les paramètres que vous mélangez dans votre déclaration SQL. Par exemple.

$query = " 
    SELECT 
    x,y,z 
    FROM 
    foo 
    WHERE 
    a = '". mysql_real_escape_string($_POST['a'], $mysql) . "' 
    AND b = '". mysql_real_escape_string($_POST['b'], $mysql) . "' 
"; 

Mais vous pouvez également utiliser des instructions préparées, par ex. avec le module pdo. Les paramètres sont transférés en dehors de l'instruction sql et ne nécessitent donc pas d'échappement. C'est plus sécurisé (puisque vous ne pouvez pas oublier l'échappement ou le faire mal/pour le mauvais charset), souvent plus rapide et très souvent même plus simple que de mélanger les paramètres dans l'instruction. par exemple.

$pdo = new PDO('mysql:host=localhost;dbname=test', '..', '..'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare(" 
    INSERT INTO 
    foo (x,y,z) 
    VALUES 
    (:x,:y,:z) 
"); 

$stmt->bindParam(':x', $x); 
$stmt->bindParam(':y', $y); 
$stmt->bindParam(':z', $z); 

// insert all records (0,0,0) ... (0,1,0) ... (9,9,9) 
for($x=0; $x<10; $x++) { 
    for($y=0; $y<10; $y++) { 
    for($z=0; $z<10; $z++) { 
     $stmt->execute(); 
    } 
    } 
} 

edit: et addslashes (mysql_real_escape_string()) est non seulement exagéré, mais aussi mal.

+1

+1 pour suggérer déclarations préparées/AOP – karim79

1

Vous devez avoir une connexion mysql déjà établie dans votre script pour utiliser mysql_real_escape_string().

Avez-vous essayé AOP?
Il empêche automatiquement les attaques par injection mysql.

$db = new PDO("mysql:host=$dbhost;dbname=$default_dbname", $dbusername, $dbuserpassword); 

$st = $db->prepare ('SELECT * from my_table WHERE owner= ? and dog = ?'); 
$st->execute (array('Bob', 'Rex')); 

$data = $st->fetchAll(); 

peut vouloir utiliser htmlentities() sur la sortie cependant.

Questions connexes