Problem beim setzen und prüfen eines Codes

proloser

Erfahrenes Mitglied
Hallo,

ich möchte nach einer Abfrage ein Code in eine Session setze und auf der nächsten Seite den Code prüfen.

Zweck:
Damit man auf diese Seite nur kurze Zeit oder nur einmal Zugriff hat.

Das ganze hab ich mit einem Schlüssel und der aktuellen Zeit umgesetzt:
PHP:
## Code setzen
$key = 'irgend-ein-passwort-8782313';
$_SESSION['code'] = md5( date("s") . $key );


## Code prüfen
if($_SESSION['code'] == md5( date("s") . $key ) {
  return true;
} else {
  return false;
}

Mit "date()" kann ich jetzt den Code zB für eine Sekunde, Minute, Stunde, .... je nach dem auf "true" setzen.

Nun zum Problem:
Manchmal wird der Code sofort auf "false" gesetzt, wenn ich den Code zufällig genau beim Übergang von der einen auf die nächste Sekunde, Minute, ... setze.

Ich kann mir vorstellen damit der Code in dieser Sekunde gesetzt wird und die Weiterleitung mit "header("Location: ")" so lange dauert damit die nächste Sekunde erst geprüft wird.

Welche möglichkeiten habe ich, um das Problem zu lösen?

Mfg proloser
 
Zuletzt bearbeitet:
Dann nimm doch ein Datum in der Vergangenheit. Du könntest z.B. die Sekunden um ein paar verringern, bevor du den Code erzeugst. Mal davon abgesehen würde ich das eher mittels eines Timestamps lösen. Du bekommst den aktuellen Zeitstempel mittels time() Funktion.
 
Ich versteh nicht genau wie du das meinst. Klar kann ich ein Datum aus der Vergangenheit nehmen aber das Problem ist dabei nicht gelöst:

strtotime("-10 seconds")
Wenn ich jetzt diesen Timestamp setze und dann wieder prüfe, bleibt das Problem genau gleich.

Wahrscheinlich hab ich dich falsch verstanden ...
 
Ja strtotime("-10 seconds") ergibt der selbe Timestamp wie time() - 10 aber das Problem ist damit nicht gelöst:


PHP:
## Code setzen 
$key = 'irgend-ein-passwort-8782313'; 
$_SESSION['code'] = md5( time() - 10 . $key ); 


## Code prüfen 
if($_SESSION['code'] == md5( time() - 10 . $key ) { 
  return true; 
} else { 
  return false; 
}


Das Problem bleibt gleich, denn wird der Timestamp gesetzt:
time() - 10 >>> 1282401444

Und der Timestamp einen schlechten Zeitpunkt (genau im Übergang zur nächsten Sekunde) trifft wird folgender Timestamp nach der Umleitung geprüft:
time() - 10 >>> 1282401445

Und die Folge ist damit false ausgegeben wird.
 
Das Problem ist damit ich das ganze mit md5() verschlüsseln möchte. Ich kann also nicht die Zeit abfragen sodern nur den verschlüsselten Code und sobald ein Zeichen bzw microsekunde sich darin ändert, generiert es ein neuen Schlüssel.

So wie es aussieht muss ich mir da was neues überlegen ...
 
Wie wäre es so?
PHP:
$code =  md5( time() );
sleep(1); //1 Sekunde Warten
if( md5(time()) == $code || md5(time()-1) == $code ){
  echo 'gültig';
}
 
Wen du davon ausgehst, dass die Weiterleitung nicht länger als 3s dauert, prüfst du einfach noch die anderen Zeiten:

PHP:
## Code setzen
$key = 'irgend-ein-passwort-8782313';
$_SESSION['code'] = md5( time() . $key );


## Code prüfen
$stamp  = time();
if($_SESSION['code'] == md5( $stamp . $key || $_SESSION['code'] == md5( ($stamp - 1). $key || $_SESSION['code'] == md5( ($stamp - 2). $key ) {
  return true;
} else {
  return false;
}

somit kann die Weiterleitung 3s dauern. Dauert sie länger als 3s, wird false zurückgegeben.
 
Mit Sekunden, 1, 2 oder 3 wäre es egal aber mit Stunden ... 1 oder 2 Stunden ist doch ein erheblicher Unterschied. Da es ja nicht all zu oft vorkommt, kann ich mit dieser Lösung gut leben.

Falls doch noch jemand eine bessere Idee hat wäre ich euch sehr dankbar.
 
Zurück