Я искал везде, есть тонна регулярных выражений для http: // или www … URL, но ничего для ссылок, используемых внутри сервера.
В моем случае мне нужно санировать / проверять путь как:
/folder1/folder2/.../file.ext
так что например:
/img/<"?">/
/img/content/.../file.ext<script>alert("Script")</script>
не является действительным. Это означает, что допустимым является путь, начинающийся с «/», за которым следуют комбинации допустимого имени папки и «/», заканчивающиеся именем файла и расширением.
Встроенные в PHP FILTER_VALIDATE_URL или FILTER_SANITIZE_URL не принимают такой путь в качестве действительного URL. Так что я думаю, что я должен использовать регулярные выражения.
filter_var($url, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/ ... /"))))
Пожалуйста, может кто-нибудь из волшебников регулярных выражений поможет мне с этим. Спасибо.
Использование регулярных выражений для проверки таких вещей, как URI, адреса электронной почты и другие подобные сложные идентификаторы, является сложным предложением: вам нужно прочитать и от корки до корки понять спецификации для всех возможных задействованных систем; Следите за любыми изменениями во всех указанных системах; И обновляйте свой код до тех пор, пока он доступен в сети.
Короче говоря, это огромные инвестиции, и очень важно, чтобы вы продолжали.
Тем не менее, вы можете использовать FILTER_VALIDATE_URL
на этом, просто добавив file:
префикс протокола к URL.
php > $st = "file://home/test";
php > var_dump (filter_var ($st, FILTER_VALIDATE_URL));
string(16) "file://home/test"php > $st2 = "/home/test";
php > var_dump (filter_var ($st2, FILTER_VALIDATE_URL));
bool(false)
Как только это будет сделано, вы знаете, что данная строка соответствует допустимой схеме URL, которая описывает локальный файловый ресурс. Если это не так, вы можете сказать пользователю, что данный путь не является допустимым.
Затем вы можете проверить, является ли путь существующим и тот, к которому у пользователя есть доступ. Вы также можете добавить дополнительные ограничения на путь, чтобы избежать неизвестных проблем со специальными символами. В любом случае, всегда используйте соответствующие методы для выхода из целевой системы.
Что касается вашего предположительно неверного пути:
TMP $ Touch ‘<«?»>»
tmp $ ls -l
всего 0
-rw-rw-r— 1 христианин христианин 0 окт 25 15:52 <«?»>
Хороший пример того, почему всегда следует использовать экранирование выходных данных, кстати.
Других решений пока нет …