提问人:Chris 提问时间:10/25/2010 最后编辑:Peter MortensenChris 更新时间:6/16/2021 访问量:314091
如何正确转义 HTML 属性中的引号?
How do I properly escape quotes inside HTML attributes?
问:
我有一个网页上的下拉列表,当值字符串包含引号时,该下拉列表会中断。
该值为 ,但在 DOM 中它始终显示为空字符串。"asd
我尝试了所有我知道的方法来正确地逃脱字符串,但无济于事。
<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value=""asd">test</option>
<option value=""asd">test</option>
如何在页面上呈现此内容,以便回发消息包含正确的值?
答:
"
是正确的方法,你的第三个测试:
<option value=""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=""asd">Test</option>
</select>
或者,也可以用单引号分隔属性值:
<option value='"asd'>test</option>
评论
"
"
"
"
&quot;a
&
&
)
您实际上应该只允许不受信任的数据进入具有良好属性的白名单,例如: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
评论
另一种选择是用单引号替换双引号,如果您不介意它是什么。但我没有提到这个:
<option value='"asd'>test</option>
我提到这个:
<option value="'asd">test</option>
就我而言,我使用了这个解决方案。
评论
如果您使用的是 PHP,请尝试调用 htmlentities
或 htmlspecialchars
函数。
评论
<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); }
Per HTML syntax, and even HTML5, the following are all valid options:
<option value=""asd">test</option>
<option value=""asd">test</option>
<option value='"asd'>test</option>
<option value='"asd'>test</option>
<option value='"asd'>test</option>
<option value="asd>test</option>
<option value="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.
If you are using JavaScript and Lodash, then you can use _.escape(), which escapes , , , , and ."
'
<
>
&
评论
htmlentities