【问题标题】:How to generate a nginx secure link in python如何在python中生成一个nginx安全链接
【发布时间】:2018-12-11 14:26:36
【问题描述】:

如何使用 python 为 nginx 中的安全链接模块创建链接? 我正在寻找使用 nginx 来提供具有过期链接的安全文件。 Link to Nginx Wiki

【问题讨论】:

    标签: python nginx


    【解决方案1】:

    来自 shadfc 答案的代码有效。 对于 Python 3,需要进行一些修改:

    import base64
    import hashlib
    import calendar
    import datetime
    
    secret = "itsaSSEEECRET"
    url = "/secure/email-from-your-mom.txt"
    
    future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
    expiry = calendar.timegm(future.timetuple())
    
    secure_link = f"{secret}{url}{expiry}".encode('utf-8')
    
    hash = hashlib.md5(secure_link).digest()
    base64_hash = base64.urlsafe_b64encode(hash)
    str_hash = base64_hash.decode('utf-8').rstrip('=')
    
    print(f"{url}?st={str_hash}&e={expiry}")
    

    【讨论】:

      【解决方案2】:

      接受的答案不正确,因为它只对密钥进行哈希处理,而不是对密钥、url 和过期时间的组合进行哈希处理。

      import base64
      import hashlib
      import calendar
      import datetime
      
      secret = "itsaSSEEECRET"
      url = "/secure/email-from-your-mom.txt"
      
      future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
      expiry = calendar.timegm(future.timetuple())
      
      secure_link = "{key}{url}{expiry}".format(key=secret,
                                                url=url,
                                                expiry=expiry)
      hash = hashlib.md5(secure_link).digest()
      encoded_hash = base64.urlsafe_b64encode(hash).rstrip('=')
      
      print url + "?st=" + encoded_hash + "&e=" + str(expiry)
      

      一个nginx.conf的对应部分

      location /secure {
      
          # set connection secure link
          secure_link $arg_st,$arg_e;
          secure_link_md5 "itsaSSEEECRET$uri$secure_link_expires";
      
          # bad hash
          if ($secure_link = "") {
              return 403;
          }
      
          # link expired
          if ($secure_link = "0") {
              return 410;
          }
      
          # do something useful here
      }
      

      【讨论】:

        【解决方案3】:
        import base64
        import hashlib
        
        future = datetime.datetime.now() + datetime.timedelta(minutes=5)
        url = "/securedir/file.txt"
        timestamp = str(time.mktime(future.timetuple()))
        security = base64.b64encode(hashlib.md5( secret ).digest()).replace('+', '-').replace('/', '_').replace("=", "")
        data = str(url) + "?st=" + str(security) + "&e=" + str(timestamp)
        

        data 是您生成的表单网址:

        /securedir/file.txt?st=PIrEk4JX5gJPTGmvqJG41g&e=1324527723
        

        【讨论】:

        • 考虑使用'?'.join((url, urllib.urlencode(st=security, e=timestamp))) 来支持字符串连接。
        • 我做了字符串 concat 以便新用户更容易阅读输出,以便他们可以根据自己的情况进行修改
        • @IfLoop,正确的做法是 '?'.join((url, urllib.urlencode(dict(st=security, e=timestamp)))),显然 :)
        猜你喜欢
        • 1970-01-01
        • 2013-07-14
        • 2015-05-02
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        相关资源
        最近更新 更多