【问题标题】:How to do a string replace in a urlencoded string如何在 urlencoded 字符串中进行字符串替换
【发布时间】:2009-12-11 08:42:10
【问题描述】:

我有一个类似x = "http://query.yahooapis.com/v1/public/yql?q=select%20owner%2Curls%20from%20flickr.photos.info%20where%20photo_id%3D'%s'&format=json"的字符串

如果我执行x % 10 失败,因为有%20f 等被视为格式字符串,所以我必须进行字符串连接。我怎样才能在这里使用普通的字符串替换?

【问题讨论】:

  • 嗯。这种sql注入风险如何?唯一使用它的部分是 urlopen (或家庭)调用,我假设雅虎将有转义机制。 (我的意思是,这不是逃避输入的正确位置,IMO)

标签: python string


【解决方案1】:

对字符串进行urldecode,进行格式化,然后再次对其进行urlencode:

import urllib

x = "http://query.yahooapis.com/v1/public/yql?q=select%20owner%2Curls%20from%20flickr.photos.info%20where%20photo_id%3D'%s'&format=json"
tmp = urllib.unquote(x)
tmp2 = tmp % (foo, bar)
x = urllib.quote(tmp2)

正如一位评论者所说,使用任意用户输入的字符串作为格式规范进行格式化在历史上是危险的,而且肯定是个坏主意。

【讨论】:

    【解决方案2】:

    在python字符串格式化中,使用%%输出单个%字符(docs)。

    >>> "%d%%" % 50
    '50%'
    

    因此,您可以将所有 % 替换为 %%,除非您在格式化期间要替换的位置。但是@Conrad Meyer 的解决方案在这种情况下显然更好。

    【讨论】:

      【解决方案3】:

      否则,您可以使用不依赖 %: 的新型输出格式(自 v 2.6 起可用):

      x = 'http://query.yahooapis.com/v1/public/yql?q=select%20owner%2Curls%20from%20flickr.photos.info%20where%20photo_id%3D{0}&format=json'
      x.format(10)
      

      它还具有不依赖于类型的优点。

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多