Zeit "rechnen"
DerDieDas
- perl
Guten Abend,
ich hätte da eine Frage und zwar ich möchte wissen wie man mit der Zeit in Perl hantiert.
Ein Beispiel: ich möchte eine Datei nach 5 oder 24 Stunden löschen bzw. leeren.
Zweites Beispiel: ich möchte eine IP für 10 oder 18 Stunden blockieren.
Wie mache ich das?
ps. Ich habe zwei Bücher zuhause (Webprogrammierung mit Perl und CGI von Undine Schrader), (Perl - Grundlagen, fortgeschrittene Techniken, Übungen von Udo Müller), habe Google benutzt, mich durch SELFHTML gelesen und auch ähnliche PERL-Webseiten/Foren durchsucht aber scheinbar bin ich zu "blöd" um dort eine Problemlösung herauszulesen.
Danke im vorraus,
mfg. Alex
Hallo DerDieDas!
ich hätte da eine Frage und zwar ich möchte wissen wie man mit der Zeit in Perl hantiert.
Ein Beispiel: ich möchte eine Datei nach 5 oder 24 Stunden löschen bzw. leeren.
Die »Zeitdaten« einer Datei erhälst Du mit stat().
Zweites Beispiel: ich möchte eine IP für 10 oder 18 Stunden blockieren.
Wie mache ich das?
Ich würde hier mit dem UNIX-Timestamp arbeiten, den Dir time() liefert.
ps. Ich habe zwei Bücher zuhause (Webprogrammierung mit Perl und CGI von Undine Schrader), (Perl - Grundlagen, fortgeschrittene Techniken, Übungen von Udo Müller), habe Google benutzt, mich durch SELFHTML gelesen und auch ähnliche PERL-Webseiten/Foren durchsucht aber scheinbar bin ich zu "blöd" um dort eine Problemlösung herauszulesen.
Kenne ich beide nicht. Ich empfehle für Anfänger »Einführung in Perl« von Randal L. Schwartz (mit Übungen), dann »Programmieren mit Perl« von Tom Christiansen.
Randal L. Schwartz' Texte sind im Allgemeinen sehr gut erklärt, auch in seinen Kolumnen.
Viele Grüße aus Frankfurt/Main,
Patrick
Hi!
Ich habe zwei Bücher zuhause
eigentlich braucht man nur eins: Das Camelbook;)
mich durch SELFHTML gelesen und
dabei das übersehen?
off:PP
Moin Moin!
Für etwas härtere Fälle von Datums- und Uhrzeitberechnungen mit Zeitzonen, Schaltsekunden und anderen Gehässigkeiten dieses Themas hilft die DateTime-Klasse und ihre "Mitbringsel".
Ganz nebenbei bemerkt nutzt der Rose::DB::Object Object-Relational Mapper diese Klasse, um mit den verschiedenen Zeit- und Datumstypen der verschiedenen Datenbanken umzugehen. Und damit wären wir wirklich weit weg von der ursprünglichen Fragestellung.
Alexander
Guten Tag,
danke erstmal für euere Hilfe.
Ich bin noch nicht wirklich gut in Perl, deshalb wüsste ich nicht wie ich time() für meine bedürfnisse nutzen könnte.
Sagen wir mal so:
Ich möche eine eingabe machen, nach der eingabe darf niemand mehr eine weitere eingabe machen, erst wieder wenn 30 sekunden vorbei sind.
Wie könnte ich das einrichten?
Ich wüsste nicht wie mir da time() von nutzen sein könnte!?
Danke im vorraus,
mfG Alex.
Moin Moin!
Gegenfragen:
* Welches Umfeld? Konsole, GUI, CGI, mod_perl, ...?
* Wie würdest Du Dein Problem in einer anderen Programmiersprache Deiner Wahl lösen?
Alexander
Moin Moin!
Gegenfragen:
* Welches Umfeld? Konsole, GUI, CGI, mod_perl, ...?
* Wie würdest Du Dein Problem in einer anderen Programmiersprache Deiner Wahl lösen?Alexander
##################
Guten Tag!
Umfeld: Konsole. Wenn ich es dort "beherrsche" wird es umgebaut auf den CGI-Betrieb.
Ich kann nur HTML und CSS und damit lassen sich solche Probleme nicht lösen.
Aber ich habe es mir in Perl in etwa so gedacht.
Aufgabe: Ich möchte eine Eingabe machen, die Eingabe führt einen Befehl aus (bspw. etwas in eine Datei schreiben). Nach der Eingabe darf für 30 sekunden keine weitere Eingabe mehr einen Befehl ausführen. Nach den 30 Sekunden wiederholt sich das. Das was ich will haben viele Gästebuch/Foren als Spamschutz eingebaut.
Meine momentane Lösung sieht folgendermaßen aus:
Eingabe wird erstellt. Zeit wird mittels if-Abfrage verglichen ($time) mit der zeit in 30 sekunden($time+30). Die Eingabe wird getätigt und $time+30 als Zahl in einer externen Datei ($dateizeit) gespeichert. Danach sollte geprüft werden ob $time < $dateizeit ist. Ist $time kleiner als $dateizeit dürfen zwar Eingaben getätigt werden, jedoch nichts ausgeführt werden (else-Antwort). Nach 30 Sekunden ist logischerweise $time größer als $dateizeit und es kann wieder von neu beginnen wobei $time+30 bei jeder erneuten Eingabe den Wert in $dateizeit überschreibt/speichert.
Meine gewünschte Lösung:
$time+30 sollte lokal gespeichert werden. Also meine bisherige Lösung so umschreiben das ich dazu keine externe Datei brauche.
Wie geht sowas?
Danke!
Moin Moin!
Umfeld: Konsole. Wenn ich es dort "beherrsche" wird es umgebaut auf den CGI-Betrieb.
Das sind zwei durchaus unterschiedliche Umgebungen. Das fängt schon damit an, dass Dein CGI nur exakt eine einzige Eingabe zu sehen bekommt, danach gibt es eine Antwort aus, und danach wird der Prozess beendet. Sämtliche Status-Informationen, die Du im CGI-Prozess hattest, sind WEG. Außerdem kann es durchaus vorkommen, dass zwei oder mehr Instanzen des CGIs teilweise parallel laufen und sich im schlimmsten Fall gegenseitig sabotieren.
Ich kann nur HTML und CSS und damit lassen sich solche Probleme nicht lösen.
Mehr nicht? Kein Basic, C, Javascript?
Aber ich habe es mir in Perl in etwa so gedacht.
Aufgabe: Ich möchte eine Eingabe machen, die Eingabe führt einen Befehl aus (bspw. etwas in eine Datei schreiben). Nach der Eingabe darf für 30 sekunden keine weitere Eingabe mehr einen Befehl ausführen. Nach den 30 Sekunden wiederholt sich das.
Für ein dummes Konsolenprogramm:
1. Eingabe lesen
2. Eingabe verarbeiten
3. Ergebnis ausgeben
4. 30 Sekunden warten, ohne auf Eingaben zu reagieren oder etwas auszugeben
5. Weiter mit Schritt 1.
Für ein CGI FUNKTIONIERT DAS NICHT, jedenfalls nicht auf diese Art.
Das was ich will haben viele Gästebuch/Foren als Spamschutz eingebaut.
Die Beschränkung ist unsinnig, denn sie läßt sich trivial umgehen. Es sei denn, Du blockierst das gesamte Script für 30 Sekunden. Dann läßt sich noch viel trivialer ein Denial of Service auf das Script starten: Einfach alle 30 Sekunden eine minimale Eingabe vortäuschen und schon kann NIEMAND mehr das Script benutzen.
Meine momentane Lösung sieht folgendermaßen aus:
Eingabe wird erstellt. Zeit wird mittels if-Abfrage verglichen ($time) mit der zeit in 30 sekunden($time+30). Die Eingabe wird getätigt und $time+30 als Zahl in einer externen Datei ($dateizeit) gespeichert.
Welchen Locking-Mechanismus benutzt Du, um zu verhindern, dass ein paralleler Prozess die Datei überschreibt?
Danach sollte geprüft werden ob $time < $dateizeit ist. Ist $time kleiner als $dateizeit dürfen zwar Eingaben getätigt werden, jedoch nichts ausgeführt werden (else-Antwort).
Eingabe, Verarbeitung und Ausgabe sind in einem CGI zwingend eine Einheit. Du mußt das komplette CGI im Falle eines Falles sperren, sprich: Es muß eine Fehlermeldung ausgeben.
Nach 30 Sekunden ist logischerweise $time größer als $dateizeit und es kann wieder von neu beginnen wobei $time+30 bei jeder erneuten Eingabe den Wert in $dateizeit überschreibt/speichert.
Du beschreibst die DoS-anfällige Variante.
Meine gewünschte Lösung:
$time+30 sollte lokal gespeichert werden. Also meine bisherige Lösung so umschreiben das ich dazu keine externe Datei brauche.
Was meinst Du mit "lokal"?
Im Browser? Lächerlich, den kontrolliert der Angreifer. Benutzt Du Cookies, werden Cookies ausgeschaltet oder gefiltert. Benutzt Du Javascript, wird Javascript ausgeschaltet, gefiltert oder schlicht simuliert. Benutzt Du ein Plugin (Flash, Java, ...), wird es ausgeschaltet, seine Ein- und Ausgaben gefiltert oder sein Verhalten simuliert. Benutzt Du versteckte Formular-Elemente, werden die gefälscht, gefiltert oder blockiert.
Deine einzige Chance ist, auf dem Server zu arbeiten. Wenn Du nicht direkt in eine Datei schreiben willst, schreib in eine Datenbank. Andere Möglichkeiten hast Du nicht.
Deine 30-Sekunden-Sperre scheitert an der Realität. Du willst einen bestimmten Benutzer daran hindern, im Abstand von weniger als 30 Sekunden Daten an Dein CGI zu schicken. Dein Problem ist, dass es mit HTTP absolut unmöglich ist, einen Benutzer sicher zu identifizieren. Du kannst bestenfalls auf Kooperation seitens des Browsers hoffen, für jeden Benutzer eine Session einrichten, und verhindern, dass innerhalb von 30 Sekunden zwei Requests von einer Session abgearbeitet werden.
Aber nichts und niemand hindert einen Angreifer, mehrere Sessions parallel zu benutzen oder die Session sofort nach dem ersten Request zu beenden.
Alexander