Я не уверен, поможет ли ваше регулярное выражение действительно: вне этого диапазона есть допустимые символы, которые вы не сможете удалить таким способом.
Одна вещь, которую я бы сделал, это сделать realpath()
на полном окончательном пути и проверьте, является ли он дочерним по отношению к разрешенному пути к файлу.Это предотвратит атаки с обходом каталога ../../
, даже если они используют некоторые специальные символы.Это уже должно обеспечить довольно хорошую безопасность.
Вы также можете дополнительно просканировать каталог, используя glob()
, и проверить результаты, чтобы увидеть, действительно ли там находится запрошенный файл (который невозможно обойти даже при самом скрытом).Обратный путь в каталогах.)
Если вы хотите быть абсолютно параноиком , вы можете использовать совсем другой подход: не передавать имена файлов, а перечислять индексы списка, который вы указалидо.Например, если вы показываете этот список пользователю и сохраняете его во временном текстовом файле или записи базы данных:
- Readme.txt
- Лицензия
- Readme.doc
и затем передайте только (случайный) идентификатор текстового файла или записи базы данных и номер файла, который вы хотите удалить:
delete.php?list=xasdafdas&index=3
у вас должно бытьрешение, которое довольно неуязвимо против любого мыслимого вида инъекций и взлома имен файлов.
Вы должны хранить индивидуальный список для каждого запроса, так как файлы могут измениться.