在Python中安全地计算字符串以调用hashlib
我希望允许人们提供哈希函数的名称,作为对某些对象进行数字指纹识别的一种方法:在Python中安全地计算字符串以调用hashlib,python,Python,我希望允许人们提供哈希函数的名称,作为对某些对象进行数字指纹识别的一种方法: def create_ref(obj, hashfn='sha256'): """ Returns a tuple of hexdigest and the method used to generate the digest. >>> create_ref({}, 'sha1') ('bf21a9e8fbc5a3846fb05b4fa0859e0917b22
def create_ref(obj, hashfn='sha256'):
"""
Returns a tuple of hexdigest and the method used to generate
the digest.
>>> create_ref({}, 'sha1')
('bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f', 'sha1')
>>> create_ref({}, 'md5')
('99914b932bd37a50b983c5e7c90ae93b', 'md5')
"""
return (eval('hashlib.%s' % hashfn)(unicode(obj)).hexdigest(), hashfn)
硬编码hashlib
是否足以防止滥用eval
import hashlib
...
return (getattr(hashlib, hashfn)(unicode(obj)).hexdigest(), hashfn)
我认为这样比使用eval()更安全。否。
如果您应用了一些SQL注入攻击概念,那么用户可以提供如下内容:
“sha1(…);一些邪恶的代码();hashlib.sha1”
这样的结局会彻底摧毁“安全感”:
“hashlib.”sha1(…);some_evil_code();hashlib.sha1“+”(您的原始代码)
这将导致运行3条语句(一条好语句、一条坏语句和一条好语句)
(即使上面的代码有漏洞,这个概念仍然可以被利用)
相反,请使用python的动态功能来实现这一点
TYPES = ('sha256', 'sha1', 'md5', ...)
def create_ref(obj, hashfn='sha256'):
if hashfn not in TYPES:
raise ValueError("bad type")
# look up the actual method
fun = getattr(hashlib, hashfn)
# and call it on `obj`
fun(...)
值得深思 请尝试以下代码,而不是eval:
def create_ref(obj, hashfn='sha256'):
"""
Returns a tuple of hexdigest and the method used to generate
the digest.
>>> create_ref({}, 'sha1')
('bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f', 'sha1')
>>> create_ref({}, 'md5')
('99914b932bd37a50b983c5e7c90ae93b', 'md5')
"""
allowed = hashlib.algorithms
if hashfn in allowed:
return (getattr(hashlib,hashfn)(unicode(obj)).hexdigest(), hashfn)
else:
raise NameError('Not a valid algorithm')
这将保证提供的算法是有效的算法。(请注意,hashlib.algorithms在2.7中是新版本,因此如果您使用较旧版本,请使用允许的算法元组替换hashlib.algorithms。这至少仍然容易出错(调用hashlib的任何属性)。他应该确保只有“白名单”可以调用函数。@gahooa:这段代码更像EAFP,因此如果哈希方法不存在,它将引发一个错误,这没关系:)@gahooa:Ahh我知道你在答案中加入了一些允许的哈希方法,嗯,是的,这很好,但这不是我从OP问题中理解的:),但仍然很好,您刚刚完成了OP问题并添加了一个答案:)eval只能接受1个表达式,因此这是无效的
TYPES = {'sha256':hashlib.sha256 , 'sha1': hashlib.sha1, 'md5': hashlib.md5, ...}
def create_ref(obj, hashfn='sha256'):
#var 1 - use sha256 as default on invalid hashfun
#func=TYPES.get(hashfn, hashlib.sha256)
#var 2 raise error on invalid hashfun
if TYPES.has_key(hashfn):
func=TYPES[hashfn]
else:
raise NameError('Not a valid algorithm')
return (func(unicode(obj)).hexdigest(), hashfn)