Webdesign-Forum

Antworten auf alltägliche Fragen im Webdesign und der Internet-Programmierung
WordPress Anmeldung durch SpamBots verhindern

 
Neues Thema eröffnen   Neue Antwort erstellen    Webdesign-Forum Foren-Übersicht -> WordPress
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ronnybaumann



Anmeldedatum: 09.06.2011
Beiträge: 6

BeitragVerfasst am: 31.08.2011, 14:55    Titel: WordPress Anmeldung durch SpamBots verhindern Antworten mit Zitat

Da wir in einigen WordPressInstallation einen Registrierungsbereich für neue Benutzer haben, ist uns aufgefallen das nach einer gewissen Zeit relativ viele Anmeldungen durch SpamBots durchgeführt werden.

Da Recaptcha und ähnliche Plugins zur Spamvermeidung ziemlich Benutzerunfreundlich sind haben wir uns drann gesetzt und eine eigene Klasse geschrieben um die Anmeldung solcher Bots zum größten Teil zu verhindern.

Die Klasse SpamDetect überpüft:
-wie lange der Benutzer gebraucht hat das formular auszufüllen
-über welchen Referer er auf die Formularseite gelangt
-über welchen Referer er das Formular abgeschickt hat
-ob ein hidden Feld ausgefüllt wird

Aus all diesen Kriterien wird ein Rating errechnet. Wird dieses Rating zu hoch gibt die Methode "getRating" true zurück wird es nicht erreicht gibt sie false zurück.

Damit die Klasse funktioniert muss das Registrierungsformular um folgende Felder ergänzt werden:
Code:
<input type="text" class="callTime" name="callTime" value="<?php echo microtime(true); ?>" style="visibility: hidden;"/>
<input type="text" class="refForm" name="refForm" value="<?php echo $_SERVER['HTTP_REFERER']; ?>" style="visibility: hidden;"/>
<input type="text" class="dfm" name="dfm" value="" style="visibility: hidden;"/>


Um die Registrieung zu verhindern wenn "getRating" true zurückgibt muss nach dem abschicken folgender Code eingebunden werden:
Code:
<?php
/* includes */
include_once 'register-spam-detect.class.php';

/* config */
define(REFERER_FORM, 'hier muss ein gültiger Referer der Formularseite stehen');
define(REFERER_SUBMIT, 'hier muss ein gültiger Referer der Submitseite stehen');


$spam = new SpamDetect(REFERER_FORM, REFERER_SUBMIT);

$spam->setFillTime($_POST['callTime']);
$spam->setHiddenField($_POST['dfm']);
$spam->setRefForm($_POST['refForm']);
$spam->setRefSubmit($_SERVER['HTTP_REFERER']);

if ($spam->getRating() == true)
{
    echo "Registrierung abgebrochen!";   
}
else
{
    echo "Registrierung wird durchgeführt!";
}
?>


Die eigentliche Klasse:
Code:
<?php
class SpamDetect
{
    private $fltRatingLimit = 0.0;
    private $strHiddenField = '';
    private $fltFillTime = 0.0;
    private $strRefForm = '';
    private $strRefSubmit = '';
    private $strRefFormConst = '';
    private $strRefSubmitConst = '';

    function __construct($refForm, $refSubmit, $ratingLimit = 10)
    {
        $this->strRefFormConst = $refForm;
        $this->strRefSubmitConst = $refSubmit;
        $this->fltRatingLimit = $ratingLimit;
    }

    function setRatingLimit($value)
    {
        $this->fltRatingLimit = $value;
    }

    function setHiddenField($value)
    {
        $this->strHiddenField = $value;
    }

    function setFillTime($value)
    {
        $this->fltFillTime = $value;
    }

    function setRefForm($value)
    {
        $this->strRefForm = $value;
    }

    function setRefSubmit($value)
    {
        $this->strRefSubmit = $value;
    }

    private function calcHiddenFieldRating()
    {
        if ($this->strHiddenField == '')
        {
            return 0.0;
        }
        else
        {
            return $this->fltRatingLimit;
        }
    }

    private function calcFillTimeRating()
    {
        $fltFillTimeRating = 0;
        $fltTimeDuration = microtime(true) - $this->fltFillTime;
        if ($fltTimeDuration > 0)
        {
            return $this->fltRatingLimit / $fltTimeDuration * 5;
        }
        else
        {
            return $this->fltRatingLimit;
        }
    }

    private function calcRefFormRating()
    {
        if ($this->strRefForm == $this->strRefFormConst)
        {
            return 0.0;
        }
        else
        {
            return $this->fltRatingLimit / 3;
        }
    }

    private function calcRefSubmitRating()
    {
    if ($this->strRefSubmit == $this->strRefSubmitConst)
        {
            return 0.0;
        }
        else
        {
            return $this->fltRatingLimit;
        }
    }

    function getRating()
    {
        $fltRating = $this->calcFillTimeRating() +
                        $this->calcHiddenFieldRating() +
                        $this->calcRefFormRating() +
                        $this->calcRefSubmitRating();

        if ($fltRating < $this->fltRatingLimit)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

?>


Wir haben die Zeit die ein Benutzer mindestens in der Eingabemaske verbringen muss auf 5sec gesetzt. Wem das zu viel oder zu wenig ist kann dies ganz leicht ändern in dem er folgende Zeile anpasst:
Code:
return $this->fltRatingLimit / $fltTimeDuration * 5;

die 5 steht in dem fall für die Sekunden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Webdesign-Forum Foren-Übersicht -> WordPress Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de
RedSilver 1.03 Theme was programmed by DEVPPL JavaScript Forum
Images were made by DEVPPL Flash Games