2012-11-29 5 views
5
$num = $_GET['fileid'];      // get file id 

$realfile = "filename".$num.'.txt'; 

Meine Frage ist, dass es immer noch möglich ist, das zu vergiften? . '. txt' am Ende verschwindet nicht mit Null-Byte-Injektion nach meinen Experimenten. Gibt es eine Möglichkeit, dies zu null Byte?php Null-Byte-Injektion?

+0

In Ext3/4 FS '\ 0' Zeichen werden nur entfernt –

+0

Ich würde alle Zweifel entfernen und einfach die Eingabe validieren; Verwenden Sie eine Whitelist, eine Regex, Casting zu Int oder was auch immer am besten passt. – jeroen

+0

% 00 --- http://ha.ckers.org/blog/20060914/php-vulnerable-to-null-byte-injection/ – user956584

Antwort

4

Ich glaube, dass Ihr Code für Directory Traversal Angriffe anfällig sein könnte - wenn jemand "/../../foo" als fileid bereitgestellt, dann wäre der Pfad "filename/../../foo.txt", die ein gültiges Ziel sein könnte. Siehe: http://en.wikipedia.org/wiki/Directory_traversal

ich mit @jeroen bin und @ shiplu.mokadd.im, die Ihre Eingabe schlägt Hygienisierung - fileid unter der Annahme ist eine Zahl, dann die intval() Funktion werden Sie tun, fein:

$num = $_GET['fileid']; 
$num = intval($num); 
if($num == 0) { 
    echo "Invalid file ID: Not a number."; 
    exit; 
} else { 
    $fileName = 'filename' . $num . '.txt'; 
    if(!file_exists($fileName)) { 
     echo "Invalid file ID: Doesn't exist."; 
    } else { 
     // do something 
    } 
}