Привет У нас есть 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'] }