Включить безопасность file_exists - PullRequest
1 голос
/ 30 января 2009
/* define page path */
define("PAGE_DIR", "pages/");

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

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

Спасибо

Ответы [ 3 ]

6 голосов
/ 30 января 2009

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

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

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

2 голосов
/ 30 января 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'] для новой переменной и addlashes ().

1 голос
/ 30 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...