哪些字符应与其HTML实体一起转义。例如,用&转义&

应该用'转义'吗?

#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

评论


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

#2 楼

我不同意内特。理想情况下,您应该使用尽可能少的转义符,并使用UTF-8本地表示字符。为此,您需要一个能够处理UTF-8以及正确的字符集声明的编辑器,例如:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


但是,您应该养成以下习惯:转义(X)HTML中具有特殊含义的字符,即:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;


这将确保您在编写这些标记时不会意外地编写标记字符。这对于用户输入,维护安全性尤其重要。不太明显,但是逃脱"实际上很重要。如果字符串最终以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 ( &#39; ) character with its HTML entity (&amp;#39;)?


(2)得出的答案:未编码。

But I don't believe it is, in general, necessary.


(3)汤姆对nitro2k01的答案:已编码。

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?


这是双向的。

但是,此页面的源代码从未使用&apos;。所有编码形式均为&#39;。这与nitro2k01一致,并且提请忠告不要使用&apos;

评论


尽管在所有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;作为"逃脱了逃脱,该怎么办?它会将它们变成&quot;&amp;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