Включить безопасность file_exists

/* define page path */
define("PAGE_DIR", "pages/");

if (file_exists(PAGE_DIR."$_GET[page].php")) include(PAGE_DIR."$_GET[page].php");

Насколько это безопасно? Не могли бы вы, например, включить страницу на другом веб-сервере, если страница находится в папке с именем pages?

Спасибо


person Community    schedule 29.01.2009    source источник


Ответы (3)


Это совсем небезопасно. Подумайте, что произойдет, если $_GET[page] содержит ../../../somewhere/else/.

У вас должен быть явно указан список разрешенных страниц.

Редактировать: я не думаю, что он может включать файл с другого сервера, но это все равно не очень хорошо.

person Greg    schedule 29.01.2009

Никогда не рекомендуется передавать недезинфицированный пользовательский ввод непосредственно в команду, особенно что-то вроде include(). Вы не обязательно знаете, как базовый веб-сервер/ОС будет обрабатывать, например, относительные пути, расширенные символы и т. д. Любой из них, используемый злонамеренно или иным образом, может привести к тому, что пользователь увидит то, что он не должен видеть. видеть.

Один из возможных эксплойтов: пользователь передает относительный путь к вредоносному скрипту в известном месте на сервере. http://webserver/yourscript.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2fhome/bad_user/evil_script

которые ваша функция может перевести на страницы/../../../home/bad_user/evil_script.php, которые иногда будут включаться с удовольствием. Таким образом, ваша веб-страница при обслуживании может очень хорошо выполнять php-скрипт bad_user, который он может использовать для выполнения всевозможных неприятных вещей.

По крайней мере, вы должны присвоить $_GET['path'] новой переменной и добавить слэши().

person glomad    schedule 29.01.2009
comment
использование addlashes() ничего не сделает с путем unix, например ../../foo.php. addlashes() предназначен только для экранирования строк, используемых для запросов к базе данных, поэтому он ставит косую черту перед кавычками и обратной косой чертой. - person Chris Kite; 04.02.2009

Выполнение каких-либо действий с помощью $_GET или $_POST до проверки/очистки данных опасно. Предположим, что все пользователи хотят вас достать, и очистите данные перед их использованием.

person Sampson    schedule 29.01.2009