Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中安全地计算字符串以调用hashlib_Python - Fatal编程技术网

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