17

在 HTML 中,标签和实体不在<script>标签内解析,而是</立即结束标签。因此,

<script><b>fun &amp; things</

会给你一个包含确切内容的脚本标签<b>fun &amp; things

如果您包含 JSON 并且希望</在脚本中包含字符,则可以将其替换为,<\/因为这些字符出现的唯一位置是字符串,并且\/是一个转义序列,会变成单个正斜杠。

但是,如果您不使用 JavaScript,则此技巧不起作用。就我而言,我正在尝试将 a<script type="math/tex">插入源代码,以便MathJax对其进行处理。有没有办法</在原始 HTML 源中转义?(我没有特别需要,</但我正在编写一个通用工具,并希望可以使用任何文本。)

(可以在 JavaScript 中创建 script 标签并填充它innerText,但我正在使用原始 HTML,所以我不能这样做。)


更多的 HTML 编码可能会有所帮助?&lt;对于<.

很难知道你在用它做什么。如果您不确定脚本标签之间的内容可能是什么(看起来您可能正在尝试将其用作某种模板持有者?)那么您可以/应该使用 CDATA 部分:

<script><![CDATA[<b>fun &amp; things</b>]]></script>

那应该这样做。更多描述也可以帮助给出更好的答案:)

4

4 回答 4

23

我来这里是为了寻找一种</script>在 JavaScript 代码中普遍转义的方法。

经过一番研究,我发现如果你试图</script>在 JavaScript 代码中转义,以便它可以安全地嵌入到 html<script></script>标记之间,你应该</script</scr\iptor替换</scri\pt。这样做更安全,因为如果将其替换为<\/script可能会破坏 JavaScript 代码,如下所示:var q = -1</script/.test("script");

小心不要寻找,</script>而是</script因为</script asdasdas>会像结束你的脚本一样</script>

抱歉,它对 OP 没有任何帮助。接受的答案是绝对正确的,您需要知道哪些构造在您的内部语言中是合法的,<script></script>才能知道如何在</script>不中断代码的情况下避免发生。

于 2014-06-01T19:11:17.713 回答
9

HTML 规范详细解释了允许的内容以及如何安全地转义内容。尤其是考虑到 HTML 的历史,这是一项不平凡的任务。

从 HTML 规范:

避免本节中描述的相当奇怪的限制的最简单和最安全的方法是,&lt;!--当这些序列&lt;\!--出现在脚本中的文字中(例如,在字符串中、正则表达式或注释),并避免编写在表达式中使用此类结构的代码。这样做可以避免本节中的限制容易触发的陷阱:即,由于历史原因,在 HTML 中解析脚本块是一种奇怪而奇特的做法,在面对这些序列时会产生不直观的行为。&lt;script&lt;\script&lt;/script&lt;\/script

来源:https ://www.w3.org/TR/html52/semantics-scripting.html#restrictions-for-contents-of-script-elements

于 2018-10-09T18:10:44.137 回答
8

在 HTML 中,与 XHTML 相反,script元素的内容被处理为纯文本,除了出现结束标记,因此</结束处理并且必须在符合文档的情况下开始结束标记</script>。没有通用的机制来避免这种情况。任何绕过此功能的方法都不可避免地依赖于元素内部使用的“语言”。“语言”这个词在这里用引号引起来,因为内容可以是任何东西,只要你的代码可以解析和处理它。

所以:没有通用机制,但对于 JavaScript 或某些浏览器识别的少数其他客户端脚本语言之外的内容,您可以制定自己的规则。

于 2013-02-08T21:13:57.407 回答
0

更多的 HTML 编码可能会有所帮助?&lt;对于<.

很难知道你在用它做什么。如果您不确定脚本标签之间的内容可能是什么(看起来您可能正在尝试将其用作某种模板持有者?)那么您可以/应该使用 CDATA 部分:

<script><![CDATA[<b>fun &amp; things</b>]]></script>

那应该这样做。更多描述也可以帮助给出更好的答案:)

于 2013-02-08T20:37:30.980 回答