Cronjob - Authentifizierung

Carrear

Erfahrenes Mitglied
Kann man einen Cronjob irgendwie authentifizieren? Ich mache das bislang immer so, dass ich einen langen, kryptischen GET-Parameter abfrage, aber mir ist schon klar, dass das keine so richtig sichere Methode ist um es vor unberechtigten Aufrufen zu schützen. Welche Möglichkeiten habe ich da?

VG Martin
 
Hi

mehr Details über die Situation wären hilfreich.
Ein Linux-Cronjob macht also mit wget/curl einen PHP-Aufruf (oder nicht?).
Am selben Server? Wenn nein, über HTTPS?
Kann die PHP-Seite beliebig verändert werden?
Gibt es Leute, die Zugriff auf die Cron-Seite (Server etc.) haben, aber nicht auf die PHP-Seite?
Warum ist es überhaupt nötig, dass man sich für Cron-Aufgaben authentifiziert? Das klingt sehr nach falschem Design.
 
Es ist eine rein hypothetische Situation. Ich habe schon einige Male Cronjobs gehabt wo ich dachte, dass es nicht schlecht wäre, wenn ich verhindern könnte, dass dritte die URL aufrufen um die Aufgabe durchzuführen. Es kann zwar beim Aufruf nichts passieren, aber vielleicht will ich ja verhindern, dass die PHP Datei öfter Ihre Aufgabe erfüllt, als ich beim Cronjob eingestellt habe o.ä.

Welche Technologie dahinter steckt kann ich dir nicht sagen. Ich lege bei der Domainfactory einen Cronjob an der zu bestimmten Zeiten ein PHP Script aufruft, welches als PHP Datei auf meinem Server liegt.
 
verhindern, dass die PHP Datei öfter Ihre Aufgabe erfüllt
Mit dem muss man auch bei fehlerfreien Cronjobs ohne Useraufrufe immer rechnen. Die meisten Cron-mäßigen Sachen haben so eine Anforderung nicht, daher wurde bei den Cronservices darauf nicht wirklich geachtet.

Mit etwas synchronisierbarem wie zB. einer Datenbank kann man es aber leicht erreichen, dass ein Mindeszeitraum zwischen den Starts liegen muss (zB. reguläre Starts alle 30min, und per PHP dann prüfen ob seit dem letzten Start min. 28 Minuten vergangen sind. Genau 30/30 geht nicht gut, wegen ein paar Sekunden Fehler würde dann immer wieder mal ein Durchgnag ausgelassen.)
Angenommen, es gibt eine Tabelle meinecrons mit Spalten cronid und laststart (timestamp), und den betroffenen Eintrag gibts schon, in der PHP-Datei vor der eigentlichen Aufgabe einfach sowas machen (pseudocode):
Code:
oldlaststart = SQL(SELECT laststart FROM meinecrons WHERE cronid=$meineid);
if(oldlaststart neuer als 28min) exit(0);
SQL(UPDATE meinecrons SET laststart=now() WHERE cronid=meineid AND laststart=$oldlaststart);
//das zweite Where ist sehr wichtig, nicht weglassen
if(affected_rows != 1) exit(0),
Also zuerst prüfen, ob ein zu neuer Start eingetragen ist. Wenn ja, Ende. Dann die jetztige Zeit eintragen, und bevor die eigentliche Aufgabe aber begonnen wird noch prüfen, ob das Update überhaupt gewirkt hat. Zwischen dem eigenen Select und Update könnte ein anderer Scriptdurchgang gerade seine Zeit reingeschrieben haben (deshalb das zweite Where und die AffectedRows-Sache). Falls das der Fall ist, natürlich auch aufhören, weil das andere Script schon arbeitet.

Mit einer kleinen Erweiterung kann man auch verhindern, dass sich lang dauernde Aufgaben nicht überlappen (also es wird was gestartet, während der vorige Durchgang noch nicht fertig ist): Auch einen "lastactivity"-Timestamp haben, den während der eigentliche Arbeit zB. alle zwei Minuten oder häufiger auf now() setzen, und beim Scriptstart prüfen ob der eingetragene Timestamp mindestens 5 Minuten alt ist. (Wieder mit der Racecondition-Prüfung).
 
Zurück