Antworten auf deine Fragen:
Neues Thema erstellen

Include absichern [PHP]

N

NdM_Art

Guest

Frohe Ostern, zusammen!
Die Website funktioniert z.zt wie folgt:
Man klickt auf einen Link: .../index.php?site=news?id=3
Dann hat das Script den Inhalt von site zu inhalt/news.php verarbeitet und als Überschrift "News" geschrieben. id war dann dafür da, z.b. die Nummer des RSS Feeds auszulesen. Ähnliche Technik für andere Seiten und Seiteninhalte.

Ich weiß, dass diese Methode unsicher ist. Ich suche nun nach einer besseren Möglichkeit includes zu benutzen, fragen. Ich möchte keine Frames benutzen und alle Seiteninhalte als Datenbank zu schreiben, ist für mich ebenfalls keine Option. (das liegt u.a. daran, dass ich auf einer Seite schon zwei verschachtelte Datenbanken benutze) Ein Array mit allen möglichen Dateinamen macht wenig Sinn, da muss ich bei jedem Updaten nachdenken, welche Seiten dazugekommen sind -.-

Wer kennt eine gute Möglichkeit?
Der Seitentitel soll weiterhin vom Dateinamen abgerufen werden.
 

Duddle

Posting-Frequenz: 14µHz

AW: Include absichern
PHP:
[/b]

Directory Traversal kannst du wie [URL="http://stackoverflow.com/a/4205182"]hier[/URL] bzw. [URL="http://stackoverflow.com/a/4205278"]hier[/URL] beschrieben verhindern.

Wenn du bestimmte Dateien vom include() ausschließen willst, musst du sie irgendwie kennzeichnen. Das führt dann letztlich zu einer Liste, die du aber nicht willst. Ansonsten musst du sie in ein Unterverzeichnis stecken und dieses separat schützen.


Duddle
 

m_c

Nicht mehr ganz neu hier

AW: Include absichern
PHP:
[/b]

Die Methode ist nur unsicher, wenn im Hintergrund keine Whitelist ist.
 
N

NdM_Art

Guest

AW: Include absichern
PHP:
[/b]

Danke :) Ah, der sucht nach reservierten Zeichen...!
Muss mich mal reinleen bzgl. den Rückgabewerten. 

@m_c: 
Meine Methode oder Duddle's Methode?
 
N

NdM_Art

Guest

AW: Include absichern
PHP:
[/b]

Ich hoffe, ich habe beim Einbauen die Logik richtig verstanden:
[QUOTE]
<?php 
      if( strpos($_GET['main'], '../') != false ||
      strpos($_GET['main'], "..\\") != false ||
      strpos($_GET['main'], '/..') != false ||
      strpos($_GET['main'], '\..') != false ||
      $_GET['main']!="" && $_GET['menu']!="" && 
      file_exists("content/".$_GET['menu']."/".$_GET['main'].".php"))      
      {
      include("content/".$_GET['menu']."/".$_GET['main'].".php");
      } 
      else {
      include("content/main/welcome.php");
      }  

?>
[/QUOTE]
 

Duddle

Posting-Frequenz: 14µHz

AW: Include absichern
PHP:
[/b]

Nein, die ersten vier Bedingungen zeigen ja gerade an, dass was ungewünschtes passiert. In deinem Code inkludierst du dann trotzdem. Du kannst die Bedingungen aber klammern und negieren. 
Ausserdem verbindest du die Bedingungen falsch untereinander. Der einzige erlaubte Fall ist, wenn die Variablen für main und menu nicht leer sind, die Datei existiert und die strpos()-Bedingungen nichts verdächtiges zeigen. Bei dir reicht es aber schon, wenn main und menu leer sind und die Datei existiert.


Duddle
 

Robbyn-

PHP / Flex Programmierer

AW: Include absichern
PHP:
[/b]

[quote="NdM_Art, post: 2151576"]Ich hoffe, ich habe beim Einbauen die Logik richtig verstanden:[/QUOTE]

Mache es doch wie folgt:

[php]
//Systemunabhängiger Seperator
define('SEP', DIRECTORY_SEPARATOR);
define('ROOT',	dirname(__FILE__).SEP);

$menu	=	filter_input(INPUT_GET, 'menu');
$menu	=	str_replace(array('_', '\\', '/', '.', "\0"), '', $menu);

$main	=	filter_input(INPUT_GET, 'main');
$main	=	str_replace(array('_', '\\', '/', '.', "\0"), '', $main);

if(is_file(ROOT.'content'.SEP.$menu.SEP.$main.'.php') === true)
{
	require ROOT.'content'.SEP.$menu.SEP.$main.'.php';
}

Dadurch umgehst du das Problem. Du nimmst den Schadcode aus der Variabel, bevor es zur Überprüfung kommt und somit zur Injection. Desweiteren immer is_file zur Überprüfung nehmen, dieser ist deutlich schneller als file_exists und zum Schluss eine Typen Kontrolle durchführen ( === true), was auch nochmal einen Performance Schub gibt.
 
Zuletzt bearbeitet:
N

NdM_Art

Guest

AW: Include absichern
PHP:
[/b]

[Quote]
Nein, die ersten vier Bedingungen zeigen ja gerade an, dass was ungewünschtes passiert. In deinem Code inkludierst du dann trotzdem. Du kannst die Bedingungen aber klammern und negieren. 
[/Quote]
Habe ich zuerst auch gedacht. Ich hab dann statt != false ; == false hingeschrieben. Dann hab ich das Script laufen lassen: Es funktionierte nix. Ich hab den Fehler nicht gefunden.

[Quote]
Ausserdem verbindest du die Bedingungen falsch untereinander. Der einzige erlaubte Fall ist, wenn die Variablen für main und menu nicht leer sind, die Datei existiert und die strpos()-Bedingungen nichts verdächtiges zeigen. Bei dir reicht es aber schon, wenn main und menu leer sind und die Datei existiert.
[/Quote]
Danke. Ich hab es gestern übersehen. ~.~
Also, kann ich die ersten vier Abfragen löschen? 
Oder muss ich alle Abfragen für main und für menu machen?

@Robbyn:
Danke! Ich probiers mal !
 
N

NdM_Art

Guest

AW: Include absichern
PHP:
[/b]

Robbyn, funktioniert leider nicht. Bei mir wird nichts angezeigt, egal ob menu und main beschrieben sind oder nicht. Ich kenne den Befehl filter_input() nicht, sonst könnt ich auf Fehlersuche gehen.
 

Robbyn-

PHP / Flex Programmierer

AW: Include absichern
PHP:
[/b]

Ich denke eher das es an der ROOT Konstante liegt. Bin ich mir aber nicht sicher.

filter_input() Filter die Input Werte und ist ab PHP Version 5.2 Verfügbar, siehe hier:
[url]http://php.net/manual/de/function.filter-input.php[/url]

Wenn ich es bei mir lokal teste, funktioniert es.
Was kommt den für ein Fehler oder was steht in den Variabeln $menu und $main, vielleicht ist da der Fehler oder eben die Konstante ROOT. Was hat diese Konstante für einen Wert, vielleicht zeigt sie auf das falsche Verzeichniss.
 

Duddle

Posting-Frequenz: 14µHz

AW: Include absichern
PHP:
[/b]

[QUOTE]Habe ich zuerst auch gedacht. Ich hab dann statt != false ; == false hingeschrieben.[/QUOTE]
Im verlinkten Script wird "!==" genutzt. Das ist das gleiche wie "!=", nur dass zusätzlich noch die Typen überprüft werden. 
Sowohl in deinem wie im verlinkten Script soll auf das Vorhandensein von unerlaubten Zeichen geprüft werden. Der Unterschied ist, bei dir gehst du im positiven Fall zum ersten include(), das andere Script geht dann zu einem "hier passiert was böses"-Block. Du musst deines also negieren.

[QUOTE]Also, kann ich die ersten vier Abfragen löschen?
Oder muss ich alle Abfragen für main und für menu machen?[/QUOTE]
Du musst nur richtig klammern und die Bedingungen verbinden. Ich splitte es mal für dich auf, damit du siehst was nach und nach passiert:
[PHP]
<?php
$gefunden1 = strpos($_GET['main'], '../') !== false;
$gefunden2 = strpos($_GET['main'], "..\\") !== false;
$gefunden3 = strpos($_GET['main'], '/..') !== false;
$gefunden4 = strpos($_GET['main'], '\..') !== false;
$mainNichtLeer = $_GET['main']!="";
$menuNichtLeer = $_GET['menu']!="";
$existiert = file_exists("content/".$_GET['menu']."/".$_GET['main'].".php");
?>
Im Moment sieht es bei dir so aus:
PHP:
<?php
if($gefunden1 || $gefunden2 || $gefunden3 || $gefunden4 || $mainNichtLeer && $menuNichtLeer && $existiert) {
 //okay
}
?>
Die ersten vier Bedingungen zeigen im positiven Fall einen Angriff an, also willst du die negieren:
PHP:
<?php
if(!($gefunden1 || $gefunden2 || $gefunden3 || $gefunden4) || $mainNichtLeer && $menuNichtLeer && $existiert) {
 //okay
}
?>
Jetzt reicht es aber schon aus, wenn die drei letzten Bedingungen okay sind, da sie mit ODER verbunden sind, also:
PHP:
<?php
if(!($gefunden1 || $gefunden2 || $gefunden3 || $gefunden4) && $mainNichtLeer && $menuNichtLeer && $existiert) {
 //okay
}
?>


Duddle
 

sunbrust

Noch nicht viel geschrieben

AW: Include absichern
PHP:
[/b]

Hallo, Leute,

ich habe eigentlich die gleiche Frage zum Thema include absichern.
Meine Navigation funktioniert genauso wie die von NdM_Art
Kann mir jemand von euch sagen, ob diese Art der Einbindung
sicher ist?
Ich meine eine 100%ige Sicherheit gibt es ja wahrscheinlich nicht.
Aber vielleicht könnt ihr den Code trotzdem mal beurteilen, bitte.
Ich bin noch Anfänger in php. 

Ich habe es so gemacht:

[code]

<?php

$files = array('file1'      => 'file1.html',
               'file2'      => 'file2.html',
               'file3 => 'file3.html');

if(!isset($_GET['nav']))
  $_GET['nav'] = 'file1';

if (array_key_exists($_GET['nav'], $files))
  include $files[$_GET['nav']];
else
  include $files['file1'];
?>
[/code]
 

Robbyn-

PHP / Flex Programmierer

AW: Include absichern
PHP:
[/b]

Sollte eigentlich sicher sein, eine Injection im Include Pfad ist hier ausgeschlossen.
 
N

NdM_Art

Guest

AW: Include absichern
PHP:
[/b]

[Quote]
Ich denke eher das es an der ROOT Konstante liegt. Bin ich mir aber nicht sicher.

filter_input() Filter die Input Werte und ist ab PHP Version 5.2 Verfügbar, siehe hier:
[url]http://php.net/manual/de/function.filter-input.php[/url]

Wenn ich es bei mir lokal teste, funktioniert es.
Was kommt den für ein Fehler oder was steht in den Variabeln $menu und $main, vielleicht ist da der Fehler oder eben die Konstante ROOT. Was hat diese Konstante für einen Wert, vielleicht zeigt sie auf das falsche Verzeichniss.
[/Quote]
Hmm das scheint an meinem lokalen zu liegen. Ich kann auf gut Glück mal auf dem richtigen Server probieren. Wohin ROOT genau zeigt, weiß ich leider nicht. Ich habs nie benutzt ...
[Quote]
Im verlinkten Script wird "!==" genutzt. Das ist das gleiche wie "!=", nur dass zusätzlich noch die Typen überprüft werden. 
[/Quote]
Interessant, das kannte ich auch noch nicht!

Ich habs nun so gemacht:

[Code]
        <?php 
        if(!(strpos($_GET['main'], '../') !== false ||
        strpos($_GET['main'], "..\\") !== false ||
        strpos($_GET['main'], '/..') !== false ||
        strpos($_GET['main'], '\..') !== false) &&
        $_GET['main']!="" && $_GET['menu']!="" && 
        file_exists("content/".$_GET['menu']."/".$_GET['main'].".php"))      
        {
        include("content/".$_GET['menu']."/".$_GET['main'].".php");
        } 
        else {
        include("content/main/welcome.php");
        }  
        ?>
[/Code]

kurzer Test hat funktioniert ^^ Ich hoffe die Logik ist jetzt so, wie du beschrieben hast. DANKE
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.612
Beiträge
1.538.343
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben