【问题标题】:Why isn't CDATA protecting my javascript code from the HTML validator?为什么 CDATA 不保护我的 javascript 代码免受 HTML 验证器的影响?
【发布时间】:2017-05-18 15:00:34
【问题描述】:

我在我的网页中插入了一些 js 代码(由第三方服务提供),它破坏了我的 html 验证。我该如何解决这个问题? CDATA 没有做到这一点。 这是我的示例 sn-p:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head>
  <title>test</title>
  <script type="text/javascript">
  /*<![CDATA[*/
    document.write('<script src="//sharebutton.net/plugin/sharebutton.php?type=horizontal&u=' + encodeURIComponent(document.location.href) + '"></scr' + 'ipt>');
  /*]]>*/
  </script>
</head>
<body>

  <p>test</p>

</body>
</html>

here你可以找到验证器的结果。

【问题讨论】:

  • 你能解释一下,为什么你的代码看起来像 XSS 注入?
  • 该脚本的结尾看起来很奇怪/可疑&lt;/scr' + 'ipt&gt;'?
  • @Liam — 它阻止 &lt;/script&gt; 被解释为实际脚本元素的结束标记。
  • @Mouser — 它看起来不像 XSS。这是提供第三方托管脚本的一种相当标准的方法,该脚本知道它被加载到了哪个页面。
  • 啊,我明白了。感谢您的澄清

标签: javascript cdata html-validation


【解决方案1】:

&lt;![CDATA[* 是 XML 的特性,而不是 HTML。它只是 HTML 术语中 script 元素文本内容的一部分。

要在 HTML 中的 JavaScript 字符串文字中安全地包含字符串 &lt;/script&gt;:转义斜杠:

'"><\/script>')

【讨论】:

  • 它就像一个魅力!谢谢。当您知道自己在做什么时会更容易......我需要花费大量时间才能找出问题!
【解决方案2】:

我认为这里的所有问题都是您的嵌套块注释。试试这个吧……

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
    <head>
      <title>test</title>
      <script type="text/javascript">
      /*<![CDATA[
        document.write('<script src="//sharebutton.net/plugin/sharebutton.php?type=horizontal&u=' + encodeURIComponent(document.location.href) + '"></scr' + 'ipt>');
      ]]>*/
      </script>
    </head>
    <body>

      <p>test</p>

    </body>
    </html>

【讨论】:

  • 注释不应该围绕整个脚本。目标是为 HTML 解析器提供 CDATA 标志(除了它仅适用于 XML 解析器),同时将它们从 JavaScript 解析器中注释掉。注释掉整个脚本只会阻止它以不同的方式工作。
猜你喜欢
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多