[PHP]Datei-include -> Sicherheitsproblem

F

freddymc

Hi!

Ich baue ein kleines Login Script in php. Das ganze wird mit sessions realisiert:
PHP:
session_start();
if(!session_is_registered('user') || $_SESSION['user'] == "") {
header("location:../index.php");
die;
}
Anstatt für jede Neue Funktion im System eine neue Datei anzulegen, will ich nur noch eine index.php, in der die session gestartet/geprüft wird, verwenden. Die ganzen anderen werden einfach nach Abfrage von $_GET entsprechend in index.php includet.

Nun tritt natürlich ein Sicherheitsproblem auf: Ich kann nun die versch. funktion.inc.php per URL aufrufen ohne mich eingeloggt zu haben...

Wie soll ich das jetzt lösen?
  • Verzeichnis per .htaccess sichern,
  • session-Start/Überprüfung nur in den includes,
  • session-Start/Überprüfung sowohl in den includes, als auch in der index.php,
  • session-Start/Überprüfung in einem eigenen include, welches in JEDER Datei per require_once eingebunden wird,
  • mein Ansatz ist Bullshit.

Sicherhreitstechnisch bin ich noch nicht so bewandert...
Hoffe ihr könnt mir hier weiterhelfen :)

Fred
 
Zum Rest kann ich nichts sagen, aber .htaccess wird kaum was bringen, da php meistens die dateien lokal und nicht per http bezieht.
 
php muss in dem Fall gar nichts beziehen.
Es geht nur darum, dass die includes nicht einfach über URL-Manipulation angezeigt werden können, d.h. dass man das include Verzeichnis per .htaccess schützt.

Auf die Includes darf nur von der index.php zugegriffen werden, nach dem session gestartet wurde etc.

Allerdings mag ich diese Lösung überhaupt nicht... Will lieber alles mit php machen.
 
Dann müssen die includes auch eigentlich nicht in einem von Apache ins Web gestelltem Verzeichniss sein. Kopier sie doch einfach sonstwohin auf die Platte.
 
Krasse Idee :devil:
Darauf bin ich noch nicht gekommen. Wusste gar nicht, dass man da noch drauf zugreifen kann...

Aber bei den meisten Hostern hab ich nur Zugriff auf das document verzeichnis...

Fred
 
ich mach das immer so :

ich hab ein formular zum einloggen . da aber noch keine Session.

Wenn der User sich eingeloggt hat dann startet erst die session

dann in allen includes prüfen ob es eine session gibt ,

PHP:
if (isset($_SESSION['user'])){
//hier kommt der inhalt des scriptes
}
else {
?>
<meta http-equiv="refresh" content="0; URL=./index.php">
<?php
}

du kannst auch noch in der index.php ne session variable setzen lasse um prüfen zu können ob einer direkt oder über die index.php aufruft.

htaccess ist sinnvoll um die scripte davor zu schützen wenn mal php auf dem server ausfällt. sonst kann die einer downloaden und du guckst etwas doof.

Gruß SOno
 
aha, ok, also in jede Datei die session-prüfung...
Wo startest du die Session? In der index.php oder in den Includes?
Weil, mehr als einmal kann man die session ja nicht starten oder?

Danke schonmal,
Fred
 
ich hätte es so gemacht:
in der index.php definiere ich eine beliebeige konstandte, beispielsweise
Code:
define("INSCRIPT",true);

in den dateien, die ich per include einbinde, überprüfe ich, ob diese konstante definiert ist:
Code:
if ( !defined("INSCRIPT")){ die("ruf mal lieber die index.php auf ;) "); }
 
Ok, danke.
Hört sich auch nicht übel an. Für den Anfang werde ich jetzt mal so arbeiten, aber eine session Lösung fände ich am komfortabelsten
 
Die Session wird nur einmal in der index gestartet.

du bindest dann alles über diese index.php ein.

Ein Script das direkt aufgreufen wird , hat keine Session und wird somit nichts ausgeben da sieht man dan gar nichts sondern wird direkt wieder an den anfang befördert dank dem meta refresh.

Weisch was ich meine.
 
Bei mir steht einfach in jeder Datei (die nur eingebunden werden darf):

PHP:
if (!eregi("blabla.php", $_SERVER['PHP_SELF']))
    die("Diese Datei darf nicht direkt aufgerufen werden!");

blabla.php ist natürlich die Datei, über die alles läuft.

Gruß, Flash
 
hallo,
kam gerade über google rein und fand die idee gut aber der code hat fehler - so funktioniert's:
Code:
if (eregi("blabla.php", $_SERVER['PHP_SELF'])) 
{
    die("Diese Datei darf nicht direkt aufgerufen werden!"); 
}
 
Nun, das hängt von der Art der Implementierung ab.
PHP:
if (eregi("blabla.php", $_SERVER['PHP_SELF'])) die([...]);
hier wird abgebrochen, sollte 'blabla.php' in der URL sein. blabla.php muss hier die zu schützende Datei sein. Ist meines Erachtens nicht gleich sicher, wie untere Methode.

PHP:
if (!eregi("blabla.php", $_SERVER['PHP_SELF'])) die([...]);
hier wird abgebrochen, sollte 'blabla.php' NICHT in der URl sein. So war das in meinem Post auch bewusst angegeben.
blabla.php ist hier die Datei, über die zu schützende Datei eingebunden wird.
 

Ähnliche Themen

Problem mit SESSION

Problem mit Apache2 + MySQL Server

CGI laesst sich nicht ausfuehren

Zurück
Oben