JavaScript - 为什么要拆分字符串字面量?

7

非常抱歉问题标题比较模糊,但我在查看一些职位发布板块的转化跟踪软件代码时第一次遇到了这个。

    document.write('<i' + 'mg height="1" ' +
         'width="1" border="0" ' +
         'src="' + url + '&ifr' + 'ame=0" />');
    document.write('</ifr' + 'ame>');

为什么他们要以这种方式分割字符串常量?具体来说是'</ifr'+'ame>'


有时候这被用来欺骗扫描 JavaScript 以寻找可疑代码的软件(例如 iframe 重定向到另一个 URL)的方法。 - Sparky
3个回答

7
当HTML解析器看到某些标签时,即使嵌入在JavaScript字符串中,它们也会立即被解析为这些标签。将它们分开可以避免这种行为 - <script>通常会引起问题;我同意Mike的观点,不应该对iframe(据我所知,没有其他标签需要这样做,但我不能确保)进行此操作。
这也是一种避免被网络爬虫轻松解析的技巧。

你有例子吗?我非常确定关于HTML解析器的那部分内容是不正确的。 - Mike Samuel
@MikeSamuel 像这个吗? 我的回答不够精确,我认为对于你所说的iframe并不需要,但是对于script则需要。我不记得在你第一次回答时看到你的script示例。但是对于script标签来说是正确的,这也是你所说的,因为这是由HTML解析器引起的。 - Dave Newton
1
明白了。</script> 是 SCRIPT 元素内需要拆分的唯一类似标签的字符序列。<textarea><style><title><noscript><noframes><xmp><listing> 等是可以包含(对于 <no*> 的某些上下文)非标签内容的完整元素集。<plaintext> 是另一个特殊情况,但没有相应的结束标记。 - Mike Samuel

6

看起来像是货船崇拜式编程。

在 HTML 中,您需要确保您的 <script> 块不包含您不想结束脚本的 </script>

例如:

<script>document.write('<script>alert(42);</script>');</script>

这是一个破损的脚本,但是

<script>document.write('<script>alert(42);<\/script>');</script>

是单个格式良好的脚本块。

在XHTML中,<script>不以这种方式工作,因此使用CDATA部分时需要担心]]>

无论哪种情况,分割</iframe><img都是不必要的。


货物崇拜不太可能,这是来自Indeeed.com提供的转化跟踪脚本。 - Chris G.

1

我猜他们这样做是为了打败网络爬虫,因为网络爬虫通常会解析静态HTML以寻找特定的标签进行抓取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接