Я получил чужой код для системы, в которой отображаются папки с фотографиями в них в вашем браузере.PHP realpath не работает, чтобы предотвратить обход каталога
Например, это возможно гиперссылка на сайте:
gallery.php?action=view&folder=Cars
На данный момент, вы можете заменить «Тачки» с ../../../../../, который будет с радостью отображать корневую папку Linux. К счастью, веб-сайт в настоящий момент отключен.
Я попытался использовать realpath, чтобы исправить это. Вот что у меня есть до сих пор:
case 'view' :
$name = realpath(dirname(__FILE__) . "/Content/Gallery/" . $_GET['folder']);
echo $name;
$data = $file->getPictures($name);
require 'Views/Gallery.view.php';
break;
Я добавил эхо на третью строку, чтобы узнать, каким будет URL. В приведенном выше правиле все хорошо, и эхо-выходы это:
/var/www/Content/Gallery/Cars
Пока что так хорошо. Однако, если я вхожу в /../../../../../../../../ вместо «Cars», $ name становится /, и страница все еще показывает корневую папку. Английский не является моим первым языком, поэтому я мог бы не понимать, как работает realpath или что он делает. Из того, что я понял, он удаляет любой экземпляр ../ из заданного URL.
Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?
возможно дубликат [Предотвращение обходных в PHP, но позволяет пути] (http://stackoverflow.com/questions/4205141/prevent-directory-traversal-in-php-but-allow-paths) –
Вот почему PHP получает плохой рэп: \ –
@Mike почему? 'realpath()' не был предназначен для борьбы с атаками обхода каталога; и не претендует на это –