2010-11-11 61 views
2

我想允许人们提供一个哈希函数的名称的数字指纹某些目的的手段:在Python安全评估字符串调用hashlib

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

回答

2

,而不是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。

1
import hashlib 

... 
return (getattr(hashlib, hashfn)(unicode(obj)).hexdigest(), hashfn) 

我觉得这样更安全比使用的eval()

+1

这仍然是容易出错的最小值(调用的任何属性hashlib)。他应该确保只有“白名单”功能可以被调用。 – gahooa 2010-11-11 22:17:02

+0

@gahooa:这段代码更EAFP所以如果散列方法不存在,它会引发一个错误,这是没问题:) – mouad 2010-11-11 22:19:16

+0

@gahooa:啊我看到你确实在你的答案中放了一些允许的散列方法嗯,是的好点,但它不是我从OP问题中所理解的:),但仍然很好,你只需完成OP问题并添加了答案:) – mouad 2010-11-11 22:21:09

4

如果应用一些SQL注入攻击的概念,这将是conceviable为用户电源是这样的:

"sha1(...); some_evil_code(); hashlib.sha1"

这将完全吹“安全“程这样结束了:

"hashlib." + "sha1(...); some_evil_code(); hashlib.sha1" + "(your-original-code)"

会导致其中在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(...) 

思考问题!

-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)