проблема обхода каталога php

Привет У нас есть PHP-код, использующий функцию file_get_contents (), и я понимаю, что это уязвимо для атак с перенаправлением directcoty. Учитывая следующий код:

$mydata=$_GET['thefile']; $data = file_get_contents ('/var/html'.$file); echo $data 

Как я могу выполнить некоторую простую фильтрацию ввода, чтобы я мог блокировать вероятность того, что кто-то может сделать переезд каталога, играя с моим вводом?

/МИСТЕР

Вы хотите basename :

 $mydata = basename(realpath($_GET['thefile'])); 

К вашему примеру добавлены (небольшие изменения):

 $file=$_GET['thefile']; $mypath='/var/www/'; $location= basename(realpath($mypath.$file)); $data = file_get_contents($location); echo $data; 

Примечание … хотя это делает некоторый уровень проверки ошибок, он не обрабатывает ошибки. Я оставлю это до вас.

Если $_GET['thefile'] не будет использовать такие папки, как «images / fileX.jpg», вы можете использовать basename ()

 $filename = basename($_GET['thefile']); readfile('/var/html/'.$filename); 

Когда «../../passwords.txt» задается как $_GET['thefile'] он будет преобразован в basename в 'passwords.txt'.
Добавление realpath() внутри базового имени не добавляет никакой безопасности.

Если ваш скрипт нуждается в поддержке подкаталогов, используйте realpath (), чтобы определить, находится ли он в каталоге «/ var / html».

 $baseDir = realpath('/var/html/'); // (mayby /var/html is a symlink) $baseDirLength = strlen($baseDir); $filepath = realpath('/var/html/'.$_GET['thefile']); if (substr($filepath, 0, $baseDirLength) == $baseDir) { // Even when all the '../' in the thefile are resolved // the path is within the $baseDir } else { // invalid $_GET['thefile'] }