有没有办法测试pickle文件,看看它在取消pickle期间是否加载了函数或类?下面很好地总结了如何停止加载所选函数:https://docs.python.org/3/library/pickle.html#restricting-globals我假设它可以用来检查是否有函数加载,只需阻塞所有函数加载并得到一个错误消息。但是有没有一种方法可以写一个函数,它只会说:这个pickle对象中只有文本数据,没有函数加载。我不知道哪一个是安全的!
unftdfkk1#
基本上没有,真的没有办法。有很多关于这个的文章。你只能使用pickle,如果你信任的来源,你可以直接从来源得到pickle。任何安全措施,你所做的是不足以防止恶意企图无论如何。https://medium.com/ochrona/python-pickle-is-notoriously-insecure-d6651f1974c9https://nedbatchelder.com/blog/202006/pickles_nine_flaws.html等等。我有时候会用它,但大多数时候是在我和同事打电话并共享了一个pickle文件之后。但更多时候,我自己在本地环境中使用它来存储数据。尽管如此,这不是首选的方式,但它速度很快。所以,如果有疑问。不要用泡菜。
xqnpmsa82#
谢谢你的回答!纯泡菜太容易出现安全问题。Picklemagic声称解决了安全问题;看起来是这样,但我不能确定:http://github.com/CensoredUsername/picklemagic但是https://medium.com/ochrona/python-pickle-is-notoriously-insecure-d6651f1974c9暗示没有安全的 Package 器(picklemagic已经存在8年了,文章的日期是2021年;所以picklemagic没有被考虑在内?)防止Pickle Bomb的唯一可靠方法是不要直接使用pickle。不幸的是,与其他不安全的标准库包不同,pickle没有安全的 Package 器或插入式替代品,如用于xml的defusedxml或用于tarfile的tarsafe。此外,也没有很好的方法在取消pickle之前检查pickle或阻止由REDUCE调用的不安全函数调用。docs确实提供了一个 Package 器来阻止未经授权的函数执行。https://docs.python.org/3.10/tutorial/controlflow.html它并没有说明哪些内置函数是安全的。如果删除了os,其他的是否安全?不过,如果pickle对象中的内容是明确的,那么限制执行可能就足够容易了。
import builtins import io import pickle safe_builtins = { 'range', 'complex', 'set', 'frozenset', 'slice', } class RestrictedUnpickler(pickle.Unpickler): def find_class(self, module, name): # Only allow safe classes from builtins. if module == "builtins" and name in safe_builtins: return getattr(builtins, name) # Forbid everything else. raise pickle.UnpicklingError("global '%s.%s' is forbidden" % (module, name)) def restricted_loads(s): """Helper function analogous to pickle.loads().""" return RestrictedUnpickler(io.BytesIO(s)).load()
2条答案
按热度按时间unftdfkk1#
基本上没有,真的没有办法。有很多关于这个的文章。你只能使用pickle,如果你信任的来源,你可以直接从来源得到pickle。任何安全措施,你所做的是不足以防止恶意企图无论如何。
https://medium.com/ochrona/python-pickle-is-notoriously-insecure-d6651f1974c9https://nedbatchelder.com/blog/202006/pickles_nine_flaws.html等等。
我有时候会用它,但大多数时候是在我和同事打电话并共享了一个pickle文件之后。但更多时候,我自己在本地环境中使用它来存储数据。尽管如此,这不是首选的方式,但它速度很快。
所以,如果有疑问。不要用泡菜。
xqnpmsa82#
谢谢你的回答!
纯泡菜太容易出现安全问题。
Picklemagic声称解决了安全问题;看起来是这样,但我不能确定:http://github.com/CensoredUsername/picklemagic
但是https://medium.com/ochrona/python-pickle-is-notoriously-insecure-d6651f1974c9暗示没有安全的 Package 器(picklemagic已经存在8年了,文章的日期是2021年;所以picklemagic没有被考虑在内?)
防止Pickle Bomb的唯一可靠方法是不要直接使用pickle。不幸的是,与其他不安全的标准库包不同,pickle没有安全的 Package 器或插入式替代品,如用于xml的defusedxml或用于tarfile的tarsafe。此外,也没有很好的方法在取消pickle之前检查pickle或阻止由REDUCE调用的不安全函数调用。
docs确实提供了一个 Package 器来阻止未经授权的函数执行。https://docs.python.org/3.10/tutorial/controlflow.html
它并没有说明哪些内置函数是安全的。如果删除了os,其他的是否安全?不过,如果pickle对象中的内容是明确的,那么限制执行可能就足够容易了。