php-include-datei aus geschütztem Verzeichnis einbinden

Moin, Moin,

Da HTML ein verbindungsloses Protokoll ist, musst Du ja trotzdem Deine Daten irgendwie auf die nächste "Seite" hieven. Dabei unterstützt Dich die sog. Session. Zu Sessions lässt sich 'ne Menge sagen, aber ich will's mal kurz machen: Du solltest nach Möglichkeit Sessions nur per Cookie zulassen, anderenfalls besteht die Gefahr, dass Dir u.U. einer Deine Session "klaut". Um das etwas sicherer zu machen, kann man z.B. die Session auch gegen die IP prüfen. Aber der Aufwand wird dann halt immer größer.
Du könntest eigentlich nur dann ohne Sessions arbeiten, wenn Du die relevanten Daten wie Variablen usw. als Parameter in die URI packst und dann mit $_GET auf einer (Folge-)Seite wieder ausliest => viel zu aufwändig, zumal die Anzahl der Zeichen auch begrenzt ist (schlag mich tot, aber ich komm jetzt nicht auf die Größe - 256, 512, 1024?)
Die Session selber startest Du mit
PHP:
session_start();
Danach könnte es wie folgt weitergehen:
PHP:
$_SESSION['LoggedIn']=isset($_SESSION['LoggedIn']) ? $_SESSION['LoggedIn'] : false;
if(isset($_POST['senden'])) { // "Formular-Button name="senden" gedrückt?
   // Der Name für die Formfelder sei u_user und u_passwd
   if($_POST['u_user']=="xxx" && $_POST['u_passwd']=="xyz") {
     $_SESSION['LoggedIn']=true;
   }
}
if($_SESSION['LoggedIn']===false) {
   include("admin/login.php");
}
Auf den folgenden Seiten arbeitest Du dann nur noch mit dem bool'schen Wert von $_SESSION['LoggedIn']
PHP:
if($_SESSION['LoggedIn']===true) {
   include("admin/index.php");
} else {
   // Tu irgendwas anderes
}
Bei einem Logout haust Du entweder die ganze Variable raus (dann solltest Du aber auch auf isset() prüfen, da Dein errorlog sonst rapide anwächst wg. "undefined index"):
PHP:
unset($_SESSION['LoggedIn']);
oder
PHP:
$_SESSION['LoggedIn']=false;

Wenn Du verhindern möchtest, dass irgendjemand Deine Dateien aus dem admin-Ordner direkt über die URL aufruft (.htaccess):
Code:
# Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule admin /index.php [R=301,L]
Hier wird einfach auf die Startseite zurückgelenkt (so sie denn index.php heißt und natürlich das Wichtigste: Dein Server rewrite unterstützt)

Falls ich mich oder etwas an irgend 'ner Stelle wiederholt habe: sorry!

Greetz
cw
 
Zuletzt bearbeitet:
Da HTML ein verbindungsloses Protokoll ist, [...]
HTML ist kein Protokoll, es ist eine (Auszeichnungs-)Sprache für Webinhalte! Ausserdem wäre es nicht verbindungslos, da es über TCP läuft.

Der Punkt ist eher, dass HTTP (das Protokoll hinter HTML) selbst keine Sitzungen anbietet und du hier auf ein Sitzungsmanagement (z.B. von PHP) zurückgreifen musst.
Weitere Informationen hier oder hier.

[...]Du solltest nach Möglichkeit Sessions nur per Cookie zulassen, anderenfalls besteht die Gefahr, dass Dir u.U. einer Deine Session "klaut". [...]
Falsch, Cookies schützen keineswegs gegen Diebstahl. Vor kurzem hat das zum Beispiel das Tool Firesheep anschaulich und einfach demonstriert. Ob du die Session-ID nun per Cookie oder per URL übergibst ist vom Sicherheits-Standpunkt aus unerheblich, erstes sieht aber besser aus und ist leichter zu handhaben.


[...]als Parameter in die URI packst und dann mit $_GET auf einer (Folge-)Seite wieder ausliest => viel zu aufwändig, zumal die Anzahl der Zeichen auch begrenzt ist (schlag mich tot, aber ich komm jetzt nicht auf die Größe - 256, 512, 1024?)[...]
Die Länge der URL ist vom Standard her nicht begrenzt, hier kommt es auf den verwendeten Webserver und den Browser an. Hierbei sind URLs bis 1000 Zeichen meist problemlos möglich. Ob diese dann "schön" oder angemessen sind muss jeder selbst beurteilen.

@chickenwing: Ansonsten ein guter Crash-Kurs zu Sessions. :)

Gruß
BK
 
Zuletzt bearbeitet:
Moin BK,

zu 1) sorry, das war mein Fauxpas, ich meinte auch http. "Verbindungslos" sollte auch nicht physikalisch im Sinne einer "Verbindung" wie z.B. beim Telefon oder im Netzwerk zu verstehen sein. Ich meinte eher im bildlichen Sinn die eine Seite zur nächsten (dennoch im Sinne der Beschreibung bei Wikipedia):
[...] ]HTTP ist ein zustandsloses Protokoll. Ein zuverlässiges Mitführen von Sitzungsdaten kann erst auf der Anwendungsschicht durch eine Sitzung über eine Session-ID implementiert werden. [...]
http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol
Aber so differenziert wollte ich das Thema gar nicht anschneiden, sondern nur sehr grob erläutern, wieso und wofür es überhaupt Sessions gibt. "Zustandslos" wäre aber zweifellos die korrektere Wahl.

zu 2) Da möchte ich Dir ein wenig (aber nicht gänzlich) widersprechen (den Text hatte ich nachträglich aus meinem Post entfernt, weil's dann einfach zuviel Text wurde): Ich habe genug Besucher auf meinen Seiten gehabt, die mir Links inklusive der SID geschickt haben. Wenn die Session noch nicht verfallen ist, dann hätte ich ohne Mühe mit ihren Daten weiterarbeiten können. Ich habe mir den Mund fusselig geredet, dass sie die SID aus der URL entfernen, wenn sie Links weiterschicken.
Zitat PHP Benutzerhandbuch, Anhang CXLIX:
Sessions und Sicherheit
[...]
Wenn Sie z.B. Benutzer vor einfachen Social Engineering Tactics (Anm. des Übersetzers: Techniken der Ausnutzung menschlicher Schwächen) schützen wollen, müssen Sie session.use_only_cookies aktivieren.
[...]
Es gibt mehrere Wege, über die eine Session-ID an Dritte gelangen kann. Eine entführte Session-ID ermöglicht diesen, auf alle Daten zuzugreifen, die mit dieser Session-ID verbunden sind. Erstens sind das URLs, die Session-IDs enthalten. Wenn Sie auf eine externe Site verweisen, könnte die URL inklusive Session-ID in den Referrer-Logs der externen Site gespeichert werden. Zweitens kann ein aktiverer Angreifer Ihren Netzwerkverkehr abhören. Falls Ihr Netzwerkverkehr nicht verschlüsselt ist, werden Session-IDs im Klartext über das Netzwerk übertragen.
Womit Cookies nicht nur wegen der Optik zu bevorzugen wären... Wenn ich dahingehend verstanden worden bin, dass man mit Cookies auf "der sicheren Seite" sei, dann hab ich das zu kurz formuliert. Gemäß meinem Motto: "Im Web bist Du nie wirklich auf der sicheren Seite" würde ich solche Aussagen auch gar nicht treffen wollen. Die beste Wegfahrsperre schützt auch nicht vor dem Autoklau. Man kann es den Leuten nur möglichst schwerer machen, damit sie vor allem "die Zeit (und Lust)" verlieren, um sich lieber (so bitter das ist) "einfachere Opfer" zu suchen.

Zu 3) Hast Du natürlich Recht. Im Netz kursieren viele Faustregeln, einige sagen 250 Zeichen (und /oder ab dann sollte man POST einsetzen), andere mit 1000, wieder andere, wenn die URL nicht mehr "menschenlesbar" ist. Aber per Definition ist es nicht begrenzt, eher von den Browsern oder Proxies. Bleibt übrig: Nichts Genaues weiß man nicht ;-)

Zu 4) Danke für das Lob. Ich werde mal (hoffentlich) versuchen, in Zukunft meine manchmal "schludrige" Ausdrucksweise etwas zu bändigen.

Greetz
cw
 
Zurück