Frage zur PHP-Sicherheit

du prüfst wahrscheinlich ob include==news ist..
das &abc ist dann ein neuer Ausdruck, der nichts mit Include zu tun hat..

Allerdings würde ich an deiner stelle auch nicht die zu includende Seite via url übergeben..
ich würde zb http://www.test.de/?include=1 machen und dann via switch case die zu includende Seite bestimmen oder includen ;)
1 = news
2 = Startseite etc..

Ist ne Nummer sicherer ;)
 
du prüfst wahrscheinlich ob include==news ist..
das &abc ist dann ein neuer Ausdruck, der nichts mit Include zu tun hat..

Allerdings würde ich an deiner stelle auch nicht die zu includende Seite via url übergeben..
ich würde zb http://www.test.de/?include=1 machen und dann via switch case die zu includende Seite bestimmen oder includen ;)
1 = news
2 = Startseite etc..

Ist ne Nummer sicherer ;)

Eine Whitelist ist das sicherste:
PHP:
switch ($_GET['include'])
{
  case "news":
  case 1:
    include('news.php');
    break;
  case "foo":
  case 2:
    include('foo.php');
    break;
  default:
    include('not_found.php');
    break;
}

Man kann sich auch eine relativ automatische Whitelist schaffen, sofern die einzubindenden Dateien einem Ordner unterliegen in dem selbst keine sensiblen Dateien sind:
PHP:
include('Ordner/' . basename($_GET['include']) . '.php');
 
Ich habe ne whitelist, ich zeigs einfach mal:

PHP:
if(!isset($_GET["page"])) { 

$page = "news"; 

} else { 


if(isset($_GET["page"])) {
$page = preg_replace( "/[^a-z0-9]/im", "", $_GET["page"]);
$page = stripslashes(strip_tags($page));
$page = trim($page);

}
 


$whitelist = array("news"); 

if (!empty($page) && in_array($page, $whitelist)) {

switch($page) { 

case "news": if(file_exists("./news/news.php")) { include("./news/news.php"); } break; 
default: if(file_exists("./news/news.php")) { include("./news/news.php"); }

}
  }else{
echo "Fehler, die Seite wurde nicht gefunden";
}
 
Na dann. Eine etwas schönere Formatierung des Codes dann passt's.

Löse mal folgendes:

Liste A:
Code:
news
kommentare
kontakt
impressum

Liste B:
Code:
news, news.php
kommentare, kommentare.php
kontakt, kontakt.php
impressum, impressum.php

1. Ist "news" in A und B? Wenn ja, welche Datei ergibt sich daraus?
2. Welche der beiden Listen hatte bei der vorherigen Aufgabe keine Relevanz?

Diese komplexe Beurteilung beruht auf diesen Zeilen von dir:
PHP:
$whitelist = array("news"); 

if (!empty($page) && in_array($page, $whitelist)) {

switch($page) { 

case "news": if(file_exists("./news/news.php")) { include("./news/news.php"); } break; 
default: if(file_exists("./news/news.php")) { include("./news/news.php"); }

}
  }

3. Wie verhält sich die Funktion [phpf]include[/phpf], wenn eine Datei nicht existiert?
4. Welche Prüfung geschieht demnach innerhalb der Funktion, bevor eine Datei eingebunden wird?
 
Zuletzt bearbeitet:
1. Es ergibt sich die Datei News.php
2. Liste A
3. ist noch nicht definiert
4. wenn page = news und datei existiert dann einbinden.
 
Schon Antworten und so schnell.

Zu 1:
Klar.

Zu 2:
Richtig. Die gesamte Prüfung von Liste A ist unnötig gewesen, was diesem Abschnitt entspricht:
PHP:
$whitelist = array("news"); 

if (!empty($page) && in_array($page, $whitelist)) {
Denn danach kommt die Prüfung von "Liste B", von der du nun weist das sie allein relevant ist:
PHP:
switch($page) { 

case "news": if(file_exists("./news/news.php")) { include("./news/news.php"); } break; 
default: if(file_exists("./news/news.php")) { include("./news/news.php"); }

}

Merkst du wie hier anscheinend etwas doppelt gemacht wurde? ;)

Zu 3:
Naja, "nicht definiert" würde ich nicht sagen. Es wird auf jeden Fall ein Fehler ausgegeben. Diesen möchtest du anscheinend auch unterdrücken:
PHP:
if(file_exists("./news/news.php")) { include("./news/news.php"); }

Zu 4:
Ne, da hast was missverstanden. Nimm das als Beispiel: include("foo.bar");. Überlege nun was intern in PHP passiert. Ich gebe dir einen Ansatz bei dem allerdings vorher und nachher noch was passiert, das du ergänzen kannst:
Code:
...
Leserechte für Datei "foo.bar" holen
Datei einlesen
Inhalt im Puffer bereit stellen
Inhalt ........

Tip: Die Funktion include gibt einen Fehlertext aus, wenn eine Datei nicht existiert.

Dann entdeckst du wieder etwas doppeltes, was man mit einem kleinen Trick (ein einziges Zeichen) verhindert - den zeige ich dir. Und wenn wir fertig sind ist dieser Codeabschnitt 4-mal so schnell wie vorher ;)
 
Also die Liste A ist eigentlich nicht überflüssig sondern wird nur zur "Fehlerbehandlung" benutzt, siehe Code oben.
Wenn "news" nicht gesetzt dann wird ausgegeben "Fehler Seite nicht gefunden".

Zu 4: Weiß ich nicht genau was du meinst, stehe gerade aufm Schlauch :)

:Edit: Was ich eigentlich primär Wissen wollte ist ob wenn ich eine variable einfach so an die URL anhänge z.b. index.php&page=news&var=sicherheit
ob das eine Sicherheitslücke wäre wenn Register Globals auf off stehen.
 
Zuletzt bearbeitet von einem Moderator:
Also die Liste A ist eigentlich nicht überflüssig sondern wird nur zur "Fehlerbehandlung" benutzt, siehe Code oben.

Ne, das ist schon doppelt. Wenn du darauf beharrst das es nicht so ist dann gibt es stattdessen einen toten Codeabschnitt.
Siehe das switch mal als dein Array an. Dort stehen die Einträge nochmal und wenn einer nicht gefunden wird, dann wird default aufgerufen, was der Meldung entsprechen könnte.

Andersherum wenn du so lassen willst, ist der default-Abschnitt toter Code. Im Array stehen alle Einträge und im switch. Es wird aber vorher schon abgefangen wenn ein Eintrag nicht existiert. Somit wird default, was dafür gedacht ist, nie erreicht.

Zu 4: Weiß ich nicht genau was du meinst, stehe gerade aufm Schlauch :)

Stell dir vor du bist PHP. Und jemand sagt dir: include('datei.bla');
Was machst du nun alles?
Reales Beispiel: Du arbeitest in einem Lager und jemand sagt dir: "Hole den Luftfilter 17801-21030".

:Edit: Was ich eigentlich primär Wissen wollte ist ob wenn ich eine variable einfach so an die URL anhänge z.b. index.php&page=news&var=sicherheit
ob das eine Sicherheitslücke wäre wenn Register Globals auf off stehen.

Das mit Register Globals hast bisher nicht gesagt. Aber es bleibt damit so sicher wie es bereits ist ;)
 
Nun wenn ich PHP wäre würde ich prüfen ob die Datei da ist und diese dann includen.

sprich file_exists ist nicht unbedingt nötig.

Worum es mir halt primär geht ob ich hier noch etwas an der Sicherheit verbessern kann.
 
Zurück