Как пример кода в документации модуля Python OS создает дыру в безопасности? - PullRequest
0 голосов
/ 06 декабря 2018

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


Примечание

Использование доступа () для проверки, авторизован ли пользователь дляНапример, откройте файл перед тем, как сделать это, используя 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 предотвратит возникновение этого исключения.Аналогично, если пользователь каким-либо образом манипулирует файлом, почему бы не выполнить манипулирование файлом до выполнения команды open версии EAFP?

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

1 Ответ

0 голосов
/ 06 декабря 2018

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

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

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

...