PHP-Nach Login folgende Seiten schützen?!

  • #1
W

william26

Aktives Mitglied
Themenersteller
Dabei seit
02.06.2004
Beiträge
38
Reaktionspunkte
0
Ort
Hamburg
Hi,

ich habe ein PHP-LoginScript geschrieben.
Für jeden User soll eine eigene kleine Oberfläche geschrieben werden!
Die angezeigten Daten sind vertraulich!!!

Wie kann ich die folgenden Seiten nach dem Login vor unerlaubten Zugriff schützen??

Login fragt eine PHP-Datei ab, die wiederum aus einer Passswortdatei die eingegebenen Daten abgleicht und dann auf eine Spezielle Startseite weiterleitet, die auch nochmal die Zugangsdaten abgleicht!
Nur dann kommt er durch!!

Für die Startseite kein Problem, nur für die Folgeseiten???
Die kann ich über den Browser immernoch direkt aufrufen!!
Ich muß wohl irgendwie die Variablen übergeben und erneut abfragen!!


ABER WIE????? :-\

Wäre genial wenn mir jemand helfen könnte!

danke!!
 
  • #2
Entweder du benutzt Sessions oder speicherst ein Cookie auf dem PC des Benutzers, der sich angemeldet hat. Dann musst du auf jeder Seite überprüfen, ob die Daten noch korrekt sind. Sind sie es nicht, wird die Seite nicht angezeigt.
 
  • #3
nimm Sessions

Nach dem (erfolgreichen) Login in den Sessions einen Merker setzen, z.B in PHP mit
$_SESSION['uid'] = <userid>

in jeder zu schützenden Seite diese Session Variable überprüfen.
 
  • #4
::) Session sollte die beste und einfachste Lösung dartellen.

Keine Ahnung ob die Login-Daten bei dir aus einer DB kommen, aber wenn du für jeden USER eine seperate Oberfläche willst, kannst du das mit den Session Variablen gut steuern.
z.B.

<?

if($_SESSION['login_ok']==ok) {
switch($_SESSION['uid']) {
case 1: require_once-><oberfläche für user 1>'; break;
case 2: require_once-><oberfläche für user 2>'; break;
default: require_once-><standart-oberfläche>';
}
}
else {
die(Raus hier! Du hast hier nichst verloren!);
}

?>

in den dateien für die verschiedenen Oberflächen fragst du dann nur noch am Anfang der Datei ab, ob der User berechtigt ist oder nicht. Evtl. kannst du Unberechtigte User direkt zur Registrierung weiterleiten.

z.B Für User Nr. 1
<?

if($_SESIION['uid'] != 1) header(Location:<zur registrierung.php>);

?>

Aber aufpassen mit dem header.
Da musst du evtl. Output Buffering benutzen.


Gruß

Conny
 
  • #5
Conny schrieb:
Aber aufpassen mit dem header.
Da musst du evtl. Output Buffering benutzen.

Warum? Ich glaube nicht, dass das stimmt.
 
  • #6
VoiD schrieb:
Warum? Ich glaube nicht, dass das stimmt.

;D
Probier mal das Script aus.
Zugegeben es ist wirklich in der einfachsten Form, macht aber sehr gut deutlich, was Output-Buffering bewirkt.
;D

Code:
<? #ob_start(); ?>
<table align=center width=600>
  <tr>
    <td width=100% colspan=2>
      <!-- Oberer Bereich z.b. Banner usw. -->
      <h1><?=$_GET['msg']; ?></h1>
   </td>
  </tr>
  <tr>
    <td width=180px align=left>
      <!-- Navigations Bereich mit Login-Box -->
      <form action=<?=$PHP_SELF; ?> method=post>
        <p>Benutzername</p>
        <p><input type=text value=<?=$_POST['user']; ?> name=user></p>
        <p><input type=submit value=Login name=login></p>
      </form> 
   </td>
   <td align=center width=420>
      <!-- 
         Content-Bereich
         in unserem Beispiel das Login
      -->
      <?
         if($_POST['login']) {
            if(ereg([0-9a-zA-Z],$_POST['user'])) {
               // Bei erfolgreichem Login kannst du den
               // User in den Member Bereich weiterleiten
               // Hier zum Testen allerdings wird die Seite erneut aufgrufen
               $msg = Hallo: . $_POST['user'];
               header(Location:.$PHP_SELF.?msg=.$msg);
            }
            
            else {
               echo <h2>Ich will deinen Namen wissen</h2>;
            }
         }
         else 
            echo <p>Zum testen Namen eingeben und GO klicken</p>
               .<p>Oder Textfeld leer lassen und GO klicken</p>;
      ?> 
   </td>
  </tr>
</table>
<? #ob_end_flush(); ?>

Hallo!!
Das funktioniert ja gar nicht.
Und jetzt entferne die Kommentarzeichen am Anfang und Ende des Scripts, damit die Output-Buffering aktiv wird.

Solltest du es nicht selbst ausprobieren können, melde dich nochmal und ich stelle dir ein Beispiel ins Netz.

::)mfg conny
 
  • #7
Ich gebe es zu, meine Aussage war etwas provokativ, aber was ich eigentlich sagen wollte war folgendes:

die
Code:
header(Location: <eine_andere_Seite.php>);
funktioniert immer dann, wenn der Server vorher noch keine HTML Daten an den Browser gesandt hat. Man kann also seine PHP Seiten so bauen, dass keinerlei Daten an den Client gesendet werden.

Dabei sollte man aber folgendes beachten:
Code:
<?PHP

.... hier steht dann der PHP Code

?>

Es kann vorkommen, dass die 1 Zeile (also noch VOR dem beginnenden PHP Tag als Leerzeile an den Browser gesandt wird, weswegen dann eine header() Anweisung schon scheitern kann.

Um auf Dein Beispiel einzugehen: du brauchst den ob_start() nur, weil Du vorher schon HTML Ausgaben an den Browser schicken würdest, und dann der header() Befehl fehlschlägt.

In meinen Augen ist dein Beispiell - verzeihe mir bitte die krasse Ausdrucksweise - ein Beispiel für nicht gelungene Programmierung, da Du den ob_start() einsetzen musst, obwohl es völlig unnötig ist.

Ich würde das Coding etwa folgendermaßen umstellen (ich hab'S jetzt nur vom Prinzip her umgestellt, ohne den von Dir vorgegebenen Inhalt 100%-tig zu übernehmen):

Code:
<?PHP


$msg = isset($_GET['msg']) ? $_GET['msg'] : ;

if($_POST['login']) {
  if(ereg([0-9a-zA-Z],$_POST['user'])) {
     // Bei erfolgreichem Login kannst du den
     // User in den Member Bereich weiterleiten
     // Hier zum Testen allerdings wird die Seite erneut aufgrufen
     $msg = Hallo: . $_POST['user'];
     header(Location:.$PHP_SELF.?msg=.$msg);
  }
  else {
  $msg = Dein Loginname ist ungültig;
  }
}

if(strlen($msg)>0) {
echo <h1>.$msg.</h1>;
}

?>

<form action=<?=$PHP_SELF; ?> method=post>
  <p>Benutzername</p>
  <p><input type=text value=<?=$_POST['user']; ?> name=user></p>
  <p><input type=submit value=Login name=login></p>
</form>

Ich habe auf meinen PHP Seiten die Bedingungen also immer so gestrickt, dass ich alles abprüfe und ggfs ein header(...) absenden kann, bevor eine HTML Ausgabe erfolgt un das klappt eigentlich auch ganz gut. Deshalb kann ich auf ob_start() vollständig verzichten. ;)

Gruß
VoiDy
 
  • #8
- ein Beispiel für nicht gelungene Programmierung -

Du kannst mir ruhig glauben, dass ich dieses Beispiel extra so konstruiert habe, damit auch wirklich deutlich wird, dass nix funktioniert wenn vorher schon irgendwelche Ausgaben anstanden.

Was viele (das weis ich aus eigener Erfahrung) allerdings übersehen, sind die includierten Dateien z.B JavaScript.

Da ich nun seit nunmehr 7 Jahren als Php-Programmierer arbeite und schon einigen Lehrlingen oder Praktikanten etwas beibringen musste, bin ich zu der Erkenntniss gekommen:

Erst einmal auf die einfachste Art erklären, dann sehen wir weiter.

Übrigens ist meine Hauptaufgabe Planung und Realisierung von Internetportalen. Glaube mir es kommt öfter vor als du vielleicht denkst, dass du den ob Befehl einsetzen musst.

Da william26, so wie es aussieht nicht so viel Ahnung von der Programmierung hat, wollte ich ihm eigentlich nur ein ganz grobes Beispiel geben.

:'( mfg Conny
 
  • #9
Wollte Dir nicht zu nahetreten. Tut mir leid. Nix für ungut.
 
  • #10
Einen hab ich aber noch!

Wen du mal mit Templates schaffst, und für jedes Template ( naja, nicht ganz jedes )
ne separtate PHP schreibst, dann kommst du mit deiner Version des Beispiels aber nicht weit!

Aber eigentlich ging es ja in diesem Thema nicht um uns!!!!

Gruß-Schluß

Conny

:DUnd steht im Januar noch das Korn, dann is es wohl vergesse worn! :D
 
Thema:

PHP-Nach Login folgende Seiten schützen?!

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben