Предыдущие ответы (включая принятый) адрес глубины пути, но не обход пути.Так как в вопросе конкретно упоминалось, что это для безопасности, то случайной проверки, такой как описанная до сих пор, может быть недостаточно.
Например,
- Вы заботитесь о прохождении через жесткийили программные ссылки под текущим рабочим каталогом?
- Поддерживает ли система, в которой вы работаете (или потенциально можете развернуть), юникод?
- Сколько вещей оценивает данную строку до или после вашейPHP код видит это?Веб-сервер?Оболочка?Что-то еще?
Предположим, я отправил вашему сценарию строку вроде ./..%2f../
?Для вашего приложения важно, чтобы эта строка подняла меня на два уровня?Или что сценарии, представленные в других ответах, не поймут это, потому что оно не оценивается как ..
?
А как насчет ./\.\./
?Если путь анализируется путем разделения на \
и /
, сценарий в принятом ответе не поймает его, потому что каждая часть будет выглядеть как .
, который является просто текущим каталогом.Но типичная оболочка UNIX рассматривает \
как escape-символ, поэтому его передача ./\.\./
эквивалентна ./../
, и поэтому злоумышленник может использовать тот факт, что сценарий объединяет тесты для путей в стиле UNIX и Windows.
Если под «безопасностью» вы действительно подразумеваете, что хотите обеспечить защиту от случайных ошибок и опечаток, тогда других ответов, вероятно, достаточно.Если вы программируете для враждебной среды и хотите предотвратить преднамеренные атаки, направленные на нарушения, тогда они едва ли выцарапывают поверхность, и вам будет рекомендовано ознакомиться с безопасным программированием в OWASP.Я бы начал с их статей о Path Traversal , а затем прочитал о других атаках, которые они описали, а также о том, как их избежать и, что более важно, как их проверить.