Zugriffskontrolle für bestimmte Seite

QUEST08

Erfahrenes Mitglied
Hallo PHPler,

ich würde gerne bestimmte Seiten vor einem Zugriff schützen. Hierbei handelt es sich nicht um einen reinen "Mitgleiderbereich", da es um einzelne Seiten geht.

Gerne würde ich eingeloggten Nutzern verbieten wollen, zum Beispiel auf die Login-Seite zu kommen, oder zum Beispiel auf die Seite "Kennwort vergessen". Es gilt hierbei natürlich zu unterscheiden zwischen dem Zustand "eingeloggt" und "nicht eingeloggt". Dies stellt auch kein Problem dar, jedoch geht es mir hauptsächlich um die Performance:

Beispiel:
Ich binde auf jeder Seite ganz oben natürlich eine Datei ein (session.php) in der ich u.a. die aktuelle Session prüfe. Eingeloggte Nutzer haben ein erweitertes Menü usw.!

Wenn jetzt der Nutzer eingeloggt ist, möchte ich natürlich vermeiden, dass er auf die "kennwort-vergessen"-Seite gelangt (auch z.B. durch manuelle Eingabe).

Hierfür würde ich in der session.php eine weitere Prüfung einbauen a la
PHP:
$site = $_SERVER['PHP_SELF'];

if(isset($_SESSION['login_kd'])) {



} else {



};

Da müsste jetzt im Prinzip eine Art Blacklist rein (also die Dateinamen). Doch wie kann ich nun zum Beispiel diese ganze Liste durchlaufen? Erstelle ich ein Array als Liste und wenn ein Ergebnis ein Treffer war wird zur "Fehlerseite" weitergeleitet? Oder gibt es hier eine Lösung die etwas performanter ist? Hat jemand ein Beispiel in der Ecke liegen?
 
Wenn du den Status "eingeloggt" oder "nicht eingeloggt" sowieso mitführtst, dann kannst du doch diesen benützen um via "header-location" auf die Fehlerseite umzuleiten.

PHP:
if(isset($_SESSION['login_kd'])) { 
   header("Location: fehlerseite.php");
}

Das alleine reicht. Die Namen der betreffenden Seiten musst du nicht hinterlegen.
 
Ahhh stimmt! Du meinst also, dass ich den "Check" nicht in der globalen Datei session.php jedes mal abfrage, sondern in die jeweiligen dateien rein lege?!

Wen dem so ist, hab ich nur das Problem, dass ich keine Weiterleitung verursachen kann, da davor bereits HTML-Code ausgegeben wird. Habe die Seite unterteilt in u.a. "header.php" in dieser ist wird die "session.php" eingespielt (ganz am Anfang logischerweise). Wenn ich es also auf einzelne Seiten setzen würde, ginge das frühestens in der eigentlichen Datei, wobei hier bereits der header.php ausgegeben wurde.
 
Interessant. Noch nie gesehen ;-)

Jedoch ergibt sich auch hier das Problem, dass die session.php nicht gestartet wird, wenn ich die Ausgabe von header.php ersteinmal "zurückstelle", da die session.php in die header.php eingebunden wird. Aufbau einer Seite:

index.php
include von header.php

header.php (Meta-Angaben, etc.)
include von session.php

Theoretisch müsste die Abfrage in die index.php (geht jedoch nicht, da davor bereits die header.php eingelesen wurde. Stelle ich das einbinden der header.php ersteinmal mit den ob_*-Funktionen zurück, wird jedoch auch die session.php nicht aufgerufen (session.php wird in der header.php eingebunden), somit müsste ich die SESSION nochmals starten, was dann spätestens zu einem Problem wird, wenn ich die header.php ausgeben lasse.
 
Du stellst nicht den include zurück, du pufferst lediglich die Ausgabe des HTML zwischen. Der PHP-Code wird regulär abgearbeitet, alles was normalerweise zu einem bestimmten Zeitpunkt innerhalb des Codes ausgegeben wird, wird nicht ausgegeben sondern gepuffert. Das kann dann später mit ob_get_contents() abgeholt und mit echo ausgegeben werden.

Ungefähr so:

index.php
PHP:
<?php
ob_start();

echo "Hier ein toller Text<br/>";

include "a.php";

echo "und noch mehr text<br/>";
?>
Sogar das hier wird gepuffert<br/>
<?php
$out = ob_get_contents();
ob_end_clean();

echo "Jetzt wirds aber wirklich ausgegeben: $out";
?>

a.php
PHP:
<?php
session_start();

if($_SESSION['wahnsinnig_wichtige_session_variable'] != 1)
{
  echo "Na na na! Aber was solls, das wird eh nicht ausgegeben<br/>";
  header("Location: login.php");
}
?>

PHP:
<?php
session_start();

ob_start();

// Hier wird jetzt dann auch schon mal HTML-Code gebaut und ausgegeben - oder eigentlich nicht
mache_form_fuer_login();

if($_POST['login'])
{
  if(versuch_mal_den_login($_POST))
  {
    $_SESSION['wahnsinnig_wichtige_session_variable'] = 1;
  }
}

$html = ob_get_contents();
ob_end_clean();

echo $html;
?>

Das ganze nur exemplarisch zum verstehen ;-)
 
Vielen, vielen Dank! Das ist einfach perfekt! Misst, dadurch hätte ich mir ein wenig arbeit sparen können. Aber das kann ich ja noch umstellen :-)

Also nochmal, DANKE!
 
Zurück