代码之家  ›  专栏  ›  技术社区  ›  Tim McNamara

在python中安全地计算字符串以调用hashlib

  •  2
  • Tim McNamara  · 技术社区  · 14 年前

    我希望允许人们提供哈希函数的名称,作为数字指纹识别某些对象的方法:

    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 ?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Eric Pauley    14 年前

    尝试以下代码,而不是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。

        2
  •  4
  •   gahooa    14 年前

    不。

    如果应用一些SQL注入攻击概念,用户可以提供如下内容:

    "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(...)
    

    思考的食物!

        3
  •  1
  •   mouad    14 年前
    import hashlib
    
    ...
    return (getattr(hashlib, hashfn)(unicode(obj)).hexdigest(), hashfn)
    

    我认为这比使用eval()更安全

        4
  •  -1
  •   seriyPS    14 年前
    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)