如何正确转义 HTML 属性中的引号?

How do I properly escape quotes inside HTML attributes?

提问人:Chris 提问时间:10/25/2010 最后编辑:Peter MortensenChris 更新时间:6/16/2021 访问量:314091

问:

我有一个网页上的下拉列表,当值字符串包含引号时,该下拉列表会中断。

该值为 ,但在 DOM 中它始终显示为空字符串。"asd

我尝试了所有我知道的方法来正确地逃脱字符串,但无济于事。

<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>

如何在页面上呈现此内容,以便回发消息包含正确的值?

HTML XHTML 转义

评论

0赞 SLaks 10/25/2010
你是如何生成页面的?
2赞 Wim ten Brink 10/25/2010
如果使用单引号怎么办?<option value='“asd'>test</option>
8赞 reconbot 2/7/2013
我必须指出,这些答案都没有说明如何正确转义字符串以在 html 属性中使用
5赞 Matt Browne 2/26/2013
@reconbot 这取决于 HTML 的生成方式。这个问题是关于引号的,所以从技术上讲,公认的答案回答了提出的问题。至于如何正确转义字符串,我没有适合一般情况的链接,但在 PHP 中你会使用 .htmlentities
0赞 Ciro Santilli OurBigBook.com 7/29/2014
如何在 HTML 输入值中使用引号的可能重复

答:

425赞 Andy E 10/25/2010 #1

&quot;是正确的方法,你的第三个测试:

<option value="&quot;asd">test</option>

您可以在下面或 jsFiddle 上看到它的工作原理。

alert($("option")[0].value);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="&quot;asd">Test</option>
</select>

或者,也可以用单引号分隔属性值:

<option value='"asd'>test</option>

评论

21赞 atk 10/25/2010
OP 的第四个选项 “ 也是转义引号的有效方法。与命名实体相比,使用数字 html 实体有一个好处,因为命名实体不会涵盖所有字符,而数字实体会覆盖所有字符。完整的HTML4列表位于 w3.org/TR/html4/sgml/entities.html
46赞 Andy E 10/25/2010
@atk:是的,映射到与 相同的字符,但在此处使用数字选项没有任何好处,因为这是一个定义的命名实体。 也更容易记住。&quot;&#34;&quot;&quot;
7赞 atk 10/26/2010
我同意。在这种特殊情况下,使用 “ 更容易。我只想指出一般情况。
4赞 Andy E 1/3/2017
@SIDU:将其更改为(将&amp;quot;a&&amp;)
5赞 Omar Meky 2/2/2017
^ 无限循环
2赞 Jim Manico 11/20/2011 #2

您实际上应该只允许不受信任的数据进入具有良好属性的白名单,例如:align、alink、alt、bgcolor、border、cellpadding、cellspacing、class、color、cols、colspan、coords、dir、face、height、hspace、ismap、lang、marginheight、marginwidth、multiple、nohref、noresize、noshade、nowrap、ref、rel、rev、rows、rowspan、scrolling、shape、span、summary、tabindex、title、usemap、valign、value、vlink、vspace、width

你真的想把不受信任的数据排除在javascript处理程序以及id或name属性之外(它们可能会破坏DOM中的其他元素)。

此外,如果您将不受信任的数据放入 SRC 或 HREF 属性中,那么它实际上是一个不受信任的 URL,因此您应该验证该 URL,确保它不是 javascript: URL,然后是 HTML 实体编码。

有关所有这些的更多详细信息,请访问:https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet

评论

4赞 trysis 6/16/2014
我知道这已经晚了,但几乎所有这些属性在 HTML4.01 中都被弃用,并在 5 中删除。反正现在可能没关系,因为有更好的方法可以保护自己,只是指出来。
4赞 Quentin 5/16/2016
问题是询问包含引号字符的数据,而不是不可信的数据。
11赞 csonuryilmaz 11/27/2012 #3

另一种选择是用单引号替换双引号,如果您不介意它是什么。但我没有提到这个:

<option value='"asd'>test</option>

我提到这个:

<option value="'asd">test</option>

就我而言,我使用了这个解决方案。

评论

14赞 Raptor 10/10/2014
但是,如果该值包含单引号和双引号,这将失败
0赞 csonuryilmaz 10/13/2014
@Raptor 我说过,如果值包含双引号,请将它们转换为单引号。如果该值包含单引号,则没有问题。
26赞 Lukasz Czerwinski 6/13/2013 #4

如果您使用的是 PHP,请尝试调用 htmlentitieshtmlspecialchars 函数。

评论

2赞 hanshenrik 12/23/2019
仅仅使用它们可能还不够,尝试 - 确保与ENT_QUOTES一起使用,这是安全的:,但除了ENT_QUOTES您还应该添加ENT_SUBSTITUTE和ENT_DISALLOWED之外,就我个人而言,我已经使用这个包装器多年了:<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' /><option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' />function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
0赞 David Spector 7/8/2023
不明白这个评论。
27赞 aij 1/19/2016 #5

Per HTML syntax, and even HTML5, the following are all valid options:

<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
<option value='"asd'>test</option>
<option value='&quot;asd'>test</option>
<option value='&#34;asd'>test</option>
<option value=&quot;asd>test</option>
<option value=&#34;asd>test</option>

Note that if you are using XML syntax the quotes (single or double) are required.

Here's a jsfiddle showing all of the above working.

2赞 Andrew 11/15/2019 #6

If you are using JavaScript and Lodash, then you can use _.escape(), which escapes , , , , and ."'<>&