Salut FiRe_StoRM,
0x27 est juste la notation hexadécimale du nombre 39. Le préfixe 0x servant à préciser qu'il s'agit d'un chiffre en hexadécimal.
Tu peux le vérifier en PHP en faisant
echo 0x27; , ce qui t'affichera
39.
(Si cela te fait penser à une adresse mémoire c'est parce qu'elles emploient la même notation.)
Il ne faut pas confondre avec MySQL, qui interprète les chiffres en notation hexadécimale comme des chaines de caractères, ainsi (
SELECT 0x616263 renverra
abc)
Et on peut aussi remarquer que 39 est le code ASCII d'une simple quote. Toujours vérifiable en faisant
echo chr(0x27); qui t'affiche
'.
Maintenant parlons des caractères multibytes.
Le jeu de caractères habituels que nous employons utilise des caractères qui sont codés sur 1 octet (donc de 0 à 255).
En effet vu le peu de caractères cela suffit. Mais certains alphabets en contiennent un si grand nombre, qu'il devient impossible de les coder tous en utilisant seulement les valeurs possibles avec un seul octet : dans ce cas le charset utilise alors plusieurs octets pour coder un caractère, c'est un charset multi-octet (ou multi-byte en anglais). On peut citer en exemple les charsets chinois comme GBK ou BIG5.
Maintenant, le seul problème de sécurité en php que je connais qui fait intervenir cela, c'est celui de l'échappement des caractères par une fonction qui ne tient pas compte du charset utilisé par MySQL (addslashes, mysql_escape_string ou les magic_quotes). Voici un lien intéressant à ce sujet :
http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-stringVoilà un exemple de ce problème (qui paraphrase ce que dit l'auteur) : imaginons que MySQL utilise le charset BIG5. Addslashes ne tient pas compte du fait que big5 utilise des caractères multi-octets comme par exemple ce caractère
兝 dont le code hexadécimal est
0xa25c. Et avec addslashes, les quotes (entre autres) dont le code hexadécimal est
0x27 seront précédés d'un anti-slash
0x5c. Donc si j'envoie la chaine «
¢' »,
0xa227 en hexadécimal, elle sera remplacée par la chaine
0xa25c27, et lorsque cette chaine sera utilisée dans la requête SQL, étant donné que
0xa25c est un caractère valide dans le charset BIG5, MySQL l'interprétera comme une chaine formée de deux caractères : notre caractère multi-octet et une quote ! On pourra donc utiliser des quotes dans une requête censée être sécurisée, ce qui nous mène au problème des injections SQL ...
Voilà voilà,
j'espère que c'est plus clair.
++
Niklos