Protection anti-flood

Résolu
sebrs1 Messages postés 81 Date d'inscription dimanche 15 avril 2001 Statut Membre Dernière intervention 20 novembre 2012 - 7 janv. 2009 à 09:32
sebrs1 Messages postés 81 Date d'inscription dimanche 15 avril 2001 Statut Membre Dernière intervention 20 novembre 2012 - 10 janv. 2009 à 09:10
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

JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
9 janv. 2009 à 23:54
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.
3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
10 janv. 2009 à 01:34
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 -
3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
7 janv. 2009 à 10:00
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-
0
sebrs1 Messages postés 81 Date d'inscription dimanche 15 avril 2001 Statut Membre Dernière intervention 20 novembre 2012
7 janv. 2009 à 10:05
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
7 janv. 2009 à 10:32
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 -
0
sebrs1 Messages postés 81 Date d'inscription dimanche 15 avril 2001 Statut Membre Dernière intervention 20 novembre 2012
7 janv. 2009 à 13:26
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
0
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
10 janv. 2009 à 02:03
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.
0
sebrs1 Messages postés 81 Date d'inscription dimanche 15 avril 2001 Statut Membre Dernière intervention 20 novembre 2012
10 janv. 2009 à 09:10
merci à vous je m'en occupe dès que j'ai le temps, pour l'instant pas de flood depuis la dernière fois ....
0
Rejoignez-nous