Sécurité formulaire HTML/PHP

Résolu

Bonjour,

J'utilise Webacappella, un logiciel de création site web - Il permet tout de même de faire du HTML et du PHP.

J'ai réussit à insérer un formulaire HTML/PHP qui me permet de récupérer les contacts du formulaire dans une base de données OVH.

je reçois un mail qui contient les informations rentrées par l'utilisateur.

Tout va bien donc !! Pas tout à fait !!

Je pense que j'ai des faiblesses côté sécurité, j'ai mis en place des "pattern" des "strip_tags()" .... mais je n'arrive pas à supprimer de la textarea la possibilité d'insertion de liens . 

De plus je souhaite récupérer "true" dans mon mail de récéption pour être certaine que la case "capcha" a bien fonctionnée.

Bon un bon code vaut mieux que de grands discours: 

Mon fichier formulaire:

<form name="inscription" method="post" action="contact-test.php">
      <div class="row mb-3">
            <input type="text" name="nom" placeholder="Nom" required />
      </div>

      <div class="row mb-3">
            <input type="text" name="prenom" placeholder="Prénom" required />
      </div>

      <div class="row mb-3">
            <input name="tel" type="tel" placeholder="Téléphone - 00 00 00 00 00" required pattern="[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}" />
            <span class="validity"></span>
      </div>

      <div class="row mb-3">
            <input type="email" name="mail" pattern="[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}$" placeholder="Email" required />
      </div>

      <div class="row mb-3">Type de travaux :
            <select id="travaux" class="form-group" name="travaux" required>
                  <option selected>Votre besoin</option>
                  <option>Traitement Termites</option>
                  <option>Traitement Bois Charpente</option>
                  <option>Traitement Mérule</option>
                  <option>Traitement Remontées Capillaires</option>
                  <option>Traitement Air chaud</option>
                  <option>Nettoyage Façade</option>
                  <option>Sablage</option>
                  <option>Traitement Fourmis</option>
            </select>
      </div>
      <div class="row mb-3">
            <select id="departement" class="form-group" name="departement" required>
                  <option selected>Département des travaux :</option>
                  <option>44 - Loire-Atlantique</option>
                  <option>56 - Morbihan</option>
            </select>
      </div>
      <div class="row mb-3">
            <input type="text" name="codepostal" pattern="(?:0[1-9]|[1-8]\d|9[0-8])\d{3}" placeholder="Code Postal d'intervention" required />
      </div>

      <div class="row mb-3">
            <textarea name="message" rows="10" cols="70" pattern="'#^[a-zA-Z0-9áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ\.\_\-\s]{5,500}$#'
            " placeholder="Votre Message" required></textarea>
      </div>

      <div class="form-check">
            <input class="form-check-input" type="checkbox" value="" id="invalidCheck2" name="coche" cochée="oui"value="good" required>
            <label class="form-check-label" for="invalidCheck2">
                  Je ne suis pas un Robot !
            </label>
      </div>

      <input type="submit" name="valider" value="Envoyer" />
</form>

<?php

error_reporting(-1);
require 'fonctionsovh.php';
$db = getConnection();

if (isset($_POST['valider'])) {
      echo ('toto');
      //On prépare la commande sql d'insertion
      $query = $db->prepare('
                  INSERT INTO mabase (Nom,Prénom,Téléphone,Email,Travaux,CodePostal,Message,Departement,Provenance,dateinscription) VALUES (?,?,?,?,?,?,?,?,"xxxxx",Now())
                  ');
      $nom = strip_tags($_POST['nom']);
      $prenom = strip_tags($_POST['prenom']);
      $email = strip_tags($_POST['mail']);
      $message = strip_tags($_POST['message']);
      $query->execute([
            $nom,
            $prenom,
            $_POST['tel'],
            $email,
            $_POST['travaux'],
            $_POST['codepostal'],
            $message,
            $_POST['departement']
      ]);

      //Verifie si le fournisseur prend en charge les r
      if (preg_match("#@(hotmail|live|msn).[a-z]{2,4}$#", $email_from)) {
            $passage_ligne = "\n";
      } else {
            $passage_ligne = "\r\n";
      }
      // Pour les champs $expediteur / $copie / $destinataire,
      // séparez par une virgule s'il y a plusieurs adresses
      $destinataire = '***@***';
      $expediteur = '***@***';
      $copie = '';
      $copie_cachee = '***@***';
      $objet = $_POST["travaux"] . " xxxxxx " . " " . $_POST["departement"]; // Objet du message

      function clean_string($string)
      {
            $bad = array("content-type", "bcc:", "to:", "cc:", "href");
            return str_replace($bad, "", $string);
      }


      $headers  = 'MIME-Version: 1.0' . "\n"; // Version MIME
      $headers .= 'Reply-To: ' . $expediteur . "\n"; // Mail de reponse
      $headers .= 'From:<' . $expediteur . '>' . "\n"; // Expediteur
      $headers .= 'Delivered-to: ' . $destinataire . "\n"; // Destinataire
      $headers .= 'Cc: ' . $copie . "\n"; // Copie Cc
      $headers .= 'Bcc: ' . $copie_cachee . "\n\n"; // Copie cachée Bcc

      $message = "Nom : " . $nom . "\n" . "\n" .
            "Prénom : " . $prenom . "\n" . "\n" .
            "Téléphone : " . $_POST["tel"] . "\n" . "\n" .
            "Mail : " . $email . "\n" . "\n" .
            "Travaux : " . $_POST["travaux"] . "\n" . "\n" .
            "Département des Travaux : " . $_POST["departement"] . "\n" . "\n" .
            "Code Postal : " . $_POST["codepostal"] . "\n" . "\n" . "\n" .
            "Message: " . $message . "\n" . "\n" .
            "Case robot :".$_POST["coche"];

      $success = false;
      $error_string = "";
      if (mail($destinataire, $objet, $message, $headers)) // Envoi du message
      {
            $success = true;
      } else //
      {
            $success = false;
            $error_string = "Non envoyé !";
      }

      echo json_encode(['success' => $success, 'message' => $error_string]);
      // on ferme la connexion
      header('Location: contact-test.php');
      exit();
}

?>

pas certaine que mon fichier de connexion soit nécessaire. Si jamais merci de me le dire.

Recap : comment sécuriser mon textarea ?? comment récupérer ma case cochée oui/non

Merci d'avance

17 réponses

Résumé de la discussion

La sécurisation d’un formulaire HTML/PHP intégré via Webacappella, alimentant une base OVH et envoyant un mail, fait l’objet d’échanges centrés sur le captcha et la sécurité du textarea. Le problème principal est l’impossibilité d’empêcher l’insertion de liens dans la textarea malgré des patterns et strip_tags, et le souhait de récupérer une valeur indicative dans le mail. Plusieurs réponses proposent des vérifications simples (var_dump du contenu, distinction URL-lien) et des corrections de la gestion des cases à cocher pour lire oui/non. La discussion évoque aussi l’envoi des messages, les en-têtes et la redirection, tout en restant centrée sur securiser le texte et assurer une lecture fiable du CAPTCHA.

Bobot (l’IA à votre service)
  1. Modérateur

    Bonjour,

    Je pense que tu confonds "lien" et "url"

    <!-- Un lien -->
    <a href="http://www.google.fr">Google</a>
    
    <-- Une url ( c'est une string.. ) -->
    http://www.google.fr

    Si tu veux pouvoir supprimer les "url" ,  tu vas devoir retravailler la string 'message'  pour y supprimer   le http ou https, les www le .truc

    Pour ça, tu peux utiliser une regex. ( nombreux tutos disponibles sur le net)


    0
    1. Bonjour  ,

      C'est effectivement les URL que je souhaite supprimer ou rendre inactives

      je regarde depuis tôt ce matin mais je ne trouve pas soit la bonne manière de l'écrire soit pas la bonne regex. 

      Déjà il semble que mon "pattern dans textarea ne soit pas pris en compte : il semble que cette balise n'accepte pas cet attribut.

      j'ai remplacé par ce ceci mais ça ne fonctionne pas. Que ce que j'écris mal ??

            $nom = strip_tags($_POST['nom']);
      
            $prenom = strip_tags($_POST['prenom']);
      
            $email = strip_tags($_POST['mail']);
      
            $message = preg_replace('!\[url=(.+?)\](.+?)\[\/url\]!isU', '<a href="$1">$2</a>',  strip_tags($_POST['message']));

      Merci

      0
      1. Modérateur

        Commence par faire un var_dump de ta variable 

        strip_tags($_POST['message'])

        histoire de voir comment se présente le "text" que tu veux "supprimer".

        Et encore une fois... vu qu'on parle d'URL ( et non de "lien") .. il n'y a pas de <a href...   !

        0
        1. , je ne sais pas faire tant pis - je trouverai une autre solution.

          merci encore

          J

          0
          1. Modérateur

            Tu ne sais pas faire .... quoi ?

            un var_dump ?  Si tu ne connais pas, il existe les moteurs de recherche pour t'aider à trouver ...  https://www.google.com/search?q=var_dump

            Rien de compliqué .. juste une fonction à appeller pour pouvoir afficher, lors de l'exécution de ton code, le contenu d'une variable

            var_dump(strip_tags($_POST['message']));
            exit; //si tu veux que ton script s'arrête là sans faire la suite le temps de corriger ton souci

            Et niveau regex,  pour supprimer les URL de ta variable, tu devrais pouvoir passer par un truc du genre

            $string = strip_tags($_POST['message']);
            $regex = "@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?).*$)@";
            $message = preg_replace($regex, ' ', $string);
            0
            1. je ne sais pas écrire le regex ! le var_dump c'était bon.

              je vous remercie de cette solution. ça fonctionne sur mon mode test. Merci.

              Sauriez vous comment je peux récupérer ma case "je ne suis pas un robot" dans mon mail?

              Merci bonne journée

              0
              1. Modérateur

                en regardant la variable $_POST['coche']  non ?

                0
            2. c'est ce que je pense avoir essayé de faire : 

                    $message = "Nom : " . $nom . "\n" . "\n" .
                          "Prénom : " . $prenom . "\n" . "\n" .
                          "Téléphone : " . $_POST["tel"] . "\n" . "\n" .
                          "Mail : " . $email . "\n" . "\n" .
                          "Travaux : " . $_POST["travaux"] . "\n" . "\n" .
                          "Département des Travaux : " . $_POST["departement"] . "\n" . "\n" .
                          "Code Postal : " . $_POST["codepostal"] . "\n" . "\n" . "\n" .
                          "Message: " . $message . "\n" . "\n" .
                          "Case robot :".$_POST["coche"];

              mais cela ne donne rien.

                    <div class="form-check">
                          <input class="form-check-input" type="checkbox" value="" id="invalidCheck2" name="coche" cochée="oui"value="good" required>
                          <label class="form-check-label" for="invalidCheck2">
                                Je ne suis pas un Robot !
                          </label>
                    </div>
              0
              1. Modérateur

                L'attribut value de ton input est vide... Normal que tu n'aies pas de.valeur...

                1
              2. @jordane45

                Bonjour , effectivement je l'avais mis puis retiré !! Bien entendu je ne pouvais pas récupérer quoi que ce soit !! Merci encore pour votre aide -Je suis presque au bout de mes peines ! Il ne me manque plus que le

                header('Location: http://www.google.com');

                exit();

                qui ne fonctionne pas encore mais je planche sur le sujet - si vous avez un conseil  !

                Bonne journée merci

                0
              3. Modérateur
                @PJ47

                Bien entendu... tu places ton code PHP ......   AVANT tout code html ?!

                Si ton code est écrit tel que tu nous l'a montré dans ton premier message...ça ne pourra pas marcher.

                Il faut déplacer le code php au dessus du code html

                <?php
                 // Ton code php...
                //connexion à la bdd
                // ... traitement de ton formulaire 
                // ....etc...
                
                
                ?>
                <!-- Puis.. le code HTML  -->
                <!Doctype html>
                <html>
                  <head>
                
                
                0
            3. Oui il est bien au dessu mais cela me marque mon message "message envoyé mais pas de redirection :

              <?php
              
              error_reporting(-1);
              require 'fonctionsovh.php';
              $db = getConnection();
              
              if (isset($_POST['valider'])) {
                    //echo ('toto');
                    //On prépare la commande sql d'insertion
                    $query = $db->prepare('
                                INSERT INTO mabase (Nom,Prénom,Téléphone,Email,Travaux,CodePostal,Message,Departement,Provenance,dateinscription) VALUES (?,?,?,?,?,?,?,?,"xxxxxx",Now())
                                ');
                    $nom = strip_tags($_POST['nom']);
                    $prenom = strip_tags($_POST['prenom']);
                    $email = strip_tags($_POST['mail']);
                    //$message = strip_tags($_POST['message']);
                    //$message = str_replace("/", "", $message);
                    $string = strip_tags($_POST['message']);
                    $regex = "@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?).*$)@";
                    $message = str_replace("'", "'", $message);
                    $message = str_replace("&#8217;", "'", $message);
                    $message = str_replace('<br />', '', $message);
                    $message = str_replace("<", "<", $message);
                    $message = str_replace(">", ">", $message);
                    $message = str_replace("&", "&", $message);
                    $message = preg_replace($regex, ' ', $string);
              
                    //var_dump($message);
              
                    $query->execute([
                          $nom,
                          $prenom,
                          $_POST['tel'],
                          $email,
                          $_POST['travaux'],
                          $_POST['codepostal'],
                          $message,
                          $_POST['departement']
                    ]);
              
                    //Verifie si le fournisseur prend en charge les r
                    if (preg_match("#@(hotmail|live|msn).[a-z]{2,4}$#", $email_from)) {
                          $passage_ligne = "\n";
                    } else {
                          $passage_ligne = "\r\n";
                    }
                    // Pour les champs $expediteur / $copie / $destinataire,
                    // séparez par une virgule s'il y a plusieurs adresses
                    $message_envoye = "Votre message nous est bien parvenu ! <a href=\"/\">Retour &agrave; la page principale</a>";
                    $message_non_envoye = "<br /> <br />L'envoi du mail a échoué, veuillez réessayer SVP.";
                    $destinataire = '***@***';
                    $expediteur = '***@***';
                    $copie = '';
                    $copie_cachee = 'xx@xx';
                    $objet = $_POST["travaux"] . " xx " . " " . $_POST["departement"]; // Objet du message
              
                    function clean_string($string)
                    {
                          $bad = array("content-type", "bcc:", "to:", "cc:", "href");
                          return str_replace($bad, "", $string);
                    }
              
              
                    $headers  = 'MIME-Version: 1.0' . "\n"; // Version MIME
                    $headers .= 'Reply-To: ' . $expediteur . "\n"; // Mail de reponse
                    $headers .= 'From:<' . $expediteur . '>' . "\n"; // Expediteur
                    $headers .= 'Delivered-to: ' . $destinataire . "\n"; // Destinataire
                    $headers .= 'Cc: ' . $copie . "\n"; // Copie Cc
                    $headers .= 'Bcc: ' . $copie_cachee . "\n\n"; // Copie cachée Bcc
              
                    $message = "Nom : " . $nom . "\n" . "\n" .
                          "Prénom : " . $prenom . "\n" . "\n" .
                          "Téléphone : " . $_POST["tel"] . "\n" . "\n" .
                          "Mail : " . $email . "\n" . "\n" .
                          "Travaux : " . $_POST["travaux"] . "\n" . "\n" .
                          "Département des Travaux : " . $_POST["departement"] . "\n" . "\n" .
                          "Code Postal : " . $_POST["codepostal"] . "\n" . "\n" . "\n" .
                          "Message: " . $message . "\n" . "\n" .
                          "Case robot :" . $_POST["coche"];
              
                    $success = false;
                    $error_string = "";
                    if (mail($destinataire, $objet, $message, $headers)) // Envoi du message
                    {
                          echo ('message envoyé');
                         header('Location: http://www.google.com');
                         exit();
              
                    } else //
                    {
                          $success = false;
                          $error_string = "Non envoyé !";
                    }
              
              
              }
              
              
              ?>
              
              
              <form name="inscription" method="post" action="contact-test.php">
                    <div class="row mb-3">
                          <input type="text" name="nom" placeholder="Nom" required />
                    </div>
              
                    <div class="row mb-3">
                          <input type="text" name="prenom" placeholder="Prénom" required />
                    </div>
              
                    <div class="row mb-3">
                          <input name="tel" type="tel" placeholder="Téléphone - 0000000000" required pattern="[0-9]{10}" />
                          <span class="validity"></span>
                    </div>
              
                    <div class="row mb-3">
                          <input type="email" name="mail" pattern="[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}$" placeholder="Email" required />
                    </div>
              
                    <div class="row mb-3">Type de travaux :
                          <select id="travaux" class="form-group" name="travaux" required>
                                <option selected>Votre besoin</option>
                                <option>Traitement Termites</option>
                                <option>Traitement Bois Charpente</option>
                                <option>Traitement Mérule</option>
                                <option>Traitement Remontées Capillaires</option>
                                <option>Traitement Air chaud</option>
                                <option>Nettoyage Façade</option>
                                <option>Sablage</option>
                                <option>Traitement Fourmis</option>
                          </select>
                    </div>
                    <div class="row mb-3">
                          <select id="departement" class="form-group" name="departement" required>
                                <option selected>Département des travaux :</option>
                                <option>44 - Loire-Atlantique</option>
                                <option>56 - Morbihan</option>
                          </select>
                    </div>
                    <div class="row mb-3">
                          <input type="text" name="codepostal" pattern="(?:0[1-9]|[1-8]\d|9[0-8])\d{3}" placeholder="Code Postal d'intervention" required />
                    </div>
              
                    <div class="row mb-3">
                          <textarea name="message" rows="10" cols="70" placeholder="Votre Message" pattern="'#^[a-zA-Z0-9áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ\.\_\-\s]{5,500}$#'
                          " required></textarea>
                    </div>
              
                    <div class="form-check">
                          <input class="form-check-input" type="checkbox" value="YES" id="invalidCheck2" name="coche" cochée="oui" value="good" required>
                          <label class="form-check-label" for="invalidCheck2">
                                Je ne suis pas un Robot !
                          </label>
                    </div>
              
                    <input type="submit" name="valider" value="Envoyer" />
              </form>
              
              

              je ne dois surement pas le place où il faut. ! 

              0
              1. Modérateur

                Les fonctions "header(  " Ne peuvent pas se situer APRES que ta page ait affiché quoi que ce soit..
                C'est ton echo qui bloque la redirection...

                0
            4. J'ai supprimé le echo : 

                if (mail($destinataire, $objet, $message, $headers)) // Envoi du message
                    {
              
                     header('Location: fin.php');
                     exit();
              
                    } else //
                    {
                          $success = false;
                          $error_string = "Non envoyé !";
                    }
              

              mais lorsque je valide je reste sur la même page mais avec ma zone formulaire vide : 

              https://www.best-termites.fr/www/contact-test.php

              0
            5. j'ai activé l'affichage des erreurs et corrigé certaines.

              la dernière est 

              Warning: Cannot modify header information - headers already sent by (output started at /home/besttermds/www/www/contact-test.php:1) in /home/besttermds/www/www/contact-test.php on line 500
              0
              1. Modérateur

                ligne 500 ?

                Tu as donc du code html AVANT ton php non ???

                N'aurais tu pas mis ton fichier dans un include que tu chargerais en bas de ta page principale ???

                Si oui.. tu as donc du html avant .. ce qui n'est pas bon !

                Apres... tu peux toujours passer par du JS  au lieu de passer par l'instruction header si vraiment tu ne veux pas changer l'organisation de ton code ...

                0
              2. , 

                c'est bon j'ai corrigé !! Je pense que cela devait venir des espaces après ?>

                Mais comme je suis dans le logiciel j'ai modifié l'emplacement du code PHP et du coup c'est bon, je reçoit le mail, je l'enregistre dans ma BDD et je redirige !! 

                Merci encore beaucoup de votre aide précieuse !

                bonne journée

                J

                0
              3. @PJ47

                je ne sais pas comment  (et si c'est à moi de marquer le sujet en résolu ?)............... trouvé !! merci encore

                0
              4. @jordane45

                bonjour ,

                je suis passée en prod et le message reçu à bien supprimé les scripts, mais à conservé les liens que j'avais mis?

                il me semble pourtant avoir conservé le regex que vous m'aviez donné : 

                <?php
                error_reporting(E_ALL);
                ini_set('display_errors', TRUE);
                ini_set('display_startup_errors', TRUE);
                
                error_reporting(-1);
                require 'fonctionsovh.php';
                $db = getConnection();
                
                if (isset($_POST['valider'])) {
                
                      //On prépare la commande sql d'insertion
                      $query = $db->prepare('
                                  INSERT INTO ContactsBest (Nom,Prénom,Téléphone,Email,Travaux,CodePostal,Message,Departement,Provenance,dateinscription) VALUES (?,?,?,?,?,?,?,?,"Best-termites.fr",Now())
                                  ');
                      $nom = strip_tags($_POST['nom']);
                      $prenom = strip_tags($_POST['prenom']);
                      $email = strip_tags($_POST['mail']);
                      $string = strip_tags($_POST['message']);
                      $regex = "@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?).*$)@";
                      $message = preg_replace($regex, ' ', $string);
                
                
                      $query->execute([
                            $nom,
                            $prenom,
                            $_POST['tel'],
                            $email,
                            $_POST['travaux'],
                            $_POST['codepostal'],
                            $message,
                            $_POST['departement']
                      ]);
                
                      //Verifie si le fournisseur prend en charge les r
                      if (preg_match("#@(hotmail|live|msn).[a-z]{2,4}$#", $email)) {
                            $passage_ligne = "\n";
                      } else {
                            $passage_ligne = "\r\n";
                      }
                
                      // Pour les champs $expediteur / $copie / $destinataire,
                      // séparez par une virgule s'il y a plusieurs adresses
                
                      $destinataire = '***@***';
                      $expediteur = '***@***';
                      $copie = '';
                      $copie_cachee = '***@***';
                      $objet = $_POST["travaux"] . " BEST-TERMITES.fr " . " " . $_POST["departement"]; // Objet du message
                
                      function clean_string($string)
                      {
                            $bad = array("content-type", "bcc:", "to:", "cc:", "href");
                            return str_replace($bad, "", $string);
                      }
                
                
                      $headers  = 'MIME-Version: 1.0' . "\n"; // Version MIME
                      $headers .= 'Reply-To: ' . $expediteur . "\n"; // Mail de reponse
                      $headers .= 'From:<' . $expediteur . '>' . "\n"; // Expediteur
                      $headers .= 'Delivered-to: ' . $destinataire . "\n"; // Destinataire
                      $headers .= 'Cc: ' . $copie . "\n"; // Copie Cc
                      $headers .= 'Bcc: ' . $copie_cachee . "\n\n"; // Copie cachée Bcc
                
                      $message = "Nom : " . $nom . "\n" . "\n" .
                            "Prénom : " . $prenom . "\n" . "\n" .
                            "Téléphone : " . $_POST["tel"] . "\n" . "\n" .
                            "Mail : " . $email . "\n" . "\n" .
                            "Travaux : " . $_POST["travaux"] . "\n" . "\n" .
                            "Département des Travaux : " . $_POST["departement"] . "\n" . "\n" .
                            "Code Postal : " . $_POST["codepostal"] . "\n" . "\n" . "\n" .
                            "Message: " . $message . "\n" . "\n" .
                            "Case robot :" . $_POST["coche"];
                
                
                      $success = false;
                      $error_string = "";
                      if (mail($destinataire, $objet, $message, $headers)) // Envoi du message
                      {
                            header('Location: https://www.best-termites.fr/index.html');
                            exit();
                      } else //
                      {
                            $success = false;
                            $error_string = "Non envoyé !";
                      }
                }
                ?>

                Sauriez vous me dire ? 

                merci beaucoup

                J

                0
              5. @PJ47

                bonjour

                sauriez vous m'aider pour les url conservées?

                cordialement

                J

                0
            6. bonjour @ tous.

              je suis en prod, mon code de traitement php est en début, mon formulaire html en suivant-

              Mon formulaire s'envoie, la page se redirige, les champs s'enregistrent bien dans la bdd, mais dans le message reçu et enregistrer dans la bdd il reste les url et je souhaite les supprimer - 

              Est ce que vous auriez des idées?

              Merci

              J

              0
              1. Modérateur

                A part faire du debug pour essayer de voir ce que contiennent tes différentes variables lors de l'enregistrement.. il n'y a pas grand chose d'autre qu'on puisse faire...

                Donc, retire le REDIRECTION (sinon tu ne pourras pas voir les éventuels debug que tu vas mettre),  places des var_dump de tes différentes variables avant ta requête INSERT  ... et regarde ce qu'elles contiennent...

                0
            7. Bonjour

              suite à ce code : 

              <?php
              error_reporting(E_ALL);
              ini_set('display_errors', TRUE);
              ini_set('display_startup_errors', TRUE);
              
              error_reporting(-1);
              require 'fonctionsovh.php';
              $db = getConnection();
              
              if (isset($_POST['valider'])) {
              
                    //On prépare la commande sql d'insertion
                    $query = $db->prepare('
                                INSERT INTO ContactsBest (Nom,Prénom,Téléphone,Email,Travaux,CodePostal,Message,Departement,Provenance,dateinscription) VALUES (?,?,?,?,?,?,?,?,"Best-termites.fr",Now())
                                ');
                    $nom = strip_tags($_POST['nom']);
                    $prenom = strip_tags($_POST['prenom']);
                    $email = strip_tags($_POST['mail']);
                    $string = strip_tags($_POST['message']);
                    $regex = "@(^(https?|ftp)://(-\.)?([^\s/?\.#-]+\.?)+(/[^\s]*)?$)@";
                    $message = preg_replace($regex, ' ', $string);
              
              var_dump($nom, $prenom, $email, $message);
              
                    $query->execute([
                          $nom,
                          $prenom,
                          $_POST['tel'],
                          $email,
                          $_POST['travaux'],
                          $_POST['codepostal'],
                          $message,
                          $_POST['departement']
                    ]);
              
                    //Verifie si le fournisseur prend en charge les r
                    if (preg_match("#@(hotmail|live|msn).[a-z]{2,4}$#", $email)) {
                          $passage_ligne = "\n";
                    } else {
                          $passage_ligne = "\r\n";
                    }
              
                    // Pour les champs $expediteur / $copie / $destinataire,
                    // séparez par une virgule s'il y a plusieurs adresses
              
                    $destinataire = '***@gmail.com';
                    $expediteur = '**@best-termites.fr';
                    $copie = '';
                    $copie_cachee = '**@**';
                    $objet = $_POST["travaux"] . " BEST-TERMITES.fr " . " " . $_POST["departement"]; // Objet du message
              
                    function clean_string($string)
                    {
                          $bad = array("content-type", "bcc:", "to:", "cc:", "href");
                          return str_replace($bad, "", $string);
                    }
              
              
                    $headers  = 'MIME-Version: 1.0' . "\n"; // Version MIME
                    $headers .= 'Reply-To: ' . $expediteur . "\n"; // Mail de reponse
                    $headers .= 'From:<' . $expediteur . '>' . "\n"; // Expediteur
                    $headers .= 'Delivered-to: ' . $destinataire . "\n"; // Destinataire
                    $headers .= 'Cc: ' . $copie . "\n"; // Copie Cc
                    $headers .= 'Bcc: ' . $copie_cachee . "\n\n"; // Copie cachée Bcc
              
                    $message = "Nom : " . $nom . "\n" . "\n" .
                          "Prénom : " . $prenom . "\n" . "\n" .
                          "Téléphone : " . $_POST["tel"] . "\n" . "\n" .
                          "Mail : " . $email . "\n" . "\n" .
                          "Travaux : " . $_POST["travaux"] . "\n" . "\n" .
                          "Département des Travaux : " . $_POST["departement"] . "\n" . "\n" .
                          "Code Postal : " . $_POST["codepostal"] . "\n" . "\n" . "\n" .
                          "Message: " . $message . "\n" . "\n" .
                          "Case robot :" . $_POST["coche"];
              
              
                    $success = false;
                    $error_string = "";
                    if (mail($destinataire, $objet, $message, $headers)) // Envoi du message
                    {
                          //header('Location: https://www.best-termites.fr/index.html');
                        //  exit();
                    } else //
                    {
                          $success = false;
                          $error_string = "Non envoyé !";
                    }
              }
              ?>

              j'obtiens : 

              string(9) "jennif@jh" string(4) "test" string(23) "***@***" string(93) "fhidshfsdfu bonjour, https://www.php.net/manual/fr/function.var-dump.php hfubjhfd fhduis"

              donc au final, cela signifie qu'aucun de mes "strip_tags" ne fonctionnent pas

              0
              1. Modérateur

                As-tu été testé sur les sites que je t'ai donné ta redex ??

                Fonctionne-t-elle sur ces sites ???

                0
            8. bonjour ,

              Alors voilà deux jours que je regarde des tutos pour comprendre comment fonctionnent les deux sites que vous m'avez donné !!! ça y est j'ai compris !! (vive Boris !).

              mes premiers tests ont l'ai convaincants : du coup ça donne ça : 

                    $string = strip_tags($_POST['message']);
                    $regex = preg_replace('/(https?:\/\/|www\.)([a-zA-Z0-9-_\.\/\?=&]+)/im', 'url', $string);
                    $message = $regex;

              donc mon message ne contien plus d'url

              je vais voir si je peux améliorer les $nom et $prenom.

              Merci encore de votre précieuse aide !

              J

              0
              1. Par contre j'essaye de combiner plusieurs regex (1 pour les url, c'est bon ! et une pour les caractères non latins) .

                mais pour le moment ça coince 

                      $string = preg_replace('/([^!A-Za-z0-9]+)im/', '',$_POST['message']);
                      $regex = preg_replace('/(https?:\/\/|www\.)([a-zA-Z0-9-_\.\/\?=&]+)/im', 'url', $string);
                      $message = $regex;
                0
                1. Modérateur

                  Bonjour,

                  Peux tu nous faire des var_dump de tes variables juste après ta variable $message 

                  echo "<pre>";
                  var_dump($_POST['message']);
                  var_dump ($string)
                  var_dump($regex);
                  echo "</pre>";
                  0
              2. Bonjour, 

                voici : 

                string(208) "fdsfsdfsfs
                
                https://forums.commentcamarche.net/forum/affich-37954204-securite-formulaire-html-php#p37959643
                fdskhk 
                
                Ողջույն, ես ուզում էի իմանալ ձեր գինը.
                maisn fdhofhsdlf"
                string(208) "fdsfsdfsfs
                
                https://forums.commentcamarche.net/forum/affich-37954204-securite-formulaire-html-php#p37959643
                fdskhk 
                
                Ողջույն, ես ուզում էի իմանալ ձեր գինը.
                maisn fdhofhsdlf"
                string(126) "fdsfsdfsfs
                
                url#p37959643
                fdskhk 
                
                Ողջույն, ես ուզում էի իմանալ ձեր գինը.
                maisn fdhofhsdlf"

                mon URL a bien été remplacée par 'URL' mais les caractères non latin non pas été supprimés  - indépendamment chacun des expression fonctionne. mais pas ensemble 

                Merci J

                0
                1. Modérateur

                  Tu as une erreur sur ta première regex .. il manque un / devant im

                  $string = preg_replace('/([^!A-Za-z0-9]+)/im', ...

                  Ensuite.. cette regex retourne ceci :  "fdsfsdfsfshttpsforumscommentcamarchenetforumaffich37954204securiteformulairehtmlphpp37959643fdskhkmaisnfdhofhsdlf"

                  Penses tu que, ensuite, ta regex de lien va fonctionner sur cette chaine de caractères ?

                  Moi j'inverserai les deux regex ...

                  La première corrige les liens,

                  Puis la seconde traitera les caractères non latins

                  0
              3. J'ai corrigé mon erreur et inverser les deux : 

                ring(217) "test testjofdsm 12345 
                
                https://forums.commentcamarche.net/forum/affich-37954204-securite-formulaire-html-php
                fydsifyis
                 Ողջույն, ես ուզում էի իմանալ ձեր գինը.
                dfsufyuifd
                
                hufdusy"
                string(135) "test testjofdsm 12345 
                
                URL#
                fydsifyis
                 Ողջույն, ես ուզում էի իմանալ ձեր գինը.
                dfsufyuifd
                
                hufdusy"
                string(78) "testLATINtestjofdsmLATIN12345LATINURLLATINfydsifyisLATINdfsufyuifdLATINhufdusy"

                donc effectivement je n'ai plus d'URL ni de caractères non latin mais pourquoi tout mon texte s'est il collé ? m est censé faire le multiligne?

                0
                1. Modérateur

                  le "m" permet de prendre en compte le multiligne...  pas de le "créer".

                  Par contre.. attention...

                  Lorsque tu as des retours à la lignes dans tes textarea, ils sont traduits par les caractères  \r\n  ou \n

                  En "html", pour les voir, il faut mettre des <br>

                  En php, tu as une fonction qui permet de convertir les caractères de retour à la ligne en <br>  :  nl2br()

                  je t'invite à en regarder la doc.

                  PS: ta question initiale : Traitement des liens dans ton formulaire est traitée et résolue.

                  Je t'invite donc à mettre cette discussion en RESOLUE  puis, si besoin, d'en ouvrir une nouvelle pour tes "nouveaux" soucis.

                  0
              4. Merci ,

                effectivement je connais la fonction nl2br()- je vais regarder.

                Merci de votre aide.

                effectivement la première question résolue.!! 

                J

                0