Nettoyage champs formulaire

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par poupilou, 13 Octobre 2016.

  1. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Salut à tous,

    J'essaie de créer une fonction php qui détectera si certains mots clés sont présents dans les champs de mes formulaires mais j'ai un peu de mal à trouver la solution, un peu d'aide serait le bienvenue :)

    J'ai la variable "$mot_spam" qui contient les mots à exclure :
    Code:
    $mot_spam = array('levitra','viagra','cialis','casino','free sex','porn','facebook','fan page','twitter followers','select(','from(','sleep(','sysdate(','(select','now(','print(');
    
    On peut trouver dans cette liste des mots classiques comme "viagra" mais aussi des termes comme "select(" qui empêchera les tentatives d'injections de code via mes formulaires.

    Voici la fonction php que j'ai créée :
    Code:
    function get_spam($texte, $mot_spam){
      global $mot_spam;
    foreach($mot_spam as $word)
    {
    $pos = stripos($texte, $word);
    if($pos===false)
    {
        return false;
    }
    else
    {
        return true;
    }
    }
    }
    
    Et voici la phrase à tester :
    Code:
    $texte = "cette phrase contient le mot viagra mais pas le mot nounours";
    
    Si on teste ça marche pas, si je retire le mot "viagra" de la phrase ci-dessus ça indique toujours que le "Le texte n'est pas propre" :?
    Code:
    if(get_spam($texte, $mot_spam)==false)
    {
    echo "Le texte n'est pas propre";
    }
    else
    {
    echo "Le texte est propre";
    }
    
    Qu'est-ce qui déconne dans ma fonction php ?

    Merci pour votre aide.
     
  2. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 903
    J'aime reçus:
    14
    Salut

    J'avais une fonction équivalente et ça donnait ca :

    Code:
     
    $nbmotsinterdits=count($motsInterdits);
            
            for($i=0;$i<$nbmotsinterdits;$i++)
            {
                if(stripos ($text , $motsInterdits[$i])>0)
                    return true;                
            }
    
    return false;
    
    Et je n'ai pas eu de réel soucis.
     
  3. ABCWEB
    ABCWEB WRInaute impliqué
    Inscrit:
    22 Octobre 2015
    Messages:
    770
    J'aime reçus:
    81
  4. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Merci pour vos réponses.

    Ta fonction marche parfaitement bien Noren, merci :wink:
     
  5. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
    ça m'hérisse tjs les cheveux de voir un for au lieu d'un foreach pourtant plus adapté:
    PHP:
    <span class="syntaxdefault">foreach </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$nbmotsinterdits as $mot</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">stripos </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$text</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $mot</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">!==</span><span class="syntaxdefault"> false</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">        return true</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}<br />}<br /></span><span class="syntaxdefault">return false</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"></span>
     
  6. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 903
    J'aime reçus:
    14
    Et tu as bien raison, même si il y a plus grave pour s'hérisser les poils :wink:
    En général j'utilise aussi le foreach, mais je ne sais absolument pas pourquoi je suis passé par un for dans l’exemple que je donne (c’est une vielle fonction) :mrgreen:
     
  7. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
    OK :mrgreen:
     
  8. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Grâce à Spout voici donc ma fonction qui marche parfaitement bien avec "foreach" (si ça peut servir à quelqu'un d'autre :) ) :
    Code:
    function get_spam($texte, $mot_spam){
      global $mot_spam;
    foreach($mot_spam as $mot)
    {
      if(stripos($texte, $mot)!==false)
      {
      return true;
      }
    }
      return false;
    }
    
    Ensuite on l'utilise comme ceci :
    Code:
    $mot_spam = array('levitra','viagra','cialis','casino','free sex','porn','facebook','fan page','twitter followers','select(','from(','sleep(','sysdate(','(select','now(','print(');
    
    $texte = "Ce texte comporte le mot interdit viagra mais pas le mot nounours";
    
    if(get_spam($texte, $mot_spam)===true)
    {
    echo "Le texte n'est pas propre";
    }
    else
    {
    echo "Le texte est propre";
    }
    
    Merci pour votre aide :)
     
  9. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Pendant que j'y suis, pouvez-vous me dire si les robots spammeurs gèrent les sessions php ?

    Sur cette page il est indiqué :
    Est-ce que ce code sera efficace contre les robots/scripts spammeurs ?
    Code:
    // En PHP. Création d’une valeur pour le test…
    // enregistrement en session
    $testVal = md5(uniqid(microtime(), true));
     $_SESSION[$form.’_testVal’] = $testVal;
    
    // Dans le formulaire, la valeur à poster dans un champ
    <input type=“hidden” name=“testVal” value=”<?= $testVal ?>” />
    
    // Test au traitement du formulaire
    if (
     !isset($_SESSION[$form.’_testVal’]))
     || !isset($_POST[‘testVal’]))
     || $_SESSION[$form.’_testVal’] !== $_POST[‘testVal’])
     ){
       // Ici le code à exécuter si vrai…
    } 
    
     
  10. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 903
    J'aime reçus:
    14
    Oui ce que tu fais c'est le principe des tokens et ca peut régler pas mal de soucis en terme de sécurité.

    Apres tu as aussi les captcha mais ça ne plait pas a tout le monde. Même si le recaptcha de GG est pas si mal puisqu'en général il suffit de cocher une case
     
  11. FortTrafic
    FortTrafic WRInaute passionné
    Inscrit:
    11 Décembre 2012
    Messages:
    1 210
    J'aime reçus:
    18
    Salut tu n'as pas besoin de la ligne global $mot_spam; car tu passes la variable en argument de la fonction :
    Code:
    function get_spam($texte, $mot_spam){
    foreach($mot_spam as $mot)
    {
      if(stripos($texte, $mot)!==false)
      {
      return true;
      }
    }
      return false;
    }
    
     
  12. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    ok merci pour vos réponses.
    Dans mon cas, la variable $mot_spam est stocké dans un fichier php différent de celui de ma fonction get_spam, donc j'ai besoin de la ligne global $mot_spam; dans ma fonction php.
     
  13. FortTrafic
    FortTrafic WRInaute passionné
    Inscrit:
    11 Décembre 2012
    Messages:
    1 210
    J'aime reçus:
    18
    Peu importe d'où vient la variable $mot_spam à l'origine puisque tu la passes en argument de la fonction :
    Code:
    if(get_spam($texte, $mot_spam)===true)
    La fonction travaille donc avec une copie de ta variable, pas besoin de global. Essaye d'enlever la ligne tu verras.
     
  14. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Tu as raison, la fonction marche parfaitement bien sans la ligne global $mot_spam; :)
     
  15. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    J'ai mis en place sur mes formulaires un champs caché du type hidden qui se rempli avec les infos contenu dans une session php + un champs id_champs qui n'est pas visible grâce à un display:none et qui doit rester vide, voici mon formulaire :
    Code:
    <form method="post" name="form_contact" id="form_contact" action="index.php?rub=contact&module=envoyer" class="style_form">
    <fieldset class="style_form">
    <table border="0" cellpadding="0" cellspacing="0" align="left">
           <tr>
               <td style="vertical-align: bottom;"><label for="prenom">Prénom <div class="asterix">*</div></label>
    <input type="text" name="prenom" id="prenom" size="40" class="required" required>
    </td>
               <td style="vertical-align: bottom;"><label for="nom">Nom <div class="asterix">*</div></label>
    <input type="text" name="nom" id="nom" size="40" class="required" required>
    </td>
           </tr>
           <tr>
               <td style="vertical-align: bottom;"><label for="email">Email <div class="asterix">*</div></label>
    <input type="text" name="email" id="email" size="40" class="required email" required>
    </td>
               <td style="vertical-align: bottom;"><label for="telephone">Téléphone <div class="asterix">*</div></label>
    <input type="text" name="telephone" id="telephone" size="40" class="required" required>
    </td>
           </tr>
           <tr>
               <td style="vertical-align: bottom;" colspan="2"><label for="message">Question <div class="asterix">*</div></label>
    <textarea name="message" id="message" rows="6" cols="70" class="required" required></textarea>
    </td>
           </tr>
           <tr>
               <td style="vertical-align: bottom;" colspan="2"><input type="submit" name="envoyer" value="Envoyer >>">
    <div id="messageError">Merci de remplir tous les champs requis ( <div class="asterix2">*</div> )</div></td>
           </tr>
    </table>
    </fieldset>
    <p class="id_champs"><input type="text" name="id_url" /></p>
    <input type="hidden" name="id_valeur" value="a8b8e57e8b80d66cae272e36e598d5c2" />
    </form>
    
    Lors du traitement du formulaire, je contrôle en php comme ci-dessous mais le robot spammeur ignore tous ces filtres et contrôle et continue de m'envoyer des emails, que faire de plus pour le stopper ?
    Code:
    if(isset($_SESSION['valeur']) && isset($_POST['id_valeur']) && $_SESSION['valeur']==$_POST['id_valeur'] && isset($_POST['id_url']) && $_POST['id_url']==''
    && isset($_POST['nom']) && !empty($_POST['nom']) && isset($_POST['prenom']) && !empty($_POST['prenom']) 
    && isset($_POST['email']) && !empty($_POST['email'])
    && get_spam($_POST['message'], $mot_spam)==false && !preg_match('/'.$robot_spam.'/',$_POST['message']))
    {
    // On envoie l'email avec les infos du formulaire
    }
    else
    {
    // On n'envoie pas d'email
    }
    
     
  16. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
    PHP:
    <span class="syntaxdefault"></span><span class="syntaxkeyword"><</span><span class="syntaxdefault">input type</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"hidden"</span><span class="syntaxdefault"> name</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"is_human"</span><span class="syntaxdefault"> id</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"is_human"</span><span class="syntaxdefault"> value</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"0"</span><span class="syntaxkeyword">></span><span class="syntaxdefault"></span>
    Code:
    document.getElementById('is_human').value = 1;
    PHP:
    <span class="syntaxdefault">if </span><span class="syntaxkeyword">(empty(</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'is_human'</span><span class="syntaxkeyword">]))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    die</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Motherfuck3r"</span><span class="syntaxkeyword">);<br />}</span><span class="syntaxdefault"></span>
    Si on cible spécifiquement ton site ça n'ira pas mais ça bloque déjà bcp.
     
  17. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Merci Spout mais ton input is_human ne sera jamais vide puisque la valeur par défaut est 0, à quoi il sert le empty($_POST['is_human']), il ne faudrait pas plutôt mettre :
    Code:
    if (isset($_POST['is_human']) && $_POST['is_human']==1) {
    // Envoie de l'email
    }
    else
    {
    // Sinon
        die("Motherfuck3r");
    }
    
     
  18. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
  19. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    T'as encore une fois raison :wink: je savais pas que 0 pouvait être empty :?
     
  20. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Ca marche pas :(

    J'ai mis cet input hidden dans mon formulaire :
    Code:
    <input type="hidden" name="is_human2" id="is_human2" value="0">
    
    J'ai mis dans la partie <head> ce code javascript :
    Code:
    <script type="text/javascript">
    <!--
    document.getElementById('is_human2').value=1;
    //-->
    </script>
    
    Quand j'actualise la page de mon formulaire le champs input is_human2 reste sur la valeur 0, y a-t-il quelque chose de faux dans mon code ?
     
  21. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
    Il faut attendre le DOM ready, je te laisse googler ;)
     
  22. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Ca ça marche :
    Code:
    <script type="text/javascript">
    $(document).ready(function(){
        $('#is_human').val('1');
    });
    </script>
    
    Mais ça ça marcha pas :
    Code:
    <script type="text/javascript">
    $(document).ready(function(){
        $('input[type=hidden].is_human').val('1');
    });
    </script>
    
     
  23. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
    Normal, sélecteur erroné.

    S'il y a un id dessus, c'est plus rapide de sélectionner par id.
     
  24. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Merci Spout.

    Le fait de mettre un input hidden is_human qui change de valeur avec du javascript impose que du coté utilisateur le javascript soit activé :)

    Ma question est : combien d'humain utilise un navigateur web sans que le javascript soit activé ?
     
  25. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
    Très peu, ça dépend de la thématique geek ou pas.
    Mais c'est vrai que si tu veux qd même les autoriser, faudra mettre un fallback captcha.
     
  26. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Mes sites ne sont pas en thématique geek donc je vais faire l'impasse et mettre cette restriction is_human dans mes formulaires.

    Une autre question qui n'a rien avoir avec le thème de ce thread : est-ce que les erreurs de validation w3c peuvent avoir un impact négatif sur le référencement du site ?
     
  27. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 832
    J'aime reçus:
    246
    Les erreurs grave genre:
    PHP:
    <span class="syntaxdefault"></span><span class="syntaxkeyword"><</span><span class="syntaxdefault">body</span><span class="syntaxkeyword">><br /><</span><span class="syntaxdefault">h1</span><span class="syntaxkeyword">>&nbsp;</span><span class="syntaxdefault">tout&nbsp;le&nbsp;reste&nbsp;du&nbsp;site</span>
    Sinon 99% du web serait pénalisé.
     
Chargement...
Similar Threads - Nettoyage champs Forum Date
Après un piratage et un nettoyage, que faire des mauvais backlinks persistants? Problèmes de référencement spécifiques à vos sites 26 Novembre 2019
Nettoyage d'un forum vieux de 15 ans ! Référencement Google 21 Février 2018
site hacké : conseil nettoyage google webmastertool Demandes d'avis et de conseils sur vos sites 6 Janvier 2017
Page nettoyage impossible de faire son referencement sur Google Référencement Google 26 Novembre 2016
Nettoyage htaccess au karcher URL Rewriting et .htaccess 19 Novembre 2015
Site de nettoyage industriel Demandes d'avis et de conseils sur vos sites 9 Mars 2015
Nettoyage de fichier : quels clients conserver ? Administration d'un site Web 21 Septembre 2012
Nettoyage de base et vérification SMTP de la validité d'un email Administration d'un site Web 2 Septembre 2010
Votre avis sur mon annauire de nettoyage cryogénique Demandes d'avis et de conseils sur vos sites 30 Novembre 2009
preg_replace nettoyage extrème Développement d'un site Web ou d'une appli mobile 25 Mars 2009
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice