2014-05-21 3 views
5

Dies ist mein Code in index.phpWie verhindere ich Remote-Dateieinschluss Angriff von PHP?

include ($_GET['page']); 

Actully muss ich Seite von url sind wie

"?page=go.php" 

auf der anderen Seite kann ich nicht

"?page=example.com" 

filtern als Für einige Fälle muss ich diesen Wert ebenfalls angeben. Dies ist jedoch eine Sicherheitsanfälligkeit durch Remote File Inclusion (RFI). Wie kann ich RFI-Angriffe von meiner Site aus verhindern? Ich tue so etwas wie

$filename = $_GET['page']; 
if (file_exists($filename)) { 
{ 
include ($_GET['page']); 
} 

Aber es filtert nur

"?page=go.php" 

diese Shorts auf der Seite. und ich bin mit

"?page=example.com" 

dieser Shorts von Seite gesaugt.

+0

warum konfigurieren Sie nicht eine Liste der zugänglichen Seiten, gegen die validiert werden soll? – konghou

+0

Ich kann eine Liste nicht so machen, weil es keine Beschränkung auf zugängliche Seiten gibt, Benutzer werden dort Links setzen, und ich werde einige Informationen davon holen. –

+0

Sie können eine Liste von zugänglichen Seiten mit Verzeichnis lesen Funktionen in PHP erstellen. – konghou

Antwort

1

Um ehrlich zu sein, ist Ihre Methode der Erstellung einer dynamic Website definitiv nicht der Weg zu gehen.

im Rahmen dieser Frage zu beantworten, würden Sie so etwas wie die folgenden Möglichkeiten:

Sie würden eine whitelist von Dateien einrichten, die ** ** erlaubt sind durch diese Funktion aufgenommen werden . Dies ist, wie Sie

die genannte Datei, bevor einschließlich
<?php 

$whitelist = array(
    'file1.php', 
    'file2.php', 
    'file3.php', 
    'file4.php', 
    'file5.php', 
); 

?> 

nun einen Scheck mit in_array()

<?php 

if(in_array($_GET['page'] . '.php', $whitelist) && file_exists($_GET['page'] . '.php')) { 
    include($_GET['page'] . '.php'); 
} 

?> 



gerannt:

, dass so etwas wie dies aussehen könnte kann sehen ist nicht sehr hübsch! Eine weitere Alternative wäre, etwas zu tun wie:

<?php 
    $file = strtolower($_GET['page']) . '.php'; 
    if(isset($whitelist[$file]) && file_exists($file)) { 
     include($_GET['page'] . '.php'); 
    } 

    ?> 
+0

Ich kann eine Liste nicht so machen, weil es keine Beschränkung auf zugängliche Seiten gibt, Benutzer werden dort Links setzen und ich werde einige Informationen daraus entnehmen. –

+1

@ user1487328 Dann müssen Sie Ihren Ansatz ernsthaft überdenken. – Darren

+1

@ user1487328 es muss einige Einschränkungen geben - was ist der Umfang dessen, was Sie versuchen zu tun? Was soll die Benutzer stoppen? go =/var/www/othersiteonsameserver/htdocs/secret.php'? – AD7six

4

Wenn ich die Frage richtig verstanden haben; Sie könnten ein Array-Setup mit ‚erlaubt‘ Seiten wie:

$allowedPages = array('go.php', 'stop.php', 'file.php'); 
    $filename = $_GET['page']; 

    if(in_array($filename, $allowedPages) && file_exists($filename)){ 
    include ($filename); 
    }else{ 
    //output error 
    } 
+0

Ich kann eine Liste nicht so machen, weil es keine Beschränkung auf zugängliche Seiten gibt, Benutzer werden dort Links setzen, und ich werde einige Informationen davon holen. –

+0

Nun, das würde ein massives Sicherheitsrisiko bedeuten, da es eine Benutzerliste ist, muss eine Whitelist sein - und die Benutzereingabe führt eine Datei aus, die sich auf Ihrem Server befindet. Sie können verstehen, dass eine Whitelist nicht alle möglichen Dinge über Ihre Website offenlegen kann. – PavKR

0

Akzeptieren Sie keine page.php Parameter, sondern nur der Name der Datei.

"?page=go" 

dann prüfen, ob $ _REQUEST [ "Seite"]

if (ctype_alnum($_REQUEST["page"])) 

alphanumerische ist und gibt einfach nicht nicht-alphanumerische Namen, um Ihre Dateien.

Dann tun, wenn file_exists auf $ _REQUEST ["page"] und Sie sollten ziemlich gut sein.

PS $ _REQUEST [ "page"] etwa gleich ist mit $ _GET [ "Seite"], es schneidet nur mit $ _POST

+0

Es schneidet standardmäßig auch $ _COOKIE. Es muss mit etwas Sorgfalt verwendet werden. – brunoais

0

Sie andere Domäne Urls Dateien statt Filterung filtern. Wenn der Parameter einen Hostnamen mit weniger als 3 Buchstaben enthält, ist es in Ordnung, da keine Domäne aus 2 Buchstaben besteht.

$tmp= parse_url ($_GET['page']); 
    if(strlen($tmp['host'])<3) 
    include($_GET['page']); 

Wenn es einige vertrauenswürdige Hosts gibt, können Sie diese ebenfalls validieren.

2

Ich glaube, diese Antwort zu spät ist, aber für diejenigen, die für dieses Problem suchen könnten, ich denke, es kann so gemacht werden, auch:

1.Define eine Konstante mit vollständigem Pfad.

2. Definieren Sie eine Whitelist der erlaubten Seiten.

3.Erhalten Sie die Variable $ _GET, und konvertieren Sie sie in Kleinbuchstaben.

4. Wenn die von der $ _GET-Variable zurückgegebene Seite in Ihrem White-List-Array enthalten ist, müssen Sie sie anfordern, andernfalls wird der Benutzer auf die Homepage umgeleitet und eine Fehlermeldung angezeigt.

<?php 
# this is abcd.php 
define('SITE','http://www.yoursite.com/'); 
$allow = [SITE.'1.php', SITE.'2.php', SITE.'3.php']; 
$get = strtolower(SITE.$_GET['page']); 

if(in_array($get,$allow)){ 
    include $get; 
} else { 
    header('Location: index.php?param=incorrect'); 
} 
?> 

<?php 
# this is index.php 
if(isset($_GET['param']) && $_GET['param'] == 'incorrect'){ 
?> 
    <script type="text/javascript"> 
     alert("INCORRECT PARAMETER PROVIDED"); 
    </script> 
<?php 
} else die('ERROR'); 

Ich bin nicht 100% sicher, dass dies ohne Probs funktioniert, aber ich denke, ist ein guter Anfang und man kann mit ihr spielen, um und herauszufinden, was für Sie geeignet ist.

Verwandte Themen