IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécuriser un formulaire


Sujet :

Langage PHP

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Par défaut Sécuriser un formulaire
    Bonjour,

    je dois sécuriser un formulaire contre les attaques.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    function securise($texte){
    	return htmlentities($texte, ENT_QUOTES);
    }
     
    if(isset($_POST["nom"]) and isset($_POST["prenom"]) and isset($_POST["email"])  and isset($_POST["sujet"]) and isset($_POST["message"])and !empty($_POST["nom"])  and !empty($_POST["email"]) and !empty($_POST["message"])){
     
        if(!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){
    		header('Location: contact.php?message=email&nom='.$_POST['nom'].'&prenom='.$_POST['prenom'].'&email='.$_POST['email'].'&telephone='.$_POST['telephone'].'&sujet='.$_POST['sujet'].'&demande='.$_POST['message']);
    		exit();
    	}
     
    	$nom = securise($_POST['nom']);
    	$prenom = securise($_POST['prenom']);
    	$email = securise($_POST['email']);
    	$sujet = securise($_POST['sujet']);
            $message = securise(utf8_encode($_POST['demande']));
     
    	$headers = 'From:'.$prenom." ".$nom.' <'.$email.'>' . "\r\n" .
    					'Reply-To:'.$email. "\r\n" ;
     
     
        mail('exemple@yahoo.fr', $sujet, $message, $headers);
        header('Location: contact.php?message=ok');
     
    ....
    Le problème est que lorsque je teste l'envoi du mail il n'y a dans le mail d'arrivée ni le nom et prénom de l'expéditeur ni le sujet du message alors que ces informations y sont si je supprime la fonction securise.

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Par défaut
    Bonjour,

    Effectivement cela est bizarre je trouve,
    Pouvez vous faire un var_dump de la variable $headers avec et sans la fonction securise ?

    La fonction htmlentities() renvoie une chaine de caractere qui formate mal la variable $headers, ce qui explique la non présence des sujet/nom/prenom.

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Par défaut
    Je ne comprends pas le var_dump sur $headers avec securise ne donne pas de problème le nom et prénom etc sont bien affichés, c'est donc au niveau de la fonction mail que cela ne passe pas je ne sais pas pourquoi.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Par défaut
    Rebonjour,

    Faire un var_dump sur la variable $headers signifie juste d'utiliser la fonction var_dump qui permet de voir le contenu d'une variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //A mettre juste aprèss l'initialisation de la variable
    var_dump($headers);
    d'un autre côté, si avec la fonction securise, la fonction mail ne fonctionne pas, et si sans il n'y a pas de soucis, c'est que les données qui sont formaté par la fonction securise posent probleme, ce n'est pas la fonction mail() qui est en tort.

    C'est pour cela essaye de voir le contenu des variables avec
    et
    avec et sans la fonction securise afin de voir les différences.

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Par défaut
    le var_dump sur $headers et $sujet affiche la même chose au niveau du contenu des variables que ce soit avec ou sans securise alors que c est le type de la variable qui change avec securise ou sans securise:
    c'est string(12) pour $sujet avec securise string(5) pour $sujet sans securise string(86) pour $headers avec securise et string(72) pour $headers sans securise

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Par défaut
    Alors c'est qu'il y a effectivement un changement :
    Sans securise :
    $headers = string(72)
    $sujet = string(86)

    Avec Securise :
    $headers = string(12)
    $sujet = string(5)

    Pour information String(xx), signie une chaine de caractere composé de xx caractères.
    Ta fonction securise() tronque completement tes variables, ca explique que ca ne passe pas dans la fonction mail()
    Pourrais tu faire un copier/coller de tes var_dump() ?

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Par défaut
    En voilà un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string(5) "testé" string(72) "From:testé testé Reply-To:julien@yahoo.fr "
    Pour tous les autres seuls les types changent comme expliqué plus haut

    je ne comprends pas sécuriser un formulaire ça se fait comme ça c'est la méthode habituelle d'utiliser ces fonctions

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function securise($texte){
    	return htmlentities($texte, ENT_QUOTES);
    }
     
    if(isset($_POST["nom"]) and isset($_POST["prenom"]) and isset($_POST["email"])  and isset($_POST["sujet"]) and isset($_POST["message"])and !empty($_POST["nom"])  and !empty($_POST["email"]) and !empty($_POST["message"])){
     
        if(!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){
    		header('Location: contact.php?message=email&nom='.$_POST['nom'].'&prenom='.$_POST['prenom'].'&email='.$_POST['email'].'&telephone='.$_POST['telephone'].'&sujet='.$_POST['sujet'].'&demande='.$_POST['message']);
    		exit();
    	}
     
    	$email = securise($_POST['email']);
            $message = securise(utf8_encode($_POST['demande']));
            $prenom = strip_tags($prenom);
            $nom = strip_tags($nom);
            $sujet = strip_tags($sujet);
    	$headers = 'From:'.$prenom." ".$nom.' <'.$email.'>' . "\r\n" .
    					'Reply-To:'.$email. "\r\n"
     
     
        mail('exemple@yahoo.fr', $sujet, $message, $headers);
        header('Location: contact.php?message=ok');
    Essaye ce bout de code, strip_tags, conserve les accents, mais supprimes toutes les balises html.
    pour tes var_dump il y aurait fallu les deux, car si le type change, c'est que le contenu a changé.

    accessoirement pour avoir le vrai retour de var_dump, fait afficher le code source (CTRL+U) car si ton é est transformé en &eacute; ton navigateur affichera quand même é, le code source lui te montrera la vrai valeur

  9. #9
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Par défaut
    je répète: seul le type des variables changent avec ou sans securise, le reste ne change pas.C'est sans doute étonnant mais c'est comme ça.

    Ensuite CTRL+U je connais pas je suis sous Mac.

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Par défaut
    Sur mac, je crois que cela est pomme+U, ou cmd+U, sinon un clique droit sur la page et dans le menu contextuel l'option devrait apparaître.

    Et comme je l'ai dis, si le type change, c'est que le contenu a changé aussi, même si il n'est pas visible via le navigateur, c'est pourquoi il est préférable de regarder via le code source.

  11. #11
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Par défaut
    oui en effet on voit bien la gestion par htmlentities des caractères accentués dans le source avec &eacute, comment faire maintenant pour que le mail arrive avec le nom et prénom et le contenu sans les &eacute?

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Par défaut
    As tu essayé mon code ?

    Si tu regarde bien, je n'utilise pas la fonction securise() pour le nom/prenom/sujet mais la fonction strip_tags.

  13. #13
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Par défaut
    oui en effet avec strip_tags cela fonctionne mais es tu sur du bien fondé de cette fonction pour éviter les attaques?

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Par défaut
    Le seul risque d'attaque avec un email, a ma connaissance c'est tout simplement les balises html et particulierement <script> bien qu'elle a du etre pris en charge par les messageries depuis le temps.

    faire un strip_tags supprimera toutes les balises HTML, il n'en sortira de fait que du texte, donc risque zéro, on ne fait pas d'attaque avec des lettres accentués

    PS : Si ton problème est résolu pense a mettre ton sujet en [Résolu]

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    Citation Envoyé par ocalik Voir le message
    Le seul risque d'attaque avec un email, a ma connaissance c'est tout simplement les balises html et particulierement <script> bien qu'elle a du etre pris en charge par les messageries depuis le temps.
    Oui mais cela ne concerne (ou ne concernait) que les messages de type html. De sorte qu'on peut autoriser tous les caractères dans le message avec le type text/plain (type par défaut).

    Un autre problème plus sérieux encore (quelque soit le type de mail) est (ou était) les injections dans le header qui permet aux pirates de se servir du formulaire pour envoyer des spams à d'autres adresses. Cf la protection ici. Je ne sais pas si c'est toujours indispensable mais en même temps ça coûte peu de choses de le faire.
    Par contre utiliser htmlentities ou strip_tags sur le message c'est plus invalidant pour le visiteur...

  16. #16
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 584
    Par défaut
    Bonjour,

    sur la doc php pour htmlentities :

    Si l'entrée string contient une séquence de code invalide dans l'encodage encoding fourni, une chaîne vide sera retournée, à moins que le drapeau ENT_IGNORE ou le drapeau ENT_SUBSTITUTE ne soit défini.
    J'ai eu le même soucis avec un problème d'encodage.
    J'ai galéré pas mal.
    Il faut préciser l'encodage ou par defaut utiliser le jocket :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    htmlentities($texte, ENT_QUOTES, '');

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. sécuriser un formulaire par une équation
    Par aboura86 dans le forum Langage
    Réponses: 8
    Dernier message: 03/07/2008, 18h03
  2. Sécuriser mon formulaire
    Par isa150183 dans le forum Langage
    Réponses: 3
    Dernier message: 07/10/2007, 18h34
  3. Sécuriser un formulaire
    Par Z3c33 dans le forum Sécurité
    Réponses: 3
    Dernier message: 25/05/2007, 14h52
  4. Sécuriser un formulaire
    Par jerem78 dans le forum Sécurité
    Réponses: 2
    Dernier message: 07/06/2006, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo