![]() |
Безопасность функции unlink в PHP. Добрый день. Сделал вот такой тестовыйй пример: <?php $userDir="1/"; $myVar=$userDir.$_GET["file"]; unlink($myVar); ?> По идее он должен удалить из каталога 1 указанный файл. Но пользователь может ввести какую-нибудь пакость вроде вот этого: [url]http://localhost/3.php?file=../1.php[/url] тем самым удалив файл из другого каталога. Как от этого можно защититься? Пробовал вот так: <?php $userDir="1/"; $myVar=$userDir.str_replace("..","",$_GET["file"]); unlink($myVar); ?> |
В первую очередь, правильной установкой прав. Во вторую, введением авторизации в скрипте, подключаемом через требование ко всем остальным. Также можно контролировать вызовы своих подскриптов проверкой на дефайн, задаваемый в основном скрипте. Или проверкой специфической переменной в сессиях. Ну и, наконец, не позволять себе писать скрипты таким способом, требующим передачи важных параметров через get/post. |
Задавайте в конфиге полный путь к рут-папке данных, с которыми работаете, и все операции проводите, включая этот путь. |
делаю подстраховку примерно вот так: unlink("$userDir/$_GET[filename]".'.txt'); т.е. удалить можно только txt |
С помощью pathinfo() получить имя файла без пути и прицепить его к разрешенному пути. |
2-Фанат NASCAR > от души желаю пообщаться с миграцией такого сайта с константами абсолютных путей на другой хостинг) realpath для слабаков, да) |
Народ - Автор сам же и придумал ЗАЩИТУ! $myVar=$userDir.str_replace("..","",$_GET["file"]); Только вместо ".." надо поставить "/", тогда любой путь в $_GET будет восприниматься как имя файла. Получается так: $myVar=$userDir.str_replace("/","",$_GET["file"]); Вот и ВСЕ! :) |
5-droidman >что мешает изменить этот путь в одном месте в конфиге? |
Текущее время: 14:09. Часовой пояс GMT +3. |