Мне нужно написать небольшой компонент для обслуживания файлов для веб-сервера. Есть много вопросов, обслуживающих
файлы. Потому что «как есть» служит большой дырой в безопасности, как это
www.somesite.com/../../../../etc/passwd
Существует много проблем, в том числе "..", и многие другие, например, в окнах, есть много "необычных способов обратиться к некоторому пути". Также есть некоторые проблемы с символическими ссылками ... Они могут оттолкнуть нас от корня документа.
Есть ли какая-нибудь хорошая статья или материал по обслуживанию файлов и проверке безопасности на них?
Спасибо.
P.S .: Мне нужно решение в основном для систем POSIX, но мне нужно решение и для Win32.
P.P.S:
- Достаточно ли проверять ".." и символические ссылки для систем POSIX? (Насколько я знаю это не для Windows)
- Насколько я помню, Windows предоставляет какой-то API для этих целей, может кто-нибудь указать на это?
Зачем мне это нужно:
CppCMS имеет простой внутренний веб-сервер для целей отладки (я его написал), я пытаюсь выяснить, насколько трудно было бы сделать этот сервер полностью полезным для реального мира (т.е. слушать на 80 напрямую, а не через веб-сервер и соединитель FastCGI или SCGI).
Это приложение для обслуживания файлов , которое я использую в данный момент. Это делает очень примитивные проверки. В основном я хочу, чтобы это было безопасно.
Мой ответ:
Есть ответ https://www.securecoding.cert.org/confluence/display/seccode/FIO02-C.+Canonicalize+path+names+originating+from+untrusted+sources
Кажется, это достаточно хорошо ...
Вкратце: используйте realpath
под UNIX и GetFullPathName
под Windows.
Заключительное примечание: если что-то предложит более детальную функциональность, я бы его принял (особенно для Win32, где тестирование путей затруднительно ...)