Рассмотрим следующую проблему безопасности:
У меня есть статический базовый путь (/home/username/
), к которому я добавляю контролируемый пользователем подпуть (скажем, foo/bar.txt
). Содержимое этого файла затем читается и представляется пользователю.
В описанном случае полный путь будет: /home/username/foo/bar.txt
Теперь к проблеме. Я хочу контролировать, чтобы полный путь всегда был подкаталогом статического базового пути. Другими словами, я не хочу, чтобы пользователь указывал путь так, чтобы базовый путь был экранирован.
Следующий полный путь в порядке:
/home/username/foo/bar.txt
Принимая во внимание, что этот один явно не безопасен:
/home/username/foo/../../../etc/passwd
Чтобы усложнить ситуацию, правильное решение chroot: базовый путь недоступен. По разным причинам единственным доступным решением является использование регулярных выражений для разграничения безопасных и небезопасных путей.
Учитывая проблему, описанную выше, каково правильное регулярное выражение?
Обратите внимание:
- Код будет работать под Linux. Отсюда разделитель пути:
/
.
- Вопрос совершенно не зависит от языка.
- Пожалуйста, не предлагайте другие способы решения проблемы. Я знаю, что есть альтернативные более эффективные способы ее решения (например, chroot: ing), но этот вопрос ограничен только решением регулярных выражений.