Как пример кода в документации модуля Python OS создает дыру в безопасности?

Документация для os Модуль делает следующее утверждение:


Заметка

Использование access() для проверки того, авторизован ли пользователь, например, на открытие файла, прежде чем делать это с помощью open(), создает дыру в безопасности, поскольку пользователь может использовать короткий промежуток времени между проверкой и открытием файла для манипулирования им. Желательно использовать методики EAFP. Например:

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
    return fp.read()
return "some default data"`

лучше написано как:

try:
    fp = open("myfile")
except PermissionError:
    return "some default data"
else:
    with fp:
        return fp.read()

Я не понимаю, как пользователь может использовать интервал. Если open собирался поднять исключение, я не уверен, как os.access предотвратит возникновение этого исключения. Аналогично, если пользователь каким-то образом манипулирует файлом, почему бы не выполнить манипулирование файлом до версии EAFP? open команда?

Я понимаю, что вторая версия может быть более надежной, так как os.access может неправильно распознать условие, которое может вызвать PermissionError, но я не вижу, как версия LBYL менее безопасна. Может кто-нибудь объяснить это?

1 ответ

Решение

В то время как access- использование кода небезопасно, второй фрагмент кода не решает проблемы безопасности. Эти документы должны быть изменены.

Цель os.access заключается в проверке, имеет ли реальный идентификатор пользователя разрешение на доступ к файлу, когда реальные и эффективные идентификаторы пользователя отличаются. Опасность с os.access Фрагмент, что пользователь может разместить файл access возвращается True в тестируемом месте, затем поменяйте его на файл access вернулся бы False за, в обход чека. поскольку open использует эффективный идентификатор пользователя, open звонок еще может работать, минуя access проверять.

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

Другие вопросы по тегам