Как пример кода в документации модуля 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
проверять.
Второй фрагмент не решает эту проблему. Теперь пользователю даже не нужно проходить через переключатель. Никакая часть второго фрагмента не проверяет подлинный идентификатор пользователя.