Nettoyage champs formulaire

poupilou

WRInaute impliqué
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.
 

noren

WRInaute accro
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.
 

spout

WRInaute accro
ç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>
 

noren

WRInaute accro
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:
 

poupilou

WRInaute impliqué
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 :)
 

poupilou

WRInaute impliqué
Pendant que j'y suis, pouvez-vous me dire si les robots spammeurs gèrent les sessions php ?

Sur cette page il est indiqué :
Les scripts de soumisson automatique ne gèrent pas les sessions.
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…
}
 

noren

WRInaute accro
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
 

FortTrafic

WRInaute passionné
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;
}
 

poupilou

WRInaute impliqué
ok merci pour vos réponses.
FortTrafic a dit:
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;
}
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.
 

FortTrafic

WRInaute passionné
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.
 

poupilou

WRInaute impliqué
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
}
 

spout

WRInaute accro
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.
 

poupilou

WRInaute impliqué
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");
}
 

poupilou

WRInaute impliqué
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 ?
 

poupilou

WRInaute impliqué
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>
 

poupilou

WRInaute impliqué
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é ?
 

spout

WRInaute accro
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.
 

poupilou

WRInaute impliqué
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 ?
 

spout

WRInaute accro
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é.
 

Discussions similaires

Haut