2010-06-22 60 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