К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Безопасность функции unlink в PHP.

Гость
0 - 22.04.2015 - 20:09
Добрый день.
Сделал вот такой тестовыйй пример:
<?php
$userDir="1/";
$myVar=$userDir.$_GET["file"];
unlink($myVar);
?>
По идее он должен удалить из каталога 1 указанный файл. Но пользователь может ввести какую-нибудь пакость вроде вот этого:
http://localhost/3.php?file=../1.php
тем самым удалив файл из другого каталога.
Как от этого можно защититься?
Пробовал вот так:
<?php
$userDir="1/";
$myVar=$userDir.str_replace("..","",$_GET["file"]);
unlink($myVar);
?>



Гость
1 - 23.04.2015 - 22:58
В первую очередь, правильной установкой прав. Во вторую, введением авторизации в скрипте, подключаемом через требование ко всем остальным.
Также можно контролировать вызовы своих подскриптов проверкой на дефайн, задаваемый в основном скрипте. Или проверкой специфической переменной в сессиях.
Ну и, наконец, не позволять себе писать скрипты таким способом, требующим передачи важных параметров через get/post.
Гость
2 - 23.04.2015 - 23:01
Задавайте в конфиге полный путь к рут-папке данных, с которыми работаете, и все операции проводите, включая этот путь.
Гость
3 - 25.04.2015 - 15:59
делаю подстраховку примерно вот так: unlink("$userDir/$_GET[filename]".'.txt');

т.е. удалить можно только txt
Гость
4 - 10.05.2015 - 00:34
С помощью pathinfo() получить имя файла без пути и прицепить его к разрешенному пути.
Гость
5 - 11.05.2015 - 08:14
2-Фанат NASCAR > от души желаю пообщаться с миграцией такого сайта с константами абсолютных путей на другой хостинг) realpath для слабаков, да)
Гость
6 - 11.05.2015 - 11:57
Народ - Автор сам же и придумал ЗАЩИТУ!
$myVar=$userDir.str_replace("..","",$_GET["file"]);

Только вместо ".." надо поставить "/", тогда любой путь в $_GET будет восприниматься как имя файла.
Получается так: $myVar=$userDir.str_replace("/","",$_GET["file"]);
Вот и ВСЕ! :)
Гость
7 - 12.05.2015 - 11:29
5-droidman >что мешает изменить этот путь в одном месте в конфиге?


К списку вопросов






Copyright ©, Все права защищены