injection mysql et php

WRInaute occasionnel
Salut,

Maintenant que PHP met par défaut des \ devant toutes les apostrophes, antislashes, etc. des variables passées en GET, POST ou Cookies, faut-il encore se méfier des injections mysql ?
 
WRInaute accro
oui, d'ailleurs j'ai un petit script qui les vire au chargement de chaque page pour que je puisse les gérer moi même.

Code:
 if (get_magic_quotes_gpc()) {
  foreach($_POST as $i=>$var) $_POST[$i]=stripslashes($var);
  foreach($_GET as $i=>$var) $_GET[$i]=stripslashes($var);
 }

Ceci rend le script plus portable et si par malheur, les magic_quotes sont désactivés, ça change rien.
Et pour info, un addslashes ne suffit pas.
 
WRInaute impliqué
yann214 a dit:
Maintenant que PHP met par défaut des \ devant toutes les apostrophes, antislashes, etc. des variables passées en GET, POST ou Cookies, faut-il encore se méfier des injections mysql ?
D'autant plus que ce ne sera plus par défaut dans la prochaine version me semble-t-il.
 
WRInaute occasionnel
Que me conseillez-vous alors ?
Que j'ajoute moi-même ces anti-slashes à chaque requête ?
via la fonction addslashes ? mysql_real_escape_string ?
 
WRInaute accro
htmlspecialchars($chaine,ENT_QUOTES);
+ un mysql_real_escape_string

et

intval() pour tout ce qui est nombre entier.
 
WRInaute occasionnel
je viens également de trouver ça dans la doc de php, qui s'adapte à la config :

Code:
<?php

if (isset($_POST['product_name']) && isset($_POST['product_description']) && isset($_POST['user_id'])) {
    // Connect

    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');

    if(!is_resource($link)) {

        echo "Échec de la connexion au serveur\n";
        // ... historisation de l'erreur

    } else {

        // Annule les effets magic_quotes_gpc/magic_quotes_sybase sur ces variables si ON.

        if(get_magic_quotes_gpc()) {
            $product_name        = stripslashes($_POST['product_name']);
            $product_description = stripslashes($_POST['product_description']);
        } else {
            $product_name        = $_POST['product_name'];
            $product_description = $_POST['product_description'];
        }

        // Faire une requête sécurisée
        $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)",
                    mysql_real_escape_string($product_name, $link),
                    mysql_real_escape_string($product_description, $link),
                    $_POST['user_id']);

        mysql_query($query, $link);

        if (mysql_affected_rows($link) > 0) {
            echo "Produit inséré\n";
        }
    }
} else {
    echo "Remplissez le formulaire proprement\n";
}
?>
 
Discussions similaires
Haut