|
Webdesign-Forum
Antworten auf alltägliche Fragen im Webdesign und der Internet-Programmierung
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
ronnybaumann
Anmeldedatum: 09.06.2011 Beiträge: 6
|
Verfasst am: 31.08.2011, 14:55 Titel: WordPress Anmeldung durch SpamBots verhindern |
|
|
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 |
|
 |
|
|
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.
|
|
|
|