是否可以正确地转义任意脚本标记内容?

时间:2016-12-23 07:54:25

标签: html escaping

有关ETAGO的问题 - 结束标记打开:给定一个字符串,是否可以安全地以通用方式将其转义为插入sprintf样式模板,如:

<!DOCTYPE HTML>
<html>
<head>
    <title>tag demo</title>
    <script type="%s">
%s
    </script>
</head>
<body></body>
</html>

我已经看到descriptions显示了如何逃避各种特定字符串,但没有通用。

以通用的方式进行这种逃避是否真的是真的吗?

以下是一些边缘案例:

<!DOCTYPE HTML>
<html>
<head>
    <title>tag demo</title>
    <script type="text/javascript">
        var endtag = "</a>";
        // OK, this is weird - but valid!
        var lessthan = 42 < /script/;
        console.log (endtag, lessthan, '<'.match(/</));
        // The next two lines are weird - and cause invalid HTML
        // </script>
        var lessthan2 = 42 </script/;
        // Is this still being run?
        console.log ("still here");
    </script>
</head>
<body></body>
</html>

这不是有效的HTML,因为</script序列可以在脚本标记中找到&#34;#34;怪异的&#34;线。如果我将内部HTML从脚本标记移动到外部.js文件,still here会被记录到控制台,我相信它是有效的javascript,只是在脚本标记内部无效的HTML。是否有一些安全的通用方法来转义javascript(或css?或type="foo/bar"?)字符串以插入脚本标记?

1 个答案:

答案 0 :(得分:2)

不,似乎不可能。 spec表示(以模数黑客方式将其显示在markdown中):

  

4.12.1.3脚本元素内容的限制

     

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

再向下一点:

  

这些序列可能自然地出现在脚本表达式中,如以下示例所示:

if (x<!--y) { ... }
if ( player<script ) { ... }
  

在这种情况下,无法转义字符,但可以重写表达式,以便不会发生序列,如:   &lt;特定语言的重写&gt;

因此,根据规范,显然不可能。

我很惊讶。但这确实经常发生......; - )