mein Spammschutz funzt net ;(

blubber

Erfahrenes Mitglied
Hi,

ich hab irgendwo hier mal nen code für einen spammschutz gefunden. Zuerst dachte ich, dass der auch astrein funktioniert, aber dann hab ich das mal genauer getestet. Angenommen ich stell den schutz auf 60 sekunden, also dass jemand nur alle 60 sek posten kann, dann gelten die 60 sekunden komischerweise nicht nur für einen user, sondern für ALLE. Normal sollte der das ja anhand der ips trennen, wer nun posten darf und wer nicht, aber das macht der nicht. Kann bitte mal jemand schauen was an dem code fehlerhaft ist? Wie gesagt, ich hab den direkt von hier, unverändert.

PHP:
<?php

// ANFANG des Spammschutzes

  // Speicherung der Daten in einer Datei
  function schreiben($datei,$mode){
    global $ip;
    $ip=getenv ("HTTP_X_FORWARDED_FOR");
    $fp = fopen($datei,$mode);
    $eintrag=$ip."|".time()."\n";
    fwrite($fp,$eintrag);
    fclose($fp);

  }
  function ip_sperre() {
    // Einstellungen
    global $ip;
    $ip=getenv ("HTTP_X_FORWARDED_FOR");
    $reloadlogdatei = "spamm/comment.txt";
    $anzahleintraege = 1000;
    $zeitlimit = 60; // in Sekunden

    // Prüft, ob Datei existiert => ansonsten Erstellen
    if(!file_exists($reloadlogdatei)) {
      $datei = fopen($reloadlogdatei,"w+");
      fclose($datei);
    }
    $fp = file($reloadlogdatei);
    $size = sizeof($fp);

    // Beschreibt die Datei, wenn Liste voll
    if($size >= $anzahleintraege){
      schreiben($reloadlogdatei,"w");
    // Prüft, ob eine IP in der Liste steht
    } else {
      for ($i=0;$i<$size;$i++) {
        $zeile = explode("|",$fp[$i]);
        // IP wird gefunden
        if ($zeile[0] == $ip AND $zeile[1] > (time()-$zeitlimit)){
          $ausgabe = true;
        // IP wird nicht gefunden
        } else  {
          $ausgabe = false;
        }
      }
      // Protokolliert die IP-Adresse (schreibt)
      schreiben($reloadlogdatei,"a+");
    }
    return $ausgabe;
  }

  // Hauptaufruf des Programms

  if(ip_sperre()!=false) 
{
    echo "Sie können innerhalb von 60 Sekunden nur einmal posten";
}

// ENDE des Spammschutzes

else 

{

include ("post_kommentar.php");

}

?>
 
hmm ich hab das viel eleganter gelöst :D nähmlich mit einer db..

PHP:
$ip = $REMOTE_ADDR;
$speichern = mysql_query("INSERT into table (ip) VALUES ('$ip')");
und in die anfangs datei kommt dann:

PHP:
$ip1 = "$REMOTE_ADDR"; 
$anfrage = mysql_query("SELECT ip FROM table WHERE ip = '$ip1'"); 
$anzahl = mysql_num_rows($anfrage); 
if($anzahl == 1) 
{ 
echo "<br><br><br><center><font face=\"verdana\" size=\"1\" color=\"white\"><b>Du hast schon einen Beitrag abgeschickt</b></font></center>"; 
} 
else 
{ 
##der andere code

hoffe das hilft..
 
Zuletzt bearbeitet:
hm..sieht auf jeden fall mal einfacher und logischer aus deine variante, probier ich glei mal aus :)

thx soweit.
 
achja, einen haken hat die sache aber, wie ich grad merk.
Nach deiner Methode kann man ja dann nur einen Kommtar posten, und dann erst wieder wenn man neu einwählt.
Kann man das irgendwie feslegen, dass die ip nur 30 sekunden in der datenbank hinterlegt wird?

bye
 
inserte den timestamp+30 sekunden und lass jedes mal, wenn ein neuer beitrag erstellt wird, eben eine

Code:
DELETE WHERE timestamp < '$timestamp'

abfrage laufen
 
könnte vielleicht jemand einen ausfühlicheren code posten? ich weis absolut nicht, wie ich das mit diesem timestamp machen soll.

bye
 
probiers mal so:
PHP:
$zeit = time();
if ($speichern) {
$loeschen = ("DELETE FROM table WHERE timestamp < '$zeit'");
}
else {
$zeit2 = time()+30;
$ip = $REMOTE_ADDR;
$speichern = mysql_query("INSERT into table (ip, zeit) VALUES ('$ip', '$zeit')");
}

keine ahnung ob das funzt...
 
ja, so meinte ich es, aber es müsste so lauten, denke ich:

PHP:
$zeit = time();
if ($speichern) {
$loeschen = ("DELETE FROM table WHERE zeit < '$zeit'");
mysql_query($loeschen);
}
else {
$l = localtime(time());
$new = mktime($l[2], $l[1], $l[0]+30, $l[4], $l[3], $l[5]+1900)
$ip = $REMOTE_ADDR;
mysql_query("INSERT into table (ip, zeit) VALUES ('$ip', '$new')");
}
 
Zurück