Добрый день.
Сделал вот такой тестовыйй пример:
<?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);
?>
Но тогда юзер не сможет удалить файл из своего каталога например такой: 111..txt
Есть еще способы защиты?
Нехрен пользователю вообще файлы видеть - пусть данные о его файлах хранятся в базе, а реальные файлы живут в одной директории с идентификатором записи в базе вместо имени.
Тогда пользователь можно что угодно делать со своими файлами, а удалятся будет только то, что нужно.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн