Sécurité contre les injections SQL? Quelle est la solution?

Mammouth du PHP | 1511 Messages

03 sept. 2006, 13:10

Bonjour a tous,
j'ai consulté recemment un très bon article sur les injections SQL dans le magazine PhpSolution parlant des injections SQL.
Quelle est donc la vraie solution pour contre les injections étant donné que les antislashs ne sont pas la solution qui résout tout?
Doit on créer une REGEX qui va supprimer les fonctions mysql qui transiteraient via les URL ?
Quand on lit ce genre d'articles, on se dit qu'on est vraiment très vulnérable face a ces attaques.
Donc quelle est la solution miracle pour les contrer?
@+ et merci d'avance ;)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

03 sept. 2006, 13:59

La solution est plutôt simple, il suffit pour chaque variable utilisée dans une requête de la faire passer par mysql_real_escape_string() ou encore intval() ou floatval() selon son type. En clair, il faut systématiquement valider les données utilisateur. Exemple, un moteur de recherche pour trouver les utilisateurs d'un site:
//
$sql = "SELECT *
          FROM utilisateurs
         WHERE nom LIKE '" . mysql_real_escape_string($_POST['nom'], $db) . "%'
           AND age >= " . intval($_POST['age']);
À la place d'intval(), tu pourras peut-être préférer une solution basée sur une expression rationnelle afin de présenter un message d'erreur à l'utilisateur s'il entre une valeur incorrecte.

Mammouth du PHP | 1511 Messages

03 sept. 2006, 14:17

Oups, j'avais oublié cette fonction :)
Mais bon, est ce que ceci est l'ultime parade?
@+

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

03 sept. 2006, 15:00

Si tu fais passer absolument toutes les variables par mysql_real_escape_string(), oui. D'un autre côté, il y a généralement d'autres façons un peu plus adaptée de procéder comme je le disais plus haut il vaut mieux vérifier qu'un nombre est bien un nombre, ou même utiliser les deux pour couvrir ses arrières (on peut se tromper dans l'expression rationnelle par exemple). Sinon, oui, mysql_real_escape_string() est la solution ultime.