Selbstgemachter Spamschutz: little problem

  • Code
    $datei = "schutz/".$_SERVER['REMOTE_ADDR'].".txt";
    			$file_open = fopen($datei,"w");
    			$file_writed = fgets($file_open, 10);
    
    			$now = date("d.m.Y");


    und

    Code
    elseif(file_exists($datei) and $file_writed == $now) {
    				$form_type = "password";
    				$form_1 = '<div id="formular_proj_zw">';
    				$form_2 = '</div>';
    				$meldung = '<font id="error">Bitte nicht spammen. Sie könen pro Tag nur ein Formular abschicken.</font>
    ';}

    und noch:

    Das wär mein selbstgemachter Spamschutz.

    Der sollte so funktionieren:

    Wenn jemand ein halbwegs gültiges Formular abschickt, wird der Zeitpunkt (Datum und Uhrzeit) und IP gespeichert. Wenn der gleiche nochmal versucht ein Formular abzuschicken, sollte er blockiert werden.

    Wenn die Datei erstellt wurde, sollte der Script immer prüfen, ob das darin enthaltene Datum das Gleiche ist, wie heute. Wenn das eintritt, wird derjenige gesperrt. Sonst kann er das Formular abschicken.

    Die Datei mit den erforderlichen Daten wird erfolgreich gespeichert.

  • Dass es nicht geht. Ich denk mal es liegt an dem Teil, wo mein Script die Daten aus der Datei lesen und auswerten soll.

  • Fuehr dir die Funktionsreferenz mal zu Gemuete und ueberleg ob das Oeffnen der Datei im ersten Snippet mit "w" richtig ist *g*

    Ausser wenn du ein paar Loopschleifen rausgenommen hast sehe ich allerdings nicht wie der funktionnieren soll: nur die ersten 10Zeichen werden genommen -was ist mit Spammern die davor geschrieben haben? :?:


    PS (kanns mit nicht verkneifen) Die Vergangenheitsform von "write" ist "written" statt "writed" :P

  • Nein es ist ja so, dass wenn ich das Form. abschicke, wird die IP als Dateiname genommen und er Inhalt ist 10 Zeichen Text.

    Das heisst, jeder, der spammt, bekommt eine "eigene" Datei.

    Das mit der Vergangenheitsform weiss ich. Bin der Klassenbeste im Englisch. Bei meinem Code ist das aber egal. Der sieht doch sonst eigentlich niemand.

    Ich finds eben auch ein weng witzig *lol* Drum lass ichs.


    Achja: Hab jetzt Modus "r" beim ersten Vorgang. Ist besser so.


    Code
    Warning: fopen(schutz/***************.txt) [function.fopen]: failed to open stream: No such file or directory in

    Das da kommt jetzt...! :roll: (Da war natürlich schon ne normale IP)

  • Kontrollier zuvor mit file_exists() ob die Datei existiert.
    Wenn die IP nich nix abgesendet hat gibts die Datei ja noch gar nicht - PHP spuckt also ne Fehlermeldung aus :)

    [EDIT]
    Ich wuerde dir eine solche Funktion eher anraten (ungetestet, auf die schnelle geschrieben), als lauter einzelne Dateien


    Das 3. Parameter ist die Zeit in Sekunden wielange kein weiterer Eintrag getaetigt werden darf

  • Das kapier ich alles nicht.

    Könnt ihr euch mal den ganzen Script anschauen?:

  • Nix für ungut, aber: autsch! firefox, schreibe mal an den Anfang des Scriptes die Zeilen

    Code
    error_reporting(E_ALL);
    ini_set("display_errors", true);


    PHP schreit bestimmt um hilfe, nur hört bisher keiner zu. ;)

    Und $_SERVER['REMOTE_ADDR'] ist gänzlich ungeeignet, um so eine Sperre einzubauen, weil du damit auch fälschlicherweise aussperrst.

  • Nein das habe ich nicht gesagt. Aber wäre sehr gut.

    Ich knoble mal selbst ein bisschen rum. Und schau mal, wies geht.

    Aber so ansatzweise Ideen geben wär nicht schlecht...

  • Zitat von bandit600

    Und $_SERVER['REMOTE_ADDR'] ist gänzlich ungeeignet, um so eine Sperre einzubauen, weil du damit auch fälschlicherweise aussperrst.

    Warum? Ich will nur damit bezwecken, dass man pro Tag und IP nur ein Formular abschicken kann.

  • Zitat

    Und $_SERVER['REMOTE_ADDR'] ist gänzlich ungeeignet, um so eine Sperre einzubauen, weil du damit auch fälschlicherweise aussperrst.


    Fehlt da nicht was im Satz? :P

  • *lol* Hab aber den Satz grundsätzlich verstanden.

    Jetzt aber bitte zum Problem.

    Warum kann ich nicht einfach, wenn ich ein Form. erfolgreich abschicke, eine Datei erstellen mit der IP als Dateiname und dem Datum als Inhalt?

    Dann soll beim nächsten Mal, wenn die if() Abfrage kommt, eine Warnung erscheinen und das Mail nicht schicken, da die Datei IP schon existiert und das Datum dort drin mit dem jetzigen übereinstimmt.

  • Tja das machen ist kein problem nur hats du dich (entschuldige den Ausdruck) bissl schlampig angelegt :)

    Ich wuerde dir aber anraten eine einzelne Datei fuer alle und nicht zig kleine Dateien anzulegen -schon nur der Uebersicht halber...

    Schau dir meine oben gepostete Funktion an, im Grund ist da alles drin was du brauchen solltest um die Sperre zu realisieren.

    Ausserdem ist im SelfPHP-Handbuch ein Beispiel einer solchen Sperre wenn ich mich richtig erinnere...

  • IP's zu benutzen, kann zu problemen führen:

    1. In firmen gehen alle user mit der gleichen IP ins netz
    2. DSL-User bekommen IP's zugewiesen. Auch wenn die wahrscheinlichkeit nicht sehr groß ist, könnten zwei unterschiedliche user mit der selben IP auf deine seite kommen
    3. Die IP-Sperre umgehe ich, in dem ich als DSL-User meinen Router einfach neu verbinden lasse.

    Und warum benutzt du keine DB, damit geht das um einiges komfortabler.

  • Hab das gemacht, weil ich noch nicht mit Datenbanken arbeite, geschweige denn kann.

    edit: Werds mir mal beibringen.