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

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

Moje pytanie brzmi: czy nadal jest możliwe zatrucie to? ". txt" na końcu nie znika przy iniekcji z pustym bajtem, zgodnie z moimi doświadczeniami. Czy istnieje sposób na anulowanie tego?Zastrzyk bajtów php null?

+0

ext3/4 Znaki FS '\ 0' są po prostu usunięte –

+0

Chciałbym usunąć wszystkie wątpliwości i po prostu sprawdzić poprawność danych wejściowych; używanie białej listy, używanie wyrażeń regularnych, odlewanie do int lub cokolwiek innego jest najlepsze. – jeroen

+0

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

Odpowiedz

4

Wierzę, że Twój kod może być podatny na ataki typu directory traversal - jeśli ktoś podał "/../../foo" jako fileid, ścieżka byłaby "filename/../../foo.txt", która może być prawidłowym celem. Zobacz: http://en.wikipedia.org/wiki/Directory_traversal

jestem z @jeroen i @ shiplu.mokadd.im który sugeruje odkażania swój wkład - zakładając fileid jest liczbą to funkcja intval() zrobi ci dobrze:

$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 
    } 
}