我正在编写一个将用户输入存储在对象中的网络应用程序。该对象将被 pickle 。
用户是否有可能制作恶意输入,当对象被解封时可能会做一些令人震惊的事情?
这是一个非常基本的代码示例,它忽略了封装等奇妙的原则,但概括了我正在研究的内容:
import pickle
class X(object):
some_attribute = None
x = X()
x.some_attribute = 'insert some user input that could possibly be bad'
p = pickle.dumps(x)
# Can bad things happen here if the object, before being picked, contained
# potentially bad data in some_attribute?
x = pickle.loads(p)
最佳答案
是,不是……
否 - 除非解释器或 pickle 模块存在错误,否则您不能通过 pickle 文本或类似的方式运行任意代码。除非 pickle 文本稍后被 eval
编辑,或者您正在做一些事情,例如创建一个具有此数据中提到的类型的新对象。
是的 - 根据您稍后计划对对象中的信息执行的操作,用户可以执行各种操作。从 SQL 注入(inject)尝试到更改凭据、暴力破解密码或在验证用户输入时应考虑的任何事情。但您可能正在检查所有这些。
编辑:
python 文档说明了这一点:
Warning The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
但这不是你的情况 - 你接受输入,通过常规验证,然后 pickle 它。
关于python - 攻击 Python 的 pickle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10282175/