Regexp для создания похожих на chroot путей в среде Linux - PullRequest
0 голосов
/ 14 ноября 2009

Рассмотрим следующую проблему безопасности:

У меня есть статический базовый путь (/home/username/), к которому я добавляю контролируемый пользователем подпуть (скажем, foo/bar.txt). Содержимое этого файла затем читается и представляется пользователю.

В описанном случае полный путь будет: /home/username/foo/bar.txt

Теперь к проблеме. Я хочу контролировать, чтобы полный путь всегда был подкаталогом статического базового пути. Другими словами, я не хочу, чтобы пользователь указывал путь так, чтобы базовый путь был экранирован.

Следующий полный путь в порядке:

/home/username/foo/bar.txt

Принимая во внимание, что этот один явно не безопасен:

/home/username/foo/../../../etc/passwd

Чтобы усложнить ситуацию, правильное решение chroot: базовый путь недоступен. По разным причинам единственным доступным решением является использование регулярных выражений для разграничения безопасных и небезопасных путей.

Учитывая проблему, описанную выше, каково правильное регулярное выражение?

Обратите внимание:

  • Код будет работать под Linux. Отсюда разделитель пути: /.
  • Вопрос совершенно не зависит от языка.
  • Пожалуйста, не предлагайте другие способы решения проблемы. Я знаю, что есть альтернативные более эффективные способы ее решения (например, chroot: ing), но этот вопрос ограничен только решением регулярных выражений.

Ответы [ 3 ]

1 голос
/ 14 ноября 2009

Если вы не хотите полностью отклонять его, просто удалите любое "../" с пути, например так:

sed -e 's/\..\///g'

Вы должны знать, что в иерархии каталогов могут быть разрешены файлы, которые связаны с каталогами вне этой иерархии.

Без использования chroot я не думаю, что есть способ гарантировать его полную безопасность.

1 голос
/ 14 ноября 2009

Вы можете просто отклонить любой пользовательский ввод, который соответствует /(^|\/)\.\.(\/|$)/

Это означает: если оно содержит /../ или начинается с ../ или заканчивается /.. или ..

0 голосов
/ 14 ноября 2009

Я полагаю, что это невозможно сделать, используя только одно регулярное выражение. Регэкспы не могут ничего посчитать, а здесь вам определенно нужно посчитать количество ../

Однако вы можете попробовать использовать рекурсивные регулярные выражения и проверить рекурсивное вложение ([[: alpha:]] + / ..), например [[: alpha:]] + (\ R) | ..

Я согласен, что лучше вообще запретить ../

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...