Protection anti-flood [Résolu]

Signaler
Messages postés
82
Date d'inscription
dimanche 15 avril 2001
Statut
Membre
Dernière intervention
20 novembre 2012
-
Messages postés
82
Date d'inscription
dimanche 15 avril 2001
Statut
Membre
Dernière intervention
20 novembre 2012
-
salut,
J'ai un site web avec un forum perso pas très évolué et il fait l'objet de flood  de robots
j'ai mis une protection anti robot,c'est une question aléatoire a laquelle il faut répondre (genre "combien font 3+4?")
j'ai du mettre ça en route y'a 3 jours et ce matin j'avais de nouveau 3 message de flood (que j'ai enlevé)
Vous n'auriez pas une idée pour protéger un peux mieu mon truc?

Mon site web : http://tidus25.free.fr

Seb.

PS : si à tout hasard, il vous prend un folle envie de cliquer sur la pub google de mon site, faut surtout pas se gêner :)

8 réponses

Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013

J'ai lu ton code en crois, je suis peut être passé à coté de quelque chose. Il me semble que si $numeroVerif=="", alors ta fonction getReponseVerif() renvera "", et donc ton robot passe la validation...

Essaie peut être de modifier ta ligne de verification à la fin comme ça:

if (!testVerif($numeroVerif,$reponseVerif)||$numeroVerif==""||$reponseVerif=="")
erreur("Le contrôle anti-robot a échoué. Veuillez recommencer");

Je pense que là ça devrait fonctionner mieu.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
NON, mais presque !!! Tu n'étais vraiment pas loin et grâce à toi j'ai trouvé, ça m'a fait tilt
En toute honnêteté j'ai galèré il y a peu pour trouver la faille (j'étais intimement persuadé qu'il y en avait une), mais bon, tu sais comment c'est, quand on a trop la tête dedans on ne voit plus rien.

Une chaîne vide, comme tu l'indiques, génère une erreur, ça ne passe donc pas.
Par contre, une injection sql de '""' et un champ vide dans la réponse et le tour est joué !!
cad :
envoi en POST de l'équivalent de :

et rien dans le champ réponse

Alors :
if (!testVerif($numeroVerif,$reponseVerif) || empty($numeroVerif) || empty($reponseVerif)
=>
if (!testVerif($numeroVerif,$reponseVerif) || empty($numeroVerif) || empty($reponseVerif) || !is_numeric($numeroVerif))

Mais il y a encore pas mal de choses à sécuriser :
   - tes questions qui sont trop simples (cf mes précédents posts)
   - tes variables issues du formulaire qui ne sont pas contrôlées :
    il est facile de faire une injection SQL pour que tous tes numeroVerif aient le même numéro, etc ...
   - les die des requêtes sont très facile à générer et ils renseignent beaucoup trop sur la structure de ta base (c'est bon pour le debug uniquement)
   - ...

Je pense que le principe n'est pas mauvais. Une fois corrigé les remarques tu ne devrait plus avoir d'ennui. Si c'est encore le cas il est possible de complexifier encore, avec l'utilisation des cookies, la mise en place d'un nombre d'essais à la minute, un filtrage des robots connus, ...

Tiens nous informé stp,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Salut,

Une idée pour protéger un peu plus ? ... faudrait avoir un peu plus de code (comment est générée la question, comment est traitée la réponse, etc ...)
Je pense plus à une faille dans ton système qu'à une réelle analyse de ton anti flood par le robot

Kohntark-
Messages postés
82
Date d'inscription
dimanche 15 avril 2001
Statut
Membre
Dernière intervention
20 novembre 2012

alors j'ai une table dans ma bdd avec toute les question et les reponse. chaque question a une cle primaire(fixe) et une numero par lesquelles elle sont appelée et qui change aleatoirement a chaque fois que je valide un formulaire (pour eviter qu'on puisse associer un numero a une réponse).
dans mon formulaire, j'affiche la question, un champs pour la réponse et un champs hidden pour le numero de la question. et quand je valide le formulaire je vais chercher la reponse en base et je compare avec la réponse du formulaire.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Je pense que la philosophie est bonne et qu'un robot générique ne doit pas pouvoir passer.
Il est toutefois assez simple de contourner ton système :

Combien font 5+4?
=> une petite regex qui ne retient que les calculs et le tour est joué

Tapez ordinateur, Écrivez bandeira,

Écrivez benfica
=> un parse sur le dernier mot et le tour est joué

Avec mes faibles compétences je te fais un robot qui passe tes protections en moins d'une demie heure.

Mais je reste sur ce que je disais : il y a peut être une faille qui permet au robot de ne même pas remplir ces champs. Mais pour le savoir il faut voir le code.

Cordialement,

Kohntark -
Messages postés
82
Date d'inscription
dimanche 15 avril 2001
Statut
Membre
Dernière intervention
20 novembre 2012

voici donc mon code
premierement, les fonction pour acceder et verifier les codes :
function getQuestionVerif($numero)
{
    $reqGetQuestion = "SELECT descVerif FROM VERIF WHERE numeroVerif=".$numero;
    $resGetQuestion = mysql_query($reqGetQuestion) or die($reqGetQuestion." : ".mysql_error());
    $TableGetQuestion = mysql_fetch_array($resGetQuestion);
    return $TableGetQuestion["descVerif"];
}

function getReponseVerif($numero)
{
    $reqGetReponse = "SELECT reponseVerif FROM VERIF WHERE numeroVerif=".$numero;
    $resGetReponse = mysql_query($reqGetReponse) or die($reqGetReponse." : ".mysql_error());
    $TableGetReponse = mysql_fetch_array($resGetReponse);
    return $TableGetReponse["reponseVerif"];
}

function testVerif($numero,$repUser)
{
    if (strtolower($repUser) == strtolower(getReponseVerif($numero)))
    {
        reinitVerif($numero);
        return true;
    }
    else
    {
        reinitVerif($numero);
        return false;
    }
}

function reInitVerif($numeroBase)
{
    $exist = true;

    while ($exist)
    {
        $newNum = rand(0,500);
        $reqGetExists = "SELECT COUNT(*) as total FROM VERIF WHERE numeroVerif=".$newNum;
        $resGetExists= mysql_query($reqGetExists) or die($reqGetExists." : ".mysql_error());
        $TableGetExists = mysql_fetch_array($resGetExists);
        if ($TableGetExists["total"] == 0)
            $exist = false;
    }
    $reqGetMaj = "UPDATE VERIF SET numeroVerif=".$newNum." WHERE numeroVerif=".$numeroBase;
    $resGetMaj= mysql_query($reqGetMaj) or die($reqGetMaj." : ".mysql_error());
    return true;
}

function verifAleatoire()
{
    $reqGetIds = "SELECT numeroVerif FROM VERIF";
    $resGetIds = mysql_query($reqGetIds) or die($reqGetIds." : ".mysql_error());
    $total = mysql_num_rows($resGetIds) -1;
    $TableGetIds = mysql_fetch_array($resGetIds);
    $total = rand(0,$total - 1);
    for ($i=0;$i<$total;$i++)
    {
        $TableGetIds = mysql_fetch_array($resGetIds);
    }
    return $TableGetIds["numeroVerif"];
}

Et mon formulaire (enfin le morceau nteressant):
                    <td style="width:450px;">
                    <?
                        $numeroVerif = verifAleatoire();
                        echo getQuestionVerif($numeroVerif);
                    ?>
                       

                       
                        " name="numeroVerif" type="hidden" size="78" />
                    </td>

Et enfin la validation :

    if (isset($_POST["numeroVerif"])) $numeroVerif = $_POST["numeroVerif"]; else $numeroVerif="";
    if (isset($_POST["reponseVerif"])) $reponseVerif = $_POST["reponseVerif"]; else $reponseVerif="";

if (!testVerif($numeroVerif,$reponseVerif))
        erreur("Le contr&ocirc;le anti-robot a &eacute;chou&eacute;. Veuillez recommencer");

merci
Seb
Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013

J'en avais un du même genre, où je générais des clés qui étaient détruites lors de la vérification, avec un captcha tout con, mais qui marchait très bien. Si j'arrive à récupérer le code (il était pas pour moi...) je te le passe.
Messages postés
82
Date d'inscription
dimanche 15 avril 2001
Statut
Membre
Dernière intervention
20 novembre 2012

merci à vous je m'en occupe dès que j'ai le temps, pour l'instant pas de flood depuis la dernière fois ....