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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : preg_match("#0x0A#") ne fonctionne pas

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

par Beuk » 25 juil. 2010, 18:14

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.

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

par Berzemus » 25 juil. 2010, 09:48

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

par Beuk » 24 juil. 2010, 20:12

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

par Beuk » 24 juil. 2010, 19:08

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

par Berzemus » 24 juil. 2010, 10:22

<?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

par Beuk » 24 juil. 2010, 08:26

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

par blof » 24 juil. 2010, 08:09

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().

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

par Beuk » 24 juil. 2010, 04:45

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 :)