Ankündigung

Einklappen
Keine Ankündigung bisher.

Webserver und MySql Datenbank haben verschiedene "Uhrzeit"?

Einklappen

Neue Werbung 2019

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

  • Webserver und MySql Datenbank haben verschiedene "Uhrzeit"?

    Hi

    Ich entwickle eine Kommentarfunktion und um Spam zu verhindert, habe ich für jede IP ein stündliches Limit von 3 Kommentaren gegeben.
    Wenn jemand ein Kommentar verfasst, prüfe ich einfach, wie viele Kommentare von dieser IP in der letzten Stunde verfasst wurde:

    PHP-Code:
    $sql "SELECT * FROM comments WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND created < ADDDATE(now(), INTERVAL 1 HOUR)"
    Dann einfach mit mysql_num_rows() zählen. Leider hat das jetzt ewig lange nicht geklappt und hab die ganze Zeit den Fehler gesucht, dabei ist wahrscheinlich die Zeit selbst das Problem!

    Hab nämlich festgestellt, dass dieses Script folgende Zeit ausgibt: 2016-09-04 19:26:16
    PHP-Code:
    $now = new DateTime();
    echo 
    "now: " $now->format('Y-m-d H:i:s'); 
    Wenn ich aber einen Kommentar zur DB hinzufüge, wird das Feld "created" (typ datetime) automatisch mit
    CURRENT_TIMESTAMP gefüllt. Und dieser ist zur selben Zeit 2016-09-04 15:25:27!
    Also ein ziemlicher Unterschied. Die Datenbak läuft auf dem Server aber als localhost (musste ich ja angeben, um mit der DB zu connecten).

    Warum ist hier so ein grosser Zeitunterschied und wie löse ich das Elegant?

    Danke und schönen Abend!

  • #2
    Eine Familie mit 3 Teilnehmern hat jeder ein Device ( bspw. Computer, Notebook, Tablet ). Diese gehen alle über dieselbe externe IP raus.
    Wenn jeder jetzt bereits einen Kommentar abgegeben hat, darf keiner mehr einen zweiten abgeben!
    Das selbe Problem hast Du in einem Büro, wo weit mehr als drei Mitarbeiter an die gleiche IP gebunden sind.

    Das Zeitproblem vermute ich in den locales?!
    Wie dem auch sei, solange Du den Vergleich auch auf DB-Ebene machst, ist das relativ egal für den Fall.

    Kommentar


    • #3
      Warum ist hier so ein grosser Zeitunterschied und wie löse ich das Elegant?

      1.) Zeitzone beachten
      Es gibt eine Zentrale Zeitzone (GMT / UTC) und mit einer zeitlichen Verschiebung viele weitere. Wir in Deutschland (Zeitzone Europe / Berlin) z.B. sind je nach Sommer- und Winterzeit +0100 oder +0200 soweit ich weiß, sprich entweder eine oder zwei Stunden Verschiebung. Wenn jetzt der DB-Server auf UTC eingestellt ist, dein Webserver aber auf Europe/Berlin, sieht man diese Verschiebung. Zur Vermeidung dieser Verschiebung verwendet man auf Servern üblicherweise die gleiche Zeitzone respektive überall UTC. Ein Zeitsynchronisationsdienst (z.B. ntpd) sorgt dafür, dass zwischen Servern eine möglichst geringe Abweichung besteht.

      In deinem Fall ist die Verschiebung tatsächlich etwas groß, wie Arne schon gesagt hat, macht das aber nix, wenn nur du auf DB-Ebene arbeitest.



      2.) Query
      Dein Query ist z.B. etwas optimierungsbedürftig. Dein Datenbankserver kann auch schon zählen, dazu musst du nicht alles abholen und php-seitig prüfen:
      PHP-Code:
      // $sql = "SELECT * FROM comments WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND created < ADDDATE(now(), INTERVAL 1 HOUR)";  
      $sql "SELECT COUNT(1) as counter FROM comments WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND created < ADDDATE(now(), INTERVAL 1 HOUR)"

      Kommentar


      • #4
        Arne Drews Ich möchte, dass man auch ohne Registrierung einen Kommentar hinterlassen kann und somit ist eine IP Sperre natürlich nötig. Ich habe dabei eine IP-Sperre nach 3 Kommentaren pro Stunde eingerichtet und eine Seitenweite Globale Sperre für 20 Kommentare pro 24 Stunden. Falls Limits erreicht werde, wird natürlich eine freundliche Meldung angezeigt und im Hintergrund erhalte ich eine Meldung per E-Mail, um die Limite ggf zu erhöhen. Solche Limitierungen sind übeall üblich (meist aber natürlich account spezifisch). Das Internet ist voll davon und dies sollte niemand irritieren.

        Leider hab ich keine Möglichkeit die Zeiten zu ändern, weil ich alles vorerst auf einem "Billighoster" mache.

        Andreas Ich werde dein SQL Vorschlag prüfen und ggf ändern, das scheint mir eine gute Idee

        Habe jetzt alle Zeitberechnungen auf UNIX_TIMESTAMP() geändert. Weil ich da immer auf der sicheren Seite bin. Mich interessieren die Zeitzonen eigentlich nicht gross, aber es muss immer die gleiche Zeit gemessen werden, damit die Zeitangabe stimmt (sonst schreibt einer ein Kommentar und beim anderen steht nach 10 Sekunden schon "vor 5 Stunden geschrieben").

        Danke euch beiden für die Posts.

        Kommentar


        • #5
          Zitat von ErrorWarrior
          Ich möchte, dass man auch ohne Registrierung einen Kommentar hinterlassen kann und somit ist eine IP Sperre natürlich nötig. Ich habe dabei eine IP-Sperre nach 3 Kommentaren pro Stunde eingerichtet und eine Seitenweite Globale Sperre für 20 Kommentare pro 24 Stunden.
          Genau deshalb fallen ja die Beispiele, die ich nannte durch Dein Raster... Nur auf die IP zu prüfen reicht einfach nicht. Allerdings kann es reichen, wenn Deine Seite eh nicht gut frequentiert ist, so dass die Beispiel aus #2 gar nicht eintreffen... Ist am Ende aber reine Glückssache...

          Kommentar

          Lädt...
          X