带有 URL 的大量 Javascript 会导致 Chrome(DevTools?)报告错误的 404

Posted

技术标签:

【中文标题】带有 URL 的大量 Javascript 会导致 Chrome(DevTools?)报告错误的 404【英文标题】:Heavy Javascript with URLs causes Chrome (DevTools?) to report bad 404's 【发布时间】:2011-12-04 13:13:36 【问题描述】:

包含大量 javascript 的页面还包含在 javascript 中编码为 JS 字符串的 URL。

问题在于 Chrome(或者可能只是开发者工具?)试图导航到这些编码的 URL,就好像它们是 html 的一部分一样。

这似乎只在页面中有大量 javascript 时才会发生。

页面看起来或多或少像:

<body>
    ....
    <script type="text/javascript">
        //<![CDATA[
        google.maps.event.clearListeners(window.kgmm["marker32"],"click");
        google.maps.event.addListener(window.kgmm["marker32"],"click",clicked);
        window.kgmp["marker54"]=new InfoBox(
            content: "<div class=\"wrapBox\" align=\"left\"><div class=\"imageBox\"><a href=\"#ir_rih\" target=\"_blank\"><span class=\"imageWrap\">"

/* the issue -> */  +"<img src=\"?ajax=1&cls=owAjaxHandler&mtd=thumbnail&amp;i=wp-content\/uploads\/2011\/07\/Bahrija &amp; Fomm ir-rih08.jpg&amp;w=115&amp;h=115\" border=\"0\" alt=\"\"\/><\/"

                    +"span><\/a><\/div><div class=\"specsBox\"><h2>Fomm Ir-Rih<\/h2><div class=\"shortDesc\"><\/div><a class=\"moreInfo\" href=\"#ir_rih\" onclick=\"return krtShowTabByHash(this);\">more details &raquo;<\/a><\/div><\/div>" ,
            disableAutoPan: false,
            maxWidth: 0,
            pixelOffset: new google.maps.Size(-214, 0),
            zIndex: null
        );
        //]]>
    </script>
    ....
</body>

以下是控制台中的截图:


请注意,我不是在寻找修复方法。请不要建议任何改进代码的方法。

而不是修复,我正在寻找关于为什么会发生这种情况的答案。

注意: CDATA 不应该阻止 chrome 将 javascript 内容解析为 XML 元素吗?


导致问题的示例 URL:

    首先,转到here。 打开控制台 (Right Click -&gt; Inspect Element -&gt; Console tab) 点击页面列表中的第二个项目,名为“Mdina, Rabat, Dingli & Baħrija” 在页面加载时继续查看控制台,您应该会看到上述错误。

注意:有人将问题标记为“过于本地化”。我想指出这不是真的。我在多个网站上都遇到过这个问题,但从未考虑过(直到现在),因为该网站仍然有效。

【问题讨论】:

虽然 javascript 不是将那些字符串插入到 dom 中吗? @Jakob - 是的,但是当它这样做时,字符串的格式正确。例如,"a=\"b&amp;gt;\"" 变为 a="b&gt;" 好吧,我真的不能很好地看到你的截图,但它似乎也解释了一些格式。 @JakubHampl 做一个Right-Click -&gt; Open Image in new tab。您看到的格式不在页面内。选择 URL 的是 Chrome/DevTools。即使没有将字符串添加到 DOM 中,仍然会出现这个问题。 我有点困惑。您是否希望它根本不尝试获取这些 URL?为什么不呢,假设InfoBox 实际上将content 插入到页面中? 【参考方案1】:

问题在于您转义了i url 参数:

src=\"?ajax=1&cls=owAjaxHandler&mtd=thumbnail&amp;i=wp-content\/uploads\/2011\/07\/Bahrija &amp; Fomm ir-rih08.jpg&amp;w=115&amp;h=115\"

基本上,反斜杠转义不适用于 URL。如果您想访问该 URL,您需要将其发送为:

src=\"?ajax=1&cls=owAjaxHandler&mtd=thumbnail&amp;i=wp-content%2Fuploads%2F2011%2F07%2FBahrija%20%26%20Fomm%20ir-rih08.jpg&amp;w=115&amp;h=115\"

Chris 编辑:将其解码为 javascript 字符串会产生:

src="?ajax=1&cls=owAjaxHandler&mtd=thumbnail&amp;i=wp-content/uploads/2011/07/Bahrija &amp; Fomm ir-rih08.jpg&amp;w=115&amp;h=115"

【讨论】:

我编辑了帖子以更好地显示解码后的字符串(用于比较)。我不确定你在说什么,但在我看来并没有错。我仍然无法理解为什么 Chrome 会尝试从直接的 Javascript 中解析 URL。在此过程中,这难道不能证明是锁定 JavaScript 系统(如 facebook API)的一个很好的攻击媒介吗? @Christian:你确定是 Chrome 直接解析这些字符串吗?或者当new被调用时,它们是否被谷歌地图的api解析? 我不能 100% 确定,但我在没有 Google 地图的其他地方也遇到过这个问题。此外,无论 Google 地图是否已初始化,都会发生这种情况。 另外,我已经检查了“生成的代码”,并且格式错误的内容不会出现在任何地方的 DOM 中。相反,如果代码试图通过其他方法获取图像,它将显示在控制台中并且可以被跟踪(但是,唉,这不会发生)。 它们本身不会出现在控制台中。你是说网络面板吗?另外,您可以用 SSCCE 替换问题中的代码吗? sscce.org

以上是关于带有 URL 的大量 Javascript 会导致 Chrome(DevTools?)报告错误的 404的主要内容,如果未能解决你的问题,请参考以下文章

在带有空白 URL 的新窗口中,您如何提供从中查找相关资源的路径?

空 URL 哈希导致页面跳转到 js 事件

通过 RFC 5987 处理带有空格的文件名* 参数会导致文件名中出现“+”

网址重写 - 这会导致安全问题吗?

在 Swift 3 中使用带有动态 URL 的 AVAudioPlayer 导致线程错误

javascript转到带有unicode字符的url