Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2012 17:06:35

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Защита от обхода каталога

Сабж. Как сделать, чтобы переданный путь не поднимался выше определенного каталога?

Офлайн

#2 Ноя. 5, 2012 19:30:47

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Защита от обхода каталога

Если правильно понял:

import os
 
def validate_path(path, working_path="."):
    real_working_path = os.path.realpath(working_path)
    real_user_path = os.path.realpath(path)
    working_parts = real_working_path.split(os.path.sep)
    user_parts = real_user_path.split(os.path.sep)
    return (len(user_parts) >= len(working_parts) and
            all(wp == up for wp, up in zip(working_parts, user_parts)))
 
print validate_path("")
print validate_path(".")
print validate_path("tst")
print validate_path("tst/../")
print validate_path("/tmp/asdf", "/tmp")
print validate_path("/tmp/asdf/../", "/tmp")
print
print validate_path("../")
print validate_path("tst/../../")
print validate_path("/etc/passwd")
print validate_path(r"c:\windows")
print validate_path("/tmp1/asdf", "/tmp")
print validate_path("/tmp/../", "/tmp")

Офлайн

#3 Ноя. 6, 2012 12:06:11

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Защита от обхода каталога

os.chroot

Офлайн

#4 Ноя. 6, 2012 15:13:19

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Защита от обхода каталога

slav0nic
os.chroot
os.chroot(path)

Change the root directory of the current process to path. Availability: Unix.
И мне менять надо не для программы, а для для путей, которые передает пользователь.

Идея проверять на .. пойдет?

Да, передаваемый путь будет относительным.

reclosedev, в принципе то, что надо. В принципе. А проверенного решения нет? А то безопасность все-таки.

Отредактировано odnochlen (Ноя. 6, 2012 15:26:30)

Офлайн

#5 Ноя. 6, 2012 21:09:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Защита от обхода каталога

odnochlen
Идея проверять на .. пойдет?
Вопрос в том чтобы в глубине не было символьных ссылок вверх.



Офлайн

#6 Ноя. 6, 2012 21:38:11

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Защита от обхода каталога

На каталоги или на файлы? Можно было бы считать, что тот, кто туда поместил ссылку - ССЗБ.

Смысл такой. Есть каталог с файлами и подкаталогами, откуда юзер может качать файлы через наш скрипт. Надо, чтобы он не мог подняться выше.

os.path все равно с реальными файлами не работает, только с путями.

Отредактировано odnochlen (Ноя. 6, 2012 21:39:44)

Офлайн

#7 Ноя. 7, 2012 17:00:55

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Защита от обхода каталога

odnochlen
А проверенного решения нет?
Можно поискать в веб-фреймворках.
odnochlen
Идея проверять на .. пойдет?
В Werkzeug так и сделано.
odnochlen
os.path все равно с реальными файлами не работает, только с путями.
os.path.realpath() символические ссылки заменяет, например.

Офлайн

#8 Ноя. 7, 2012 17:06:43

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Защита от обхода каталога

reclosedev
os.path.realpath() символические ссылки заменяет, например.
Интересно, надо проверить.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version