PHP sessions

selberbauer

Captain
Registriert
Juni 2009
Beiträge
3.604
Hallo,
ich möchte über eine Login Maske, bei Erfolg, auf den geheimen Bereich meiner Seite weitergeleitet werden. Dazu möchte ich sessions bzw. cookies verwenden. Das Problem ist allerdings, dass der geheime Bereich für Unbekannte trotzdem zugänglich ist und man so einfach das Login überspringen könnte:

login.php
PHP:
<?php
session_cache_expire(10); // setzt den Session Verfall auf 10min.. funktioniert auch nicht
session_start();
$_SESSION['state'] = FALSE;
$_SESSION['time']  = date('m.d.Y H:i:s');
$_SESSION['key'] = hash('SHA512', 'foo'.$_SERVER['HTTP_USER_AGENT'].'bar');

if(isset($_POST['user'], $_POST['pass'])) {
       // MySQL Teil
       // Verbindung wird aufgebaut und mittels prepared statement
      // Benutzer und Hash abgefragt und dann die Reihen ausgezählt
      // Wenn eine Reihe herauskommt stimmt passwort und Benutzer
	if($rows == 1) {
		$_SESSION['state'] = TRUE;
		header('secret.php');
	}
}
?>
<html>...

secret.php
PHP:
<?php
if($_SESSION['state'] = FALSE OR $_SESSION['key'] != hash('SHA512', 'foo'.$_SERVER['HTTP_USER_AGENT'].'bar')) {
    header('login.php);
    exit();
}
?>
<html>....
 
Hast du die Frage vergessen oder war das Absicht?

Das Einzige was mir so ganz ohne Frage auffällt ist dieser Teil:

Code:
if($_SESSION['state'] = FALSE

Hier machst du eine Zuweisung, das sollte vermutlich == sein, oder?
 
Das Problem ist allerdings, dass der geheime Bereich für Unbekannte trotzdem zugänglich ist und man so einfach das Login überspringen könnte:
=> Geht nicht

Hier machst du eine Zuweisung, das sollte vermutlich == sein, oder?
Stimmt, korrigiert, es scheint aber irgendwas von der Semantik her falsch zu sein, da ich trotzdem ohne Login auf "secret.php" zugreifen kann.
 
Ich benutze das hier für eine Passwort abfrage. Wichtig das script muss ganz oben stehen.

PHP:
<?php
//Benutzername und Passwort für die Authentifizierung
$benutzername = 'user';
$passwort = 'pw';

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || ($_SERVER['PHP_AUTH_USER'] != $benutzername) || ($_SERVER['PHP_AUTH_PW'] != $passwort)) {
//Zugangsdaten falsch, Authentifizierungs-Header sende.
header('HHTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Sicherheitszone" ');
exit('Du kommst hier nicht rein!');
//hier darfst du nichts mehr reinpacken!
?>

hier nach kann wieder html stehen
<header>
<div>

oder ein neues script

<?php
?>
 
Habe den Fehler gefunden.
Habe das vergessen:
header('Location: secret.php');

Danke für eure Hilfen.
@musterman
Wie hast du deinen Auto-Rauswurf umgesetzt?
Man kann das ja mit "session_cache_expire(10);" machen (funzt bei mir aber nicht ^^) oder in dem man die Anmeldezeit kontrolliert (Anmeldezeit + 10min = Zeit jetzt => Rauswurf) wie macht man sowas syntaktisch?
 
Also dieses Script kommt einfach in deine GeheimeSeite.php, bloß ganz oben. Dieses Script sendet erstmal nur einen Header (nicht der von html) sonst nichts, obwohl dort ja nach diesem script mehr drinne steht erst wen du das richtige Passwort eingibst wird alles weiter gesendet. Falsches Passwort bricht alles ab (der exit() Befehl). War das deine Frage?

Auto rauswurf warum willst du dich selber nach 10 min rausschmeissen?
 
Weil man auto. immer ausgelogt wird aus Sicherheitsgründen.
Siehe Computerbase :)
 
Zurück
Oben