[RESOLU] Injection caractères de contrôle

ViPHP
ViPHP | 5462 Messages

23 mars 2010, 18:07

ouai php le verra, j'ai essayer avec ton \x30 , eclipse l'affiche meme pas, par contre sous PHP le strlen est égale a 1 et le ord() est bien egale a 30 :wink:

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 18:14

Cela est embetant mais c'était tout à fait prévisible. Enfin, embetant ... dans la mesure où le caractère "invisible" ne représente aucun danger c'est déjà le principal. Ceci étant, le caractère est invisible sous IE mais un carré apparait sous d'autres navigateurs Linux. Cela veut-il dire que je dois nettoyer les entrées de formulaires en supprimant tous les caractères de contrôle et surtout (parce que si quelqu'un s'amuse à envoyer un 'RS', il l'a forcément fait exprès, alors s'il y a un carré pour ce carractère sur la page HTML, c'est pas grave), convertir tous les caractères propres à AINSI en entités HTML (évidement, htmlentities ne fait rien pour € puisque le caractère 128 n'est pas un € pour lui ... il faudrait donc lui dire de faire if (ord($x) == 128) $x = "€"). Enfin, étant donné que le développement Web devrait devenir mon métier, ce n'est pas forcément indispensable mais j'essaie d'être le plus au norme possible (au moins pour l'apprentissage, en pratique, un peu de laxisme ;)).

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 18:29

Un truc marrant aussi : si vous rajoutez des caractères chinois dans un formulaire sur une page en ISO, votre navigateur (testé sous IE) convertit votre caractère chinois en code html (unicode ?) de type ㄒ

Alors au fond, pourquoi utiliser utf-8 ;) Je blague parce que sans CMS, il faut logiquement faire un htmlentities sur le résultat obtenu, du coup le caractère chinois disparait ... et si pas htmlentities, il faut au moins faire une convertion de <, de > et de &. Et là le caractère chinois disparait aussi ...

:)

Mais je trouve ça amusant que les formulaires veuillent à tout prix, au risque de donner des codes invalides, nous envoyer les données.

ViPHP
ViPHP | 5462 Messages

23 mars 2010, 18:35

suffis de passer htmlentities en UTF-8 et on aura nos caractère chinois, par contre on les aura pas en ISO d'ou l'interet de l'UTF-8

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 18:42

Oui oui tout à fait ... mais si tu fais htmlentities, vu que ton caractère chinois est sous la forme &#2525;, ton htmlentities aura beau etre en UTF-8, il convertira quand même le & en & du coup tu auras &#2525; et là ça ne marche plus. Donc utiliser UTF-8 pour la page HTML qui contient le formulaire ou ... éventuellement faire un utf8_encode sur le texte, faire un htmlenties dans l'espoir qu'il transforme le caractère chinois en entités HTML, puis repasser avec utf8_decode ...

Non, sérieux, je plaisante. Moi je suis plutôt ISO, car les caractères me conviennent. Mais si je dois utiliser des caractères UTF-8, je passerai en UTF-8. De toutes façons, je crois que l'on est amené à travailler en UTF-8 dans le futur (vive le code universel), et je dois me faire la main sur le traitement UTF-8 (mbstring).

ViPHP
ViPHP | 5462 Messages

23 mars 2010, 18:46

test :
<?php
	$str = @$_GET['str'];
	echo htmlentities($str, ENT_QUOTES, 'UTF-8');
?>
<form>
<textarea name="str"></textarea>
<button type="submit">ok</button>
</form>
tu va genre sur google.cn tu prend un ligne tu la met dedan, moi ca marche parfaitement et y'a aucune conversion, et j'ai meme mes caratere chinois dans la barre d'adresse

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 18:57

non ...

si j'utilise ton code :

1) ca ne fonctionne pas
2) IE ne convertit pas le caractère chinois en entité unicode html

Si tu tapes

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
</head>
<body>
<?php
$str = $_GET['str'];
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
?>
<form>
<textarea name="str"></textarea>
<button type="submit">ok</button>
</form>
</body>
</html>

il affiche &#22269;
si tu remplace htmlentities par $str, là le caractère chinois s'affiche. Dans le barre url on voit : test24.php?str=%26%2322269%3B alors que sans préciser l'encodage, on voyait quelque chose comme %25%24 (c'était pas les mêmes chiffres mais c'était ce style, c-a-d le caractère sur deux octets, normal quoi).

ViPHP
ViPHP | 5462 Messages

23 mars 2010, 19:02

normale c'est la ou je voulais en venir,
PHp par default envoie les entête en iso-8859-1, ducoup il essaye de transformer de l'utf-8 en ISO et les caractère la n'existe pas

2 solutions :
1 : mettre un header('Content-type: text/html; charset=utf-8'); a chaque pas PHp qu'on veut UTF-8
2 : aller dans le PHP.ini et mettre default_charset = "utf-8"

et bingo :wink:

firefox, chrome : dans l'adresse on a non caratere chinois
ie : dans l'adresse on a version urlencode

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 19:16

avec Firefox vous obtenez non pas %25%24 mais le caractère chinois ? Pourquoi pas ... ils font ce qu'ils veulent à partir du moment où à l'arrivée c'est la même chose :) Si j'y pense je regarderai l'header HTTP, mais de toutes façons, un caractère chinois n'a rien à faire dans de l'ISO-8859-1, on est d'accord ?

Par contre le signe € est assez légitime et je n'ai pas envie de coder en ISO-8859-15 (parce que autant passer à l'UTF8 dans ce cas). J'imagine qu'il faudrait donc sur l'application convertir toute la plage dédiée AINSI aux équivalents entités HTML. Ca sera en plus de la désactivation de magic_quotes (qui n'a pas à être sur on sur php5, ça me perturbe.)

Le forum phpfrance est bien j'aurai du y poster mes messages quand j'ai eu des problèmes avec GD (encore un problème d'affichage des caractères ... pour changer)

:evil:

J'ai un site qui parle de développement Web, et la majorité des articles est malheureusement consacrée au problèmes d'encodage ou de compatibilité IE/Firefox(+les autres). Rien que les images PNG transparents sur IE6 m'ont fait perdre la moitié de mes cheveux (lol). JE suis 100% pro normes et les hacks IE ça m'énerve !!

ViPHP
ViPHP | 5462 Messages

23 mars 2010, 19:19

avec Firefox vous obtenez non pas %25%24 mais le caractère chinois ? Pourquoi pas ... ils font ce qu'ils veulent à partir du moment où à l'arrivée c'est la même chose :) Si j'y pense je regarderai l'header HTTP, mais de toutes façons, un caractère chinois n'a rien à faire dans de l'ISO-8859-1, on est d'accord ?
ouai, mais firefox accepter l'unicode dans sa barre d'adresse, donc en utf-8
Par contre le signe € est assez légitime et je n'ai pas envie de coder en ISO-8859-15 (parce que autant passer à l'UTF8 dans ce cas). J'imagine qu'il faudrait donc sur l'application convertir toute la plage dédiée AINSI aux équivalents entités HTML. Ca sera en plus de la désactivation de magic_quotes (qui n'a pas à être sur on sur php5, ça me perturbe.)
iso-8859-15 c'est le pire niveau compat

J'ai un site qui parle de développement Web, et la majorité des articles est malheureusement consacrée au problèmes d'encodage ou de compatibilité IE/Firefox(+les autres). Rien que les images PNG transparents sur IE6 m'ont fait perdre la moitié de mes cheveux (lol). JE suis 100% pro normes et les hacks IE ça m'énerve !!
je développe pu pour IE6 c'est réglé, c'est moins beau mais tenpis

ViPHP
AB
ViPHP | 5818 Messages

23 mars 2010, 19:33

Mais je trouve ça amusant que les formulaires veuillent à tout prix, au risque de donner des codes invalides, nous envoyer les données.
Ce n'est pas au formulaire de faire le tri.

Pour le reste tu es entrain d'expérimenter les limites et problèmes de l'encodage ISO et tu connais déjà LA solution. Alors surtout si le développement Web doit devenir ton métier, tu sais ce qu'il te reste à faire : roules en utf-8 :wink:

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 19:37

Oui tu as raison, mais c'était important pour moi de comprendre qui fait quoi (pourquoi € s'affichait). Je vais travailler pour une boite, et si on me demande de coder en ISO, je ne vais pas leur dire "euh ... je sais pas". Mais je suis d'accord que UTF-8 dans la mesure où tout le monde parle la même langue, c'est le futur. ISO1 c'est un peu comme un belge qui parle à un français, en lui disant "à tantot" ou "pinpin" (mec stupide) ...

Merci pour vos aides.

ViPHP
AB
ViPHP | 5818 Messages

23 mars 2010, 20:13

...Je vais travailler pour une boite, et si on me demande de coder en ISO, je ne vais pas leur dire "euh ... je sais pas"...
Y'a pas de soucis ça ne risque pas d'arriver, excepté si le site est déjà existant auquel cas mélanger les deux encodages est source de prise de tête, pour le reste tous les nouveaux sites pro sont codés en utf-8, d'ailleurs pourquoi s'en priver... Et puis l'encodage iso tu l'a déjà fait donc en cas de besoin...
A + :wink:

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 21:18

Pour le signe 中, l'url est %E4%B8%AD
J'en conclus que dans l'url les % sont chaque octet. Donc ici 中 possède 3 octets de décimales 228, 184 et 173.
En essayant chr(228) . chr(184) . chr(173) j'obtiens bien l'affichage de 中. Presque CQFD.
Mais qu'en est-il de son équivalent au nom inconnu &#20013; ??? A quoi ça correspond ? Comment l'obtenir sans le connaitre ? Car je ne vois aucun rapport (à priori) avec E4B8AD ou 228184173 ni même la conversion de E4B8AD en décimal.

les &#128; correspondent (commentcamarche appelle ça code ISO) au caractère € qui a comme valeur décimale 128. Mais en UTF-8, à quoi correspondent ces chiffres ???

Merci.

devlop78
Invité n'ayant pas de compte PHPfrance

23 mars 2010, 22:06

Ca correspondrait à l'unicode, basé sur l'UTF-16. Reste à savoir comment convertir UTF-8 en UTF-16 et à savoir si UTF-16 a autant de caractères que UTF-8. Reste surtout à y comprendre qqchose (lol). Je crois que je vais m'arrêter là !