PHP Gästebuch mit Spamschutz!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Gästebuch mit Spamschutz!

    Hallo,
    ich habe grade ein Gästebuch mit PHP und MySQL geschrieben!
    Nur fiehl mir ein, dass ich gar keinen Spam und flooding schutz habe!

    Allerdings habe ich überhaupt kein Peil, wie ich das machen soll!
    Hier das Script, dass die Daten zum Schluss einfügt!

    PHP-Code:
    <?
    $datum = date("j.m.Y");
    $zeit = date("G:i");
    $ip = GetEnv("REMOTE_ADDR");
    include "connect_to.php";

    if (empty($mail)){
    $mail = "no mail";
    }

    if (empty($name) || empty($text)){
    include "guestbook_add_error.php";
    }else{

    $Query = "INSERT INTO guestbook (name,text,mail,datum,zeit,ip) VALUES ('$name','$text','$mail','$datum','$zeit','$ip')";
    if (!($ergebnis = mysql_query($Query,$verbindung))){
    echo "<font face=Verdana size=2>Der Eintrag konnte nicht hinzugef&#xFC;gt werden. $name" ;
    exit();
    }
    else
    {
    include "guestbook_added.php";
    }

    }

    ?>
    Kann man nicht die Variabeln irreführen, so dass dieses Script, wenn es immer wieder neu geladen wird (=spammen) keine Daten mehr enthalten?
    Oder wie soll das funktionieren???

    Brauche da dringend Hilfe!
    ciao
    Sebastian

  • #2
    Du darfst gerne mal die Suche benutzen oder unsere Tutorials durchlesen

    Kommentar


    • #3
      Sorry! Ich hab mich durch ein paar Tutorials gewühlt, aber irgendiwe klappt das überhaupt nicht!
      Ich weiß nur, dass man eine 2te Datenbank anlegen soll: ipsperre mit ip und time! Hier ein Beispiel, dass ich gefunden habe:

      PHP-Code:
      <? 
      function getip() { 
          //wenn der User über nen Proxy in's Internet geht... 
          //muss die IP so "geholt" werden... 
          if(getenv("HTTP_X_FORWARDED_FOR")) 
              $ip = getenv("HTTP_X_FORWARDED_FOR"); 
          else 
              //ansonsten so... 
              $ip = getenv("REMOTE_ADDR");  
          return $ip;  


      mysql_connect("host","name","passwort") or die(mysql_error()); // Verbindet zum Datenbankserver 
      mysql_select_db("datenbank"); // Wählt die Datenbank 

      $sperre=time()-180; 
      $jetzt=time(); 
      $ip = getip();  

      mysql_query("DELETE FROM ipsperre WHERE time<$sperre") or die(mysql_error()); // Löscht Einträge, die veraltet sind 

      $pruef=mysql_query("SELECT ip FROM ipsperre WHERE ip='$ip'") or die(mysql_error()); 
      if(@mysql_fetch_array($pruef)) { // Wenn die IP nicht gefunden wurde: Eintrag 
          mysql_query("INSERT INTO ipsperre (ip, time) VALUES ('$ip', '$jetzt')") or die(mysql_error()); 
           
          // Weitere Einträge, z.B. ins Gästebuch 

      } else { // ansonsten Verweigerung 
          echo "Deine IP wurde in der Datenbank gefunden, du hast nicht drei Minuten gewartet!"; 

      ?>
      Nur leider klappt das nicht! Er braucht total lange um die Seite aufzurufen!
      Ist da irgendwo ein Fehler? Kenne mich nicht sonderlich gut mit MySql aus!

      Kommentar


      • #4
        das zauberwort heisst hier wohl eher sessions .... ip sperre hat einen nachteil:
        Stell dir folgende Situation vor: Du bist Mitarbeiter einer Firma die über eine Standleitung eine für alle Mitarbeiter gleiche Verbindung zum Internet hat. Nun schreibt einer der Mitarbeiter eine Nachricht in dein Gästebuch. 10min. später möchte aber sein Gegenüber auch eine Nachricht im GB hinterlassen weil sein Gegenüber ihm gesagt hat dass die Seite sooo toll ist. Da aber beide die gleiche IP (jedenfalls vom Internet aus gesehen) haben, kann er nicht reinschreiben weil die IP gesperrt ist ....

        Also nimm lieber Sessions .... ist wesentlich einfacher und besser .....

        mfG
        CMS-X Medien- und Modelagentur

        Kommentar


        • #5
          @Ruderfreund: Dann hast du anscheinend nicht richtig gelesen. Eine zweite Tabelle ist definitiv nicht erforderlich. Wozu auch. Mach halt einfach ne Spalte IP.

          Wie du aber sicher bei deiner Suche im Forum gelesen hast, solltest du DanielDs Argument nicht ganz vernachlässigen.

          Kommentar


          • #6
            Ich habs nun hingekriegt! Hier das Ergebnis:
            Es ist mir so etwas lieber als Sessions, da ich mich mit Sessions eh nicht auskenne! Es wird überprüfet ob die ip in den letzten 180 sec bereits einen Eintrag ins gb gemacht hat! Wenn ja, dann gibts nen error!
            PHP-Code:

            <?
            if (empty($name) || empty($text)){
            include "guestbook_add_error.php";
            }else{

            function getip() { 
                //wenn der User über nen Proxy in's Internet geht... 
                //muss die IP so "geholt" werden... 
                if(getenv("HTTP_X_FORWARDED_FOR")) 
                    $ip = getenv("HTTP_X_FORWARDED_FOR"); 
                else 
                    //ansonsten so... 
                    $ip = getenv("REMOTE_ADDR");  
                return $ip;  


            if (empty($mail)){
            $mail = "no mail";}
            $datum = date("j.m.Y");
            $zeit = date("G:i");
            $ip = GetEnv("REMOTE_ADDR");
            include "connect_to.php";


            $sperre=time()-18; 
            $jetzt=time(); 
             
            $Query = "SELECT * FROM abi_guestbook WHERE (time>$sperre) AND (ip='$ip')";

            if (!($ergebnis = mysql_query ($Query, $verbindung))) {
                echo("Die Abfrage ist fehlgeschlagen!<P>");
                echo("Ihre Abfrage $Query war nicht erfolgreich!<P>");
                exit();
            }

            $rows = mysql_num_rows($ergebnis);
            if ($rows == "0"){


            ////////
            $Query2 = "INSERT INTO guestbook (name,text,mail,datum,zeit,ip,time) VALUES ('$name','$text','$mail','$datum','$zeit','$ip','$jetzt')";
            if (!($ergebnis = mysql_query($Query2,$verbindung))){
            echo "<font face=Verdana size=2>Der Eintrag konnte nicht hinzugef&#xFC;gt werden. $name" ;
            exit();
            }
            else
            {
            include "guestbook_added.php";
            }
            ///////////////////////////////


            }else{



            include "guestbook_wait_error.php";


            }
            }
            ?>
            Aber vielen Dank trotzdem!

            Kommentar


            • #7
              mal n nachhaken

              hallo zusammen,

              habe grade diesen thread herausgewühlt, würde da gern noch etwas diskutieren.

              ip time out mit allen genannten nachteilen scheint mir nich so die lösung zu sein. habe die erfahrung gemacht, dass bots immer wieder kamen, aber durchaus stunden dazwischen lagen und sich dann eintrugen.

              idee ist: die gb seite ist nicht über eine link (verweis a la a href) zu erreichen, sondern über ein formular button, der ein input als hidden überträgt. auf der gb seite kontrolle, ob diese variable gesettet ist. somit kann die seite nicht direkt aufgerufen werden, bringt das einen vorteil?

              wie sind eure erfahrungen mit spam bots bzw was unternehmt ihr dagegen?

              gruß,

              rwin

              Kommentar


              • #8
                Vorteil ist natürlich, dass Standard-Bots nicht drauf kommen. Wenn es jemand ernsthaft drauf anlegt, kann er aber deine lösung ohne weiteres umgehen und weiter spamen.

                Kommentar


                • #9
                  Indem er die hidden variable ausliest und selbst per formular an das gästebuch schickt!?

                  Kommentar


                  • #10
                    ich machs letztlich immer so, dass ein Eintrag letztlich erst freigeschaltet werden muss - schon allein deswegen, damit nicht irgendwelche rechtsradikalen Parolen oder Links zu ********************-sites stundenlang auf der Page rumschwirren ehe man sie entdeckt und löschen kann.

                    Klar, wer ein wirklich stark frequentiertes Gästebuch hat, beim dem kann die freischalterei dadurch schon beinah in Arbeit ausarten - aber wenns nicht 100 Einträge am Tag sind, ist es durchaus eine Überlegen wert so vorzugehen.

                    Außerdem scheints ein bisschen zu helfen, wenn man für sowas nicht unbedingt die üblichen Namen für die Scriptdateien verwendet wie z.B. 'gaestebuch.php', 'gb.php', 'guestbook.php' usw. sondern einen beliebigen anderen Namen.

                    rwins Vorschlag ist auch nicht der verkehrteste - Zufallswerte (im Form von ner Session-ID eigentlich ganz gut) abspeichern, die dann eine bestimmte Zeit gültig sind und ins Form als Hidden-Input mitgeliefert werden.
                    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                    Schön - etwas Geschichte kann ja nicht schaden.
                    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                    Kommentar


                    • #11
                      Manuelles Freischalten oder Löschen jedes Eintrags wirst du nicht mehr wollen oder gar leisten können, wenn dir ein Bot dir mal innerhalb von Minuten tausende Einträge hinterlassen hat. Oder wenn du mal 14 Tage auf Safari gehst, dann liegt das GB brach: Keiner kann eintragen, weil keiner moderiert.
                      Es solte also schon was weitgehend automatisches sein ...

                      Ein Gästebuch ist - wenn es um Spam geht - das gleiche wie die Kommentarfunktion eines Blogs.
                      Für die gibt es inzwischen sehr ausgereifte Spamschutztechniken (Captcha, Badwortfilter, URL-Filter, URL/Text-Ratio, Spam/Ham-Learning), die du ja mal ansehen kannst.

                      Kommentar


                      • #12
                        von ner richtigen Spambot-Attacke ist (zum Glück?!) noch keines unserer Gästebücher erwischt worden - es kommt vielleicht auch immer etwas drauf an in welcher Art von Homepage es verwendet werden soll - ich mach sehr viele für die Hotels in unserer Region - da kommts gerne mal vor, dass von nem Konkurrenten ein bösartiger Eintrag gemacht wird - sowas kann dann einfach kein Spam-Schutz der Welt von sich aus erkennen und die Besitzer der Hotels gucken ned stündlich nach, ob was drin ist, was gelöscht werden müsste - denen ist sowas mit nem Freischaltlink halt einfach lieber.
                        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                        Schön - etwas Geschichte kann ja nicht schaden.
                        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                        Kommentar


                        • #13
                          Jup, verstehe. Das sind natürlich andere Umstände ... ein Hotel ist keine bloggende Privatperson, ein Hotel ist nie 14 Tage auf Safari.
                          Ein Hotel hat Neider und Konkurrenten, die ihm gezielt ans Bein pinkeln wollen; ein Blogspambot will nur Googlejuice erzeugen.

                          Kommentar


                          • #14
                            finds gut, dass doch noch ein wenig diskussion aufgekommen ist!

                            @onemorenerd, ich werd mir die sachen mal anschauen, danke!

                            vielleicht gibts noch einige, die auf anderen wegen diese sachen bekämpfen.

                            Kommentar

                            Lädt...
                            X