Page 1 sur 1

preg_match("#0x0A#") ne fonctionne pas

Posté : 24 juil. 2010, 04:45
par Beuk
Bonjour,

je suis occupé à faire une page pour contacter l'admin d'un un petit site perso, et j'aimerais vérifier que le texte entré dans le formulaire par l'utilisateur ne puisse pas contenir de retour à la ligne ou de retour chariot, voici ma condition
if(preg_match("#\x0A#",$email)) die();
mais elle ne fonctionne pas, j'ai essayé avec et sans les \, les #, les \n et à chaque fois le code continue à s'exécuter.
J'ai aussi cherché du coté de la fonction mb_eregi mais la encore le \n et \r semble poser problème. Pourtant quand j'essaie n'importe qu'elle autre lettre ou chaine de caractère la condition en bien remplie et le code s'arrête donc je ne vois vraiment pas d'où vient le souci.

Merci d'avance :)

Re: preg_match("#0x0A#") ne fonctionne pas

Posté : 24 juil. 2010, 08:09
par blof
Bonjour,

le motif \x0A que tu as posté fonctionne pour les retours à la ligne "\n".
(es-tu sûr du contenu de ta variable $mail)

pour les retours à la ligne + les retours chariot tu peux utiliser une "classe de caractères" : [\r\n]

Tu peux aussi te passer des expressions régulières avec par exemple strpos().

Re: preg_match("#0x0A#") ne fonctionne pas

Posté : 24 juil. 2010, 08:26
par Beuk
merci pour la réponse, mais chez moi il ne marche toujours pas, et pour le contenu de la variable $email j'en suis sur oui, pour tester tout ca mon code est au tout début de la page
<?php
$email='te\rst\ntest';
if(preg_match("#\x0D#", $email) || preg_match("#\x0A#",$email)) die();
je viens de test avec "#[\r\n]#" mais le résultat est le même, ma page se charge sans tenir compte de cette condition.
enfin je vais jeter un oeil à strpos()

Re: preg_match("#0x0A#") ne fonctionne pas

Posté : 24 juil. 2010, 10:22
par Berzemus
<?php
$email='te\rst\ntest';
Avec des simples guillemets, la chaîne n'est pas interprétée. Donc dans $email, tu retrouveras littéralement \n et \r, mais pas de retours chariot ni de retours à la ligne.

Utilise plutôt des doubles guillemets (d'ailleurs, la coloration syntaxique du forum le démontre aisément)
$email='te\rst\ntest';
$email="te\rst\ntest";
ceci dit, le tout se serait résolu si tu avais posté tout ton code depuis le début (car c'est le code qui est fautif, pas la fonction). :wink:

Re: preg_match("#0x0A#") ne fonctionne pas

Posté : 24 juil. 2010, 19:08
par Beuk
effectivement ca marche beaucoup mieux du coup, je posterai tout d'un coup la prochaine fois :)

Merci beaucoup

Re: preg_match("#0x0A#") ne fonctionne pas

Posté : 24 juil. 2010, 20:12
par Beuk
Je me suis un peu emballé, le code ci dessus fonctionne très bien, mais si j'essaie de récupérer l'email a partir d'un $_POST la chaine n'est pas interprété non plus ?
if(isset($_POST['email']) AND isset($_POST['sujet']) AND isset($_POST['message'])){
	$email=htmlspecialchars($_POST['email']);
	$sujet=htmlspecialchars($_POST['sujet']);
	$message=htmlspecialchars($_POST['message']);
	if(preg_match("#\x0D#", $email) || preg_match("#\x0A#", $email)) die();
}
J'ai essayé de remplacer mon $_POST['email'] par $_POST["email"], de supprimer htmlspecialchars mais ca ne fonctionne toujours pas :?

Re: preg_match("#0x0A#") ne fonctionne pas

Posté : 25 juil. 2010, 09:48
par Berzemus
Et si tu fais un dump de $_POST["email"], il contient bien un retour à la ligne ?

Il est quand même très rare de voir un input qui n'est pas un textarea contenir un retour à la ligne.

Re: preg_match("#0x0A#") ne fonctionne pas

Posté : 25 juil. 2010, 18:14
par Beuk
Finalement je pense que le problème ne se pose pas, après avoir parcouru la doc php il me semble avoir comprit que les variable POST et GET sont automatiquement filtrées avec addslashes(), donc pour être sur j'ai testé ma condition avec stripcslashes($_POST['email']) et la l'exécution est bien stoppée =)

Et je suis d'accord pour le fait que ca soit rare de trouver un retour a la ligne dans ces champs, mais en cherchant à sécuriser un peu cette page pour éviter que n'importe qui puisse spammer l'admin du site, je suis tombé sur un article (qui date un peu :? ) qui parlait des injections justement grâce à ces \n et \r, et la solution était de tester les variable POST, mais je suppose que ca a évolué depuis :)

Merci beaucoup pour l'aide.