2010-06-22 26 views
4

我有一個<img src=__string__>可能含有」,我應該怎麼辦,以逃避它在Python中退出html?

?例如:

__string__ = test".jpg 
<img src="test".jpg"> 

不起作用

+0

這個問題http://stackoverflow.com/questions/275174/how-do-i-perform-html-decoding-encoding-using-python-django有一些有用的答案。 – hwiechers 2010-06-22 20:56:00

回答

11

如果你的價值被轉義可能包含報價,最好的辦法是使用quoteattr方法:http://docs.python.org/library/xml.sax.utils.html#module-xml.sax.saxutils

這是在cgi.escape()方法的文檔下面引用。

+2

+1,quoteattr是**完全**是正確的函數用於此(和在線Python文檔也很清楚這一點!)。 – 2010-06-23 00:36:07

+0

很酷。但值得注意的是,如果你的字符串包含單引號和雙引號,你將會得到一個帶有'"'的URL,這個URL不可能解析到你所定位的資源。 – tcarobruce 2010-06-23 01:00:05

+2

此功能不足。我能夠以這種方式注入HTML。雖然'django.utils.html.escape'工作。 – 2rs2ts 2013-11-15 21:24:03

-3

逃脫XML的最好方法。或python中的HTML可能帶有三重引號。請注意,您也可以使用回車符。

"""<foo bar="1" baz="2" bat="3"> 
<ack/> 
</foo> 
""" 
+2

我不認爲這回答了這個問題。他想知道如何正確地避免引號_inside_'__string__',因爲他正在使用quotes _around_'__string__'。 – 2010-06-22 20:48:50

+0

沒有回答這個問題。 – 2017-10-20 03:50:05

2

如果您使用的URL(此處爲img src)可能包含引號,則應使用URL引用。

對於Python,使用urllib.quote方法的URL字符串傳遞給您的模板之前:

img_url = 'test".jpg' 
__string__ = urllib.quote(img_url) 
+0

謝謝,但如果它不是網址或unicode,它失敗的標題屬性 – Timmy 2010-06-22 21:05:10

+0

@Timmy,你是什麼意思「標題屬性失敗」?調用urllib.quote返回「test%22.jpg」,我相信這是你想要的。 – 2010-06-22 22:05:04

+0

unicode – Timmy 2010-06-23 16:15:38

5
import cgi 
s = cgi.escape('test".jpg', True) 

http://docs.python.org/library/cgi.html#cgi.escape

注意,True標誌告訴它逃脫雙引號。如果您還需要轉義單引號(如果您是使用單引號括住html屬性的罕見個人之一),請閱讀該文檔鏈接中關於xml.sax.saxutils.quoteattr()的註釋。後者則這兩種報價,雖然它是慢三倍:

>>> timeit.Timer("escape('asdf\"asef', True)", "from cgi import escape").timeit() 
1.2772219181060791 
>>> timeit.Timer("quoteattr('asdf\"asef')", "from xml.sax.saxutils import quoteattr").timeit() 
3.9785079956054688 
+3

失敗cgi.escape不會轉義單引號。由於這個原因,使用它來進行HTML轉義是很危險的,因爲變量的屬性可能是單引號的。如果該屬性是單引號,則可以輕鬆找到跨站點腳本漏洞。 – 2010-06-24 02:41:17

+1

我在回答中明確提到了單引號問題。 – 2010-06-24 03:41:41

11

在Python 3.2中引入了一個新的html模塊,該模塊用於從HTML標記中轉義保留字符。

它有一個功能html.escape(s, quote=True)。 如果可選標誌報價爲真,則還會翻譯字符(")(')

用法:

>>> import html 
>>> html.escape('x > 2 && x < 7') 
'x &gt; 2 &amp;&amp; x &lt; 7' 
+0

你的回答聽起來好像'html'不適用於Python 2,但它是。 – 2017-09-26 09:54:43