javascript - 为什么在从 JavaScript 生成 HTML 时使用\x3C 而不是 <?

标签 javascript html browser escaping

我看到以下 HTML 代码大量用于从内容分发网络加载 jQuery,但如果 CDN 不可用(例如在 Modernizr docs 中),则回退到本地副本:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.1.min.js">\x3C/script>')</script>

我的问题是,为什么最后一个是< document.write() 中的字符语句替换为转义序列 \x3C<是 JavaScript 中的安全字符,甚至在同一字符串中更早使用过,那么为什么要在那里转义呢?是否只是为了防止糟糕的浏览器实现认为 </script>字符串里面是真正的脚本结束标签?如果是这样,真的有任何浏览器会在这方面失败吗?

作为后续问题,我还看到了使用 unescape() 的变体(如 this answer 中给出的)也在野外几次。为什么那个版本似乎总是替换所有 < 是有原因的吗?和 >人物?

最佳答案

当浏览器看到 </script> ,它认为这是脚本 block 的结尾(因为 HTML 解析器不了解 JavaScript,所以它无法区分字符串中出现的内容,以及 实际意味着结束脚本元素)。所以</script>字面上出现在 HTML 页面内的 JavaScript 中会(在最好的情况下)导致错误,并且(在最坏的情况下)会成为一个巨大的安全漏洞。

这就是为什么您必须以某种方式阻止此字符序列出现的原因。此问题的其他常见解决方法是 "<"+"/script>""<\/script>" (他们都归结为同一件事)。

虽然有些人认为这是一个“错误”,但它实际上必须以这种方式发生,因为根据 specification ,用户代理的 HTML 部分与脚本引擎完全分开。 <script>可以放各种东西标签,而不仅仅是 JavaScript。 W3C 以 VBScript 和 TCL 为例。另一个例子是 jQuery template plugin ,它也使用这些标签。

但即使在 JavaScript 中,您可以建议可以识别字符串中的此类内容,因此不将其视为结束标记,当您考虑注释时,下一个歧义会出现:

<script type="text/javascript">foo(42); // call the function </script>

– 在这种情况下浏览器应该做什么?

最后,那些甚至不知道 JavaScript 的浏览器呢?他们只会忽略 <script> 之间的部分。和 </script> , 但是如果你给字符序列 </script> 赋予不同的语义根据浏览器对 JavaScript 的了解,您会在 HTML 解析阶段突然得到两个不同的结果

最后,关于替换所有尖括号的问题:我想说至少在 99% 的情况下,这是为了混淆,即隐藏(从防病毒软件、审查代理(就像在你的例子中(嵌套的括号很棒)),等等)你的 JavaScript 正在做一些 HTML-y 的事情。除了 </script> 之外,我想不出什么好的技术理由来隐藏任何东西。 ,至少对于相当现代的浏览器来说不是这样(我的意思是几乎所有比 Mosaic 更新的东西)。

关于javascript - 为什么在从 JavaScript 生成 HTML 时使用\x3C 而不是 <?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8231048/

相关文章:

security - Youtube官方-客户端错误(400)格式错误或非法请求

JavaScript getElementById 函数重载

css - 宽度为 :100% , 底部响应式 div 的 div,作为一个 child 不是一个选项

javascript - 输入字段在收到值后不刷新

html - 随机 ">"符号出现在 HTML 表格上方

javascript - 如何使用脚本向 Firefox 中的存储添加密码?

java - 每当我在 Eclipse 中将浏览器设置为 DEFAULT WEB BROWSER(Chrome) 时,它都会显示错误。我该如何纠正它?

javascript - 获取自日期以来的年、月、日、小时、分钟和秒的时间

javascript - Jquery if 条件为鼠标离开或鼠标进入

javascript - getJson 键/值参数作为变量语法问题