2009-12-11 115 views
1

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

如果我做x % 10因为有%20f等,这被视为格式字符串失败了,所以我必须做一个字符串conactination 。我如何在这里使用普通的字符串替换。

+2

上帝保存SQL注入! – Konamiman 2009-12-11 08:44:07

+0

umm。这是如何冒sql注入风险的?唯一可以使用的部分是urlopen(或家庭)调用,并且我假设雅虎将有逃避机制。 (我的观点是,这不是避免输入的正确地方,国际海事组织) – agiliq 2009-12-11 08:50:33

回答

5

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) 

正如一位评论者所指出的,做用任意用户输入的字符串作为格式规范是历史上危险的格式,并且是肯定馊主意。

0

否则,您可以使用新的风格的输出格式(因为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) 

它也具有不typedependent的进步。

0

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

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

所以,你可以用%%代替所有的%,除非你想格式化过程中替代。但@Conrad Meyer的解决方案在这种情况下显然更好。

相关问题