&
转义&
。应该用
'
转义'
吗?#1 楼
我没有评论权限,或者将其留作较早回答的评论。,请重复,不要使用
在HTML中使用撇号
'
这不是有效的HTML字符实体引用。它是一个XML字符实体参考。至少Firefox和Chrome会将以上内容呈现为HTML文档中的撇号,而Internet Explorer不会。而且它拒绝该标准时也遵循该标准。
您可以使用
在HTML中使用撇号
'
但是我不这样做。相信一般而言这是必要的。
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http:// zh-CN。 wikipedia.org/wiki/XML_and_HTML_character_entity_references
#2 楼
我不同意内特。理想情况下,您应该使用尽可能少的转义符,并使用UTF-8本地表示字符。为此,您需要一个能够处理UTF-8以及正确的字符集声明的编辑器,例如:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
但是,您应该养成以下习惯:转义(X)HTML中具有特殊含义的字符,即:
< <
> >
" "
& &
' '
这将确保您在编写这些标记时不会意外地编写标记字符。这对于用户输入,维护安全性尤其重要。不太明显,但是逃脱
"
实际上很重要。如果字符串最终以HTML属性(title="something"
等)结尾,则用户可以结束该属性并插入自己的标记。想象一下,如果用户输入" onclick="alert('hello');
并将其插入到title="..."
中会发生什么,如果您使用的是PHP,则可以使用htmlspecialchars
函数来执行此操作。其他语言可能具有其他类似功能。 更新:我已纠正有关单价问题。讨厌的IE浏览器。
评论
我现在有两个矛盾的答案。一个建议转义为',另一个建议不转义。我应该相信什么?
–汤姆
2011年4月18日在12:05
In short. You may or may not escape it at your discretion. If you do, use ' not '. If, for whatever reason, you use single quotes for a HTML attribute like title='something' you must obviously escape any single quotes inside that the attribute value.
– nitro2k01
Apr 18 '11 at 21:32
您的第二段对我来说很重要,由于未转义的撇号,我在git commit中看到红色文本段时,我的OCD被踢开了imgur.com/a/LN0Pu89
–eballeste
19 Mar 2 '19 at 23:48
#3 楼
这取决于您的用例,但我们一般不建议以自然语言使用'
,因此除非您的XML中包含计算机代码,否则不会出现此问题。我们翻译过字符串的地方,我们发现有些翻译器用unicode卷曲引号替换了结尾引号,但将直引号保留为开头引号,使它们在视觉上不平衡且看起来不专业。
‘
尽可能替换’
和'
。这很有用,因为计算机无法将卷曲标点识别为特殊字符。 (尽管我很高兴看到Stack Overflow / Chrome认为'“
'是一个拼写错误,但是对'”
'感到满意。)在键盘上吸引人的"
和don’t
字符。评论
这个答案似乎暗示着我应该停止使用撇号键来书写语音。这对我来说似乎不对。
– Maximillian Laumeister
20 May 24 '18:53
@MaximillianLaumeister您可以按任意喜欢的键:只是说,您不必担心在那些很重要的上下文中转义ASCII'或“(因为* ML解析器不应阻塞显式或隐式CDATA部分中的那些)。您的软件应该通过用看起来更好的弯引号代替它们来避免整个问题,但是如果所涉及的文本是计算机代码,则不要这样做,因为这很烦人。
–android.weasel
20 May 27'8:57
#4 楼
因此,让我们看看StackExchange本身是否使用HTML实体对撇号进行编码。以下是此页面源代码中的一些示例。
(1)问题标题:已编码。
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2)得出的答案:未编码。
But I don't believe it is, in general, necessary.
(3)汤姆对nitro2k01的答案:已编码。
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
这是双向的。
但是,此页面的源代码从未使用
'
。所有编码形式均为'
。这与nitro2k01一致,并且提请忠告不要使用'
。评论
尽管在所有3种情况下都不需要对其进行HTML编码。
–怀特先生
2015年11月10日23:05
#5 楼
该字符串将流向何处?您的答案取决于上下文:
如果您正在使用带有此数据的HTML编写段落,也许足以逃脱<,>和&:
<p>{string}</p>
如果您正在写HTML属性,例如,
<a href='/some/path/{string}'>...</a>
然后,您应该完全摆脱撇号。如果攻击者将它放入
string
中,这可能是一个攻击媒介:string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
同样的东西用双引号引起来。我什至读过反引号`易受攻击,因为它也可以用于HTML属性。如果部署例程中没有自动HTML语法检查脚本,则假定可以使用这三个中的任何一个,并且必须对HTML属性进行转义。
极端情况下,即使未引用的属性也有效,因此空格字符也需要转义。和
!
,@
,$
,%
,(
,)
,=
,+
,{
,}
,[
和]
都可以突破属性并允许插入新的属性。我要做什么
要使用JavaScript进行转义,我使用JQuery的
$(element).text(string)
或$(element).attr(attrname, string)
为我进行转义。请小心$(element).html(unsafe)
,它不会逃脱HTML!在服务器端代码中,我必须仔细评估每种情况的风险,并仔细阅读文档。这将取决于您使用的特定语言和库,例如Rails,Django,原始PHP,Drupal等。
数据库
如果您正在考虑尽早解决问题,那么在问题尚未进入数据库之前,请紧紧抓住。 HTML转义存储在数据库中的文本可以使您如梦如幻。如果您以后想要允许某些HTML标签,但不允许其他HTML标签(如斜体,粗体,颜色和表格)怎么办?如果您在第一次通过时错过了一些东西,但是逃生者已经以
&
和&
作为"
逃脱了逃脱,该怎么办?它会将它们变成"
和&amp;
吗?我的方法是仅对数据库执行SQL转义,而保留所有HTML特殊字符以供以后处理。这样,我可以轻松调试和微调HTML转义。记住,这也意味着如果我自己的SQL表具有用户提供的字符串,我将无法信任。
道德的
永远不要信任用户控制的输入,并且总是引用您的HTML属性!
基于:除了Ryan Grove的&,<,>和“之外,HTML转义还有更多内容。
#6 楼
如果您的撇号部分显示内容,则无需对其进行转义。评论
“如果您的撇号属于内容,请对其进行转义。” -这似乎是不正确的(好像缺少了“不要”一词)。如果撇号是内容的一部分,那么请不要转义它-不需要。
–怀特先生
2015年11月10日在22:51
#7 楼
在不使用实际实体的情况下完成此工作的最简单方法是使用PHP的htmlentities()
或htmlspecialchars()
函数:$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
$val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=utf-8' />
<title>Special Characters</title>
<style type='text/css'>
@import 'special.css';
</style>
</head>
<body>
<form method='post' action='' id='fm' name='fm'>
<input type='text' value='$val' name='val' id='val' />
<input type='submit' value='submit' name='sub' id='sub' />
</form>
</body>
<script type='text/javascript' src='special.js'></script>
</html>";
评论
你在开玩笑吗?
– Su'
2012年10月17日在2:07
@Su'恐怕不是...
–威廉·爱德华兹
2014年9月11日下午12:39
评论
I recognise this will have been correct when this was posted, however looking at the Wikipedia article it appears &apos is now valid of HTML5. That being said if you have to support legacy browsers or writing HTML emails for Outlook then you're best sticking to ' if you deem it necessary to escape the character.
– tomhughes
Oct 16 '19 at 14:36