2009-12-11 161 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的解決方案在這種情況下顯然更好。

相關問題