Как санировать созданные пользователем имена файлов для сетевого приложения? - PullRequest
0 голосов
/ 07 октября 2010

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

Имена полученных файлов задаются отправителем файла, и несколько файлов могут отправляться вместе.с возможностью подкаталогов.Например, два файла, отправленные вместе, могут быть «1» и «sub / 2», так что загруженные результаты должны быть похожи на «downloads / 1» и «downloads / sub / 2».

Я волнуюсьо последствиях для безопасности этого.Прямо в голове, два потенциально опасных имени файла будут что-то вроде "../../../somethingNasty" или "~ /thingNasty" для Unix-подобных пользователей.Другие потенциальные проблемы, которые приходят мне в голову, - это имена файлов с символами, которые не поддерживаются в целевой файловой системе, но это кажется намного сложнее и, возможно, лучше их игнорировать?

Я рассматриваю удаление полученных имен файлов для ".."и «~», но этот тип «черного списка», когда я по отдельности думаю о проблемных случаях, вряд ли является рецептом хорошей безопасности.Каков рекомендуемый способ очистки имен файлов, чтобы гарантировать, что ничего зловещего не произойдет?

Если это имеет значение, мое приложение работает на C ++ с каркасом QT.

1 Ответ

0 голосов
/ 07 октября 2010

Разумнее заменить ".." на, скажем, XXX, а ~ на, скажем, YYY.Таким образом, вы преобразуете любой неверный путь в совершенно правильный путь.Т.е. если пользователь хочет загрузить "../../../somethingNasty" - нет проблем, пусть он загрузит файл и сохранит его в XXX / XXX / XXX / что-нибудь вкусное.

Или, что еще лучше, вы можете кодировать все не буквенно-цифровые символы (кроме слешей) с% XY, где XY - шестнадцатеричный код символа.Таким образом, вы получите% 2E% 2E /% 2E% 2E /% 2E% 2E / SomethingNasty

...