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?
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?
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 pour suggérer déclarations préparées/AOP – karim79
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.
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