fonction addslashes
Par Wam mania le jeudi, août 14 2008, 15:49 - PHP5 - Lien permanent

La méthode addslashes est mondialement connue pour échaper les ' ou les " dans les chaînes de caractères à destination de requète SQL. Ca, c'est ce que tout le monde croit.
Suite à un entretien dernièrement ou j'ai passé un test de PHP dans lequel on me demandait - encore - de choisir entre 4 choix pour empêcher les injections SQL.
ET BAH C'EST PAS ADDSLASHES !!!
J'avais envie de le crier haut et fort.
Quelques explications :
Les véritables méthodes d'échappement d'une requète liée à une base sont les méthodes propres à ces bases !
Par exemple, la fonction PHP mysql_real_escape_string n'est utilisable QUE si la connexion à MySQL est ouverte. Cela car c'est belle et bien MySQL qui échappe la chaîne et non PHP.
Ainsi, toutes les bases de données ont leurs méthodes d'échappement, et les fonctions PHP qui les appellent :
- mysql_real_escape_string
- pg_escape_string
- db2_escape_string
- dbx_escape_string
- maxdb_escape_string
- mysqli_escape_string
- sqlite_escape_string
L'arrivée de composant comme PDO permet de s'abstraire de tous ces problèmes (à condition de ne pas faire n'imp). Je conseille personnellement de ne plus utiliser que ça. Ca évite d'avoir à réfléchir sur des problèmatiques de sécurité seul dans son coin alors qu'une communauté bien plus forte que toi le fait à ta place !
Bon, sinon, pourquoi addslashes c'est pas bon ? Simplement à cause d'une 'confusion' entre single-byte et multi-byte string.
En single-byte string, 0xbf27 devient 0xbf (¿) suivi de 0x27 ('), c'est à dire (¿'). Ceci car 0xbf27 n'est pas un multi-byte valide. Si on passe ceci dans addslashes, on obtient 0xbf5c27, c'est à dire ¿\' en single-byte string. Seulement voila 0xbf5c est un multi-byte string valide, du coup, la chaîne devient 縗 ' Et voila notre ( ' ) qui n'est plus échappé.