#php
#php
Вопрос:
Я пытаюсь проверить, существует ли экземпляр имени файла (несмотря на его расширение), а затем удалить его. Вот что у меня не работает…
$username = $_POST["data"]["username"];
$mask = '../../files/' . $username . '.*';
if (file_exists($mask))
{
unlink ($mask);
}
Может кто-нибудь, пожалуйста, скажите мне, что я делаю не так? Я знаю, что первая строка правильная, потому что она правильно используется с другими командами. Просто не уверен насчет остального. Использование PHP 5.2
Комментарии:
1. Было бы разумно
$username
сначала очистить;basename($username)
это было бы началом избавления от разделителей каталогов.
Ответ №1:
Попробуйте:
$mask = "../../files/".str_replace("/","",$username).".*";
$glob = glob($mask);
if( $glob amp;amp; count($glob) == 1) {
unlink($glob[0]);
}
Это начинается с того, что ваш код становится немного безопаснее, поэтому злоумышленник не может просто удалить все, что ему нравится. Он также отказывается удалять материал, если есть более одного совпадающего файла. Отрегулируйте по мере необходимости.
Однако злоумышленник все равно может использовать ваш код для удаления… ну, чей угодно профиль. Возможно, вы захотите защититься от этого должным образом 😉
Комментарии:
1. Примечание: Если glob возвращает
false
, он по-прежнему подсчитывается и совпадает с1
, поэтому его лучше использоватьempty
2. @RahilWazir Упс, хороший улов. Спасибо!
3. Было бы неплохо, если
str_replace()
бы он также решал разделители каталогов Windows.4. @user2284703 Это для того, чтобы кто-то не мог ввести имя пользователя, подобное
../../../etc/whatever
.5. То, что он скрыт, не означает, что он безопасен. Если он вообще доступен где угодно , то злоумышленник может злоупотребить им.