我正在写一个存储用户输入的对象的Web应用程序。 此对象将腌制。
是否有可能为用户手艺恶意输入当对象被拆封,可以做一些事情令人震惊?
下面是忽略了美好的原则,如封装,但集中体现了我在寻找什么,在一个非常基本的代码示例:
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)
是的,没有...
否 - 除非有与解释或咸菜模块中的错误,你无法通过腌制文本,或类似的东西运行任意代码。 除非腌制文字eval
版以后,或者你正在做的东西像创建与此数据提到一个类型的新对象。
是的 - 这取决于你打算以后在对象的信息做什么,用户可以做各种各样的事情。 从SQL注入尝试,不断变化的凭据,蛮力密码破解,或任何应当你验证用户输入加以考虑。 但是,你可能检查了这一切。
编辑 :
Python文档状态这一点:
警告pickle模块并不旨在对抗错误或恶意构造数据的安全。 从未来自不可信或未经认证的源接收数据unpickle。
然而,这是不是你的情况 - 你接受输入,把它通过定期验证,然后咸菜吧。
那么根据文档
警告 : pickle
模块并不旨在对抗错误或恶意构造数据的安全。 从未来自不可信或未经认证的源接收数据unpickle。
这将意味着,有可能只是通过调用它,如果数据的结构,使得泡菜算法将进入其中的程序行为不保的状态的状态存在攻击此功能。
根据这个网站
import pickle
pickle.loads("cos\nsystem\n(S'ls ~'\ntR.") # This will run: ls ~
在所有需要执行任意代码。 还有没有其他的例子还有一个“改善”酸洗出于安全目的。
我发现这个在多模块的文档 ,我认为回答这个问题:
警告
所述Connection.recv()方法自动unpickles它接收到的数据,其可以是安全风险,除非你可以信任的发送消息的过程。
因此, 除非连接对象是使用管道生产(),你应该只使用的recv()和send()方法执行某种身份验证后。 见认证密钥。
(重点煤矿)
结论是,如果是使用可信管,即,一个值得信赖的腌汁产生的连接对象,那么它可以安全地拆封。