Форум на Kuban.ru (http://forums.kuban.ru/)
-   Веб-дизайн и программирование (http://forums.kuban.ru/f1030/)
-   -   Безопасность функции unlink в PHP. (http://forums.kuban.ru/f1030/bezopasnost-_funkcii_unlink_v_php-6747371.html)

megabax 22.04.2015 20:09

Безопасность функции 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);
?>

fanatnascar 23.04.2015 22:58

В первую очередь, правильной установкой прав. Во вторую, введением авторизации в скрипте, подключаемом через требование ко всем остальным.
Также можно контролировать вызовы своих подскриптов проверкой на дефайн, задаваемый в основном скрипте. Или проверкой специфической переменной в сессиях.
Ну и, наконец, не позволять себе писать скрипты таким способом, требующим передачи важных параметров через get/post.

fanatnascar 23.04.2015 23:01

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

Dude 25.04.2015 15:59

делаю подстраховку примерно вот так: unlink("$userDir/$_GET[filename]".'.txt');

т.е. удалить можно только txt

buh 10.05.2015 00:34

С помощью pathinfo() получить имя файла без пути и прицепить его к разрешенному пути.

droidman 11.05.2015 08:14

2-Фанат NASCAR > от души желаю пообщаться с миграцией такого сайта с константами абсолютных путей на другой хостинг) realpath для слабаков, да)

SanekSp 11.05.2015 11:57

Народ - Автор сам же и придумал ЗАЩИТУ!
$myVar=$userDir.str_replace("..","",$_GET["file"]);

Только вместо ".." надо поставить "/", тогда любой путь в $_GET будет восприниматься как имя файла.
Получается так: $myVar=$userDir.str_replace("/","",$_GET["file"]);
Вот и ВСЕ! :)

fanatnascar 12.05.2015 11:29

5-droidman >что мешает изменить этот путь в одном месте в конфиге?


Текущее время: 19:40. Часовой пояс GMT +3.