2009-12-11 9 views
1

J'ai une chaîne comme x = "http://query.yahooapis.com/v1/public/yql?q=select%20owner%2Curls%20from%20flickr.photos.info%20where%20photo_id%3D'%s'&format=json"Comment faire une chaîne remplacer dans une chaîne urlencoded

Si je ne x % 10 qui échoue comme il y a %20f etc qui sont traités comme des chaînes de format, donc je dois faire une chaîne conactination . Comment puis-je utiliser des remplacements de cordes normales ici?

+2

God save injection SQL! – Konamiman

+0

umm. Comment cela risque-t-il d'injecter sql? la seule partie où cela est utilisé serait un appel urlopen (ou familial), et je suppose que Yahoo aurait des mécanismes d'échappement en place. (Mon point étant, ce n'est pas le bon endroit pour échapper à l'entrée, IMO) – agiliq

Répondre

5

urldecode la chaîne, le formatage, puis urlencode nouveau:

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) 

Comme un intervenant fait remarquer, faire le formatage en utilisant des chaînes entrées par l'utilisateur arbitraires que la spécification de format est historiquement dangereux, et est certainement un mauvaise idée.

0

Sinon, vous pouvez utiliser le nouveau style de mise en forme de sortie (disponible depuis v 2.6), qui ne repose pas sur%:

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) 

Il a également l'avance de ne pas être typedependent.

0

En formatage de chaîne python, utilisez %% pour générer un seul caractère% (docs).

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

Vous pouvez donc remplacer tous les% par %%, sauf si vous souhaitez les remplacer pendant le formatage. Mais la solution de @Cradrad Meyer est évidemment meilleure dans ce cas.

Questions connexes