【问题标题】:How does one encode and decode a string with Python for use in a URL?如何使用 Python 对字符串进行编码和解码以在 URL 中使用?
【发布时间】:2010-10-26 22:07:20
【问题描述】:

我有一个这样的字符串:

String A: [ 12234_1_Hello'World_34433_22acb_4554344_accCC44 ]

我想加密字符串 A 以在干净的 URL 中使用。像这样:

String B: [ cYdfkeYss4543423sdfHsaaZ ]

python中是否有编码API,给定字符串A,它返回字符串B? python中是否有解码API,给定字符串B,它返回字符串A?

【问题讨论】:

  • 请注意,加密(“我想加密...”)不是编码(“是否有编码 API...”)。您接受了使用 base64 编码的答案。这不是加密,即这些数据不安全。
  • @VN44CA,加密的查询字符串和干净的 URL 不是同一个问题。如果有的话,加密的查询字符串本质上是不干净的。就目前而言,这个问题的措辞非常糟糕。

标签: python string hash urlencode clean-urls


【解决方案1】:

请注意,编码和加密之间存在巨大差异。

如果你想发送敏感数据,那么不要使用上面提到的编码;)

【讨论】:

    【解决方案2】:

    进行编码/解码的一种方法是使用base64包,例如:

    import base64
    import sys
    
    encoded = base64.b64encode(sys.stdin.read())
    print encoded
    
    decoded = base64.b64decode(encoded)
    print decoded
    

    这是你要找的吗?根据您的具体情况,您会得到:

    输入:12234_1_Hello'World_34433_22acb_4554344_accCC44

    编码:MTIyMzRfMV9IZWxsbydXb3JsZF8zNDQzM18yMmFjYl80NTU0MzQ0X2FjY0NDNDQ=

    解码:12234_1_Hello'World_34433_22acb_4554344_accCC44

    【讨论】:

      【解决方案3】:

      您是否希望加密字符串或对其进行编码以删除 url 的非法字符? 如果是后者,可以使用urllib.quote

      >>> quoted = urllib.quote("12234_1_Hello'World_34433_22acb_4554344_accCC44")
      >>> quoted
      '12234_1_Hello%27World_34433_22acb_4554344_accCC44'
      
      >>> urllib.unquote(quoted)
      "12234_1_Hello'World_34433_22acb_4554344_accCC44"
      

      【讨论】:

      • 这个答案很棒,因为它实际上回答了标题中提出的问题(问题本身相当不连贯),以及许多寻找此页面的搜索者想要什么。
      【解决方案4】:

      您是在加密、压缩还是只是 urlencoding?该字符串可以在 urlencoding 之后传递,但这不会像您的示例那样使其更小。压缩可能会缩小它,但您仍然需要对结果进行 urlencode。

      您是否真的需要对查看者隐藏字符串数据(例如敏感数据,不应该被通过您的肩膀阅读 URL 的人查看)?

      【讨论】:

      • 没有安全问题。我只是想随机化字符串并缩小一点。我在 Kijiji.com 上看到了这个,他们在 Slug 的末尾附加了一个随机字符串。我确信这就是他们传递论点的方式。我认为使用类似的东西会很酷。 bayarea.kijiji.com/f-Jobs-Construction-trades-W0QQCatIdZ100060 bayarea.kijiji.com/… 我想在 URL 中包含所有参数,因此如果人们复制和发送 URL,他们的朋友将看到没有 cookie 的最终结果。谢谢
      • 您可能将存储数据误认为是引用它。也就是说,您在 URL 中看到的短字符串实际上是一个会话 ID,它引用的数据保存在服务器上。我可能是错的,我不知道该网站的任何细节,但它很常见。
      【解决方案5】:

      为了让它真的很短 -> 只需在数据库中插入一行。存储类似(id auto_increment, url) 元组列表的东西。然后您可以base64 对 id 进行编码以获得“代理 url”。通过解码 id 并在数据库中查找正确的 url 来解码它。或者,如果您不介意标识符看起来是连续的,只需使用数字即可。

      【讨论】:

        【解决方案6】:

        从 python 2.4 开始,base64 模块提供对字符串进出不同基数的编码和解码。

        在您的示例中,您将执行以下操作:

        import base64
        string_b = base64.b64encode(string_a)
        string_a = base64.b64decode(string_b)
        

        对于完整的 API: http://docs.python.org/library/base64.html

        【讨论】:

        • 我收到TypeError: 'str' does not support the buffer interface
        • 我的字符串:A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|Adj|Adm|Adv|Asst|Bart|Bldg|Brig|Bros|Capt|Cmdr|Col|Comdr|Con|Corp|Cpl|DR|Dr|Drs|Ens|Gen|Gov|Hon|Hr|Hosp|Insp|Lt|MM|MR|MRS|MS|Maj|Messrs|Mlle|Mme|Mr|Mrs|Ms|Msgr|Op|Ord|Pfc|Ph|Prof|Pvt|Rep|Reps|Res|Rev|Rt|Sen|Sens|Sfc|Sgt|Sr|St|Supt|Surg|v|vs|i.e|rev|e.g|No #NUMERIC_ONLY#|Nos|Art #NUMERIC_ONLY#|Nr|pp #NUMERIC_ONLY#|Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec
        【解决方案7】:

        很难减小字符串的大小并保留任意内容。

        您必须将数据限制为可以有效压缩的数据。

        您的替代方法是执行以下操作。

        1. 将“URL 中的所有参数”保存在数据库行中。

        2. 为这个参数集合分配一个 GUID 键。

        3. 然后提供缩短的 GUID 密钥。

        【讨论】:

        • 另一种方法需要对数据库进行额外的访问,对吗?我看到很多网站都在这样做,只需要找出方法吗?
        • 额外相对于什么?如果您正在对用户进行身份验证并检查授权,那么您会在那里进行查询。如果您的数据模型不是一张普通的表,它可能涉及多个查询。将“查询”保存在数据库中会比较容易管理。
        【解决方案8】:

        另一种也可以缩短字符串的方法是计算字符串的 md5/sha1 哈希(如果您愿意,可以与种子连接):

        import hashlib
        >>> hashlib.sha1("12234_1_Hello'World_34433_22acb_4554344_accCC44").hexdigest()
        'e1153227558aadc00a2e90b5013fdd6b0804fdfb'
        

        理论上,您应该得到一组冲突很少且长度固定的字符串。 hashlib 库有一系列不同的散列函数,您可以通过这种方式使用,具有不同的输出大小。

        编辑:您还说您需要一个可逆字符串,所以这不起作用。然而,Afaik,许多像您这样使用干净 URL 的网络平台似乎想要实现使用哈希函数来计算缩短的 URL,然后将该 URL 与页面的其他数据一起存储以提供反向查找功能。

        【讨论】:

        • hashlib.sha1 可逆吗?
        猜你喜欢
        • 1970-01-01
        • 2020-07-22
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        • 2015-11-23
        相关资源
        最近更新 更多