Lon*_*ner 2 security warnings yaml pyyaml python-3.x
这是我的代码:
import yaml
yaml.load('foo')
Run Code Online (Sandbox Code Playgroud)
此代码导致PyYAML(5.1)出现以下警告。
$ pip install pyyaml
$ python3 foo.py
foo.py:2: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
yaml.load('foo')
Run Code Online (Sandbox Code Playgroud)
因此,我访问了https://msg.pyyaml.org/load来了解这是怎么回事,但我不了解此警告的必要性。
首先,文档说,
UnsafeLoader
(也要求Loader
向后兼容)不受信任的数据输入可以轻易利用的原始Loader代码。
好的,那很有道理。在早期版本中,原始加载程序是不安全的。此外,它说,
FullLoader
加载完整的YAML语言。避免执行任意代码。当前(PyYAML 5.1)是
yaml.load(input)
(在发出警告之后)调用的默认加载程序。
因此,当前版本使用FullLoader
的不是不安全的。在文档中再次确认。
通过禁止默认加载器()执行任意功能,还使加载函数更加安全
FullLoader
。
如果使用的当前版本FullLoader
不是不安全的,那么为什么我们完全需要它YAMLLoadWarning
?
我认为此警告更像是一个通知和指导,旨在使用户知道将来的PyYAML最佳做法是什么。回想一下:显式优于隐式。
在5.1版(例如4.1版)之前,yaml.load
api Loader=Loader
默认使用:
def load(stream, Loader=Loader):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
"""
loader = Loader(stream)
try:
return loader.get_single_data()
finally:
loader.dispose()
def safe_load(stream):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
Resolve only basic YAML tags.
"""
return load(stream, SafeLoader)
Run Code Online (Sandbox Code Playgroud)
当时,只有三个可用的选择Loader
类:限制BaseLoader
,SafeLoader
以及不安全Loader
。尽管默认值是不安全的,但就像我们从文档中看到的那样:
load
自2006年5月发布第一个版本以来,PyYAML的功能一直是不安全的。它始终以粗体显示:PyYAMLDocumentation。PyYAML始终提供了safe_load
无需加载即可加载YAML子集的功能。
但是仍然有很多资源,教程更喜欢yaml.load(f)
直接使用,因此用户(尤其是新用户)隐式选择了默认的Loader类。
从PyYAML 5.1版开始,该yaml.load
api更改为更加明确:
def load(stream, Loader=None):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
"""
if Loader is None:
load_warning('load')
Loader = FullLoader
loader = Loader(stream)
try:
return loader.get_single_data()
finally:
loader.dispose()
def safe_load(stream):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
Resolve only basic YAML tags. This is known
to be safe for untrusted input.
"""
return load(stream, SafeLoader)
Run Code Online (Sandbox Code Playgroud)
并且将新的类FullLoader
添加到Loader
类中。作为用户,我们还应该意识到这些变化并yaml.load
更加明确地使用:
yaml.load(stream, yaml.SafeLoader)
推荐用于不受信任的输入。限制:加载YAML语言的子集。
yaml.load(stream, yaml.FullLoader)
获得更多值得信赖的输入。还有一点局限性:避免执行任意代码。
yaml.load(stream, yaml.Loader)
(UnsafeLoader
与相同Loader
)
不安全 但是拥有全力。
归档时间: |
|
查看次数: |
4428 次 |
最近记录: |