Answers:
我没有评论权限,否则我将把它作为对较早答案的评论。
重复一遍,请勿重复,请勿使用HTML来转义撇号
'
这不是有效的HTML字符实体引用。它是一个XML字符实体参考。至少Firefox和Chrome会将以上内容呈现为HTML文档中的撇号,而Internet Explorer不会。当它拒绝这样做时,它就是遵循标准。
您可以使用来转义HTML中的撇号
'
但是,我一般认为这不是必需的。
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
我不同意内特。理想情况下,您应该使用尽可能少的转义符,并使用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
函数执行此操作。其他语言可能具有其他类似功能。
更新:我对apos问题已得到纠正。讨厌的IE浏览器。
'
not '
。如果出于某种原因而对HTML属性使用单引号,例如title='something'
您显然必须转义该属性值内的任何单引号。
这取决于您的用例,但'
通常不建议您使用自然语言,因此,除非您的XML中包含计算机代码,否则不会出现此问题。
在翻译了字符串的地方,我们发现一些翻译器用unicode卷曲引号替换了右引号,但将直引号保留为开环引号,使它们在视觉上不平衡且看起来不专业。
unicode字符‘
和’
应该'
尽可能替换,“
并且”
应该替换"
。这很有用,因为计算机无法将卷曲标点识别为特殊字符。(尽管我很高兴看到Stack Overflow / Chrome认为' don’t
'是拼写错误,而对' don't
' 感到满意。)
它没有帮助,我们有非常诱人的'
和"
字符右边的键盘上。
因此,让我们看看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相符,并提请不要使用'
。
您的答案取决于上下文:
如果您要使用此数据在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;
和&quot;
吗?
我的方法是仅对数据库执行SQL转义,但保留所有HTML特殊字符以供以后处理。这样,我可以轻松调试和微调HTML转义。注意,这也意味着如果我自己的SQL表具有用户提供的字符串,我将不信任它们。
永远不要相信用户控制的输入,并且总是引用HTML属性!
如果您的撇号属于内容,请对其进行转义。可以与代码混淆的任何其他内容字符,请对其进行转义。
在不使用实际实体的情况下完成工作的最简单方法是使用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>";
&apos
现在看来对HTML5有效。话虽这么说,如果您必须支持旧版浏览器或为Outlook编写HTML电子邮件,那么'
如果您认为有必要转义字符,则最好坚持。