自2012年6月12日起,"undefined"随机附加在我网站上1%的请求网址中

col*_*nux 79 javascript browser

自2012年6月12日11:20 TU,我在varnish/apache日志中看到非常奇怪的错误.

有时,当用户请求一个页面时,几秒钟后我看到一个类似的请求,但是url中最后一个/之后的所有字符串已被"undefined"替换.

示例:http: //example.com/foo/bar触发http://example.com/foo/undefined请求.

当然,这些"未定义"页面不存在,而是返回我的404页面(这是一个带有标准布局的自定义页面,而不是经典的apache 404)

  • 任何页面(从主页到最深)都会发生这种情况
  • 与各种浏览器,(主要是Chrome 19,但Firefox 3.5至12,IE 8/9 ......)但只有1%的交通.
  • 这些请求发送的标头是经典标头(并且没有ajax标头).
  • 对于给定的ip,这似乎是随机出现的:有时在访问的第一页,有时在访问期间的随机页面上,有时在访问期间有几页...

当然它看起来像一个javascript问题(我使用谷歌托管的jquery 1.7.2),但几天没有改变js/html或服务器配置几天以来我从来没有看到过这种错误.当然,html中没有这样的链接.

我还注意到一些有趣的事实:

  • 未定义的请求永远不会被发现为其他页面的引用,而是"真实"页面被用作相同IP的以下请求的引用(用户可以使用404页面上的经典菜单)
  • 我在Google Analytics中没有看到这些页面的任何痕迹,因此我假设没有执行任何javascript(所有页面上都包含跟踪器,包括404)
  • 即使我在网站的社交网络中调用了这个问题,也没有人与我们联系
  • 大多数用户在此之后继续访问

所有这些事实让我觉得这个问题在浏览器中默默地发生,可能是由于错误的附加组件,防病毒软件,浏览器栏或昨天更新的浏览器中集成的蹩脚制造商软件引发的(但我没有发现任何附加组件发布昨天换了chrome,firefox和IE).

这里有人注意到同样的问题,或者有更完整的解释吗?

And*_*nez 21

没有简单的直接答案.

您将不得不对此进行调试,由于URL中的"未定义"字,它可能是JavaScript.然而,它不一定是AJAX,它可以是JavaScript创建任何由浏览器自动解析的URL(例如,在图像标记上设置src属性的JavaScript,设置css-image属性等).我大部分时间都使用FirefoxFirebug,所以我的方向就是考虑到这一点.

Firebug初始设置

如果您已经知道如何使用Firebug,请跳过此步骤.

在安装并重新启动Firefox for Firebug之后,您将不得不启用大多数Firebug的"面板".要打开Firebug,浏览器的右上角会有一个小火虫/昆虫看东西,或者你可以按F12.点击Firebug选项卡'Console','Script','Net'并打开它们并阅读面板信息来启用它们.您可能必须刷新页面才能使它们正常工作.

调试用户交互

导航到其中一个打开Firebug并且Net面板处于活动状态的页面.在Net面板中会有几个选项:'Clear','Persist','All','Html'等.确保选中ALL.不要在页面上做任何事情,尽量不要鼠标悬停在页面上.查看请求.对无效URL的请求将为红色,可能状态为404 Not Found(或类似).

在加载时看到它?跳到下一部分.

在初始加载时看不到它?开始使用您的页面并继续此处.

开始点击每个功能,鼠标悬停在所有功能上等.密切关注网络面板并注意失败的请求.您可能必须具有创造性,但继续使用您的应用程序,直到您看到浏览器发出无效请求为止.如果页面发出了很多请求,请随时点击Net面板左上角的"Clear"按钮清除它.

如果您提交页面并查看失败的请求,请快速退出,然后因为下一页加载而丢失它,通过单击Net面板左上角的"Persist"启用持久性.

一旦它做了,它应该,考虑你做了什么来实现这一目标.看看你是否能再次实现它.在弄清楚用户交互发生了什么之后,深入研究该代码并开始寻找无效请求的内容.

您可以使用"脚本"选项卡在JavaScript中设置断点并逐步执行它们.调查通过$(elemment).bind/click/focus/etc或来自旧学校事件属性(如onclick =""/ onfocus =""等)完成的事件处理程序.

如果请求在页面加载后立即发生

这有点难以实现.您需要转到"脚本"选项卡,然后开始为每个在加载时运行的脚本添加断点.您可以通过单击JavaScript行的左侧来执行此操作.

重新加载您的页面,您的断点应该阻止浏览器加载页面.按脚本面板上的"继续"按钮.转到您的网络面板,看看您的请求是否已经发出,一直持续到找到.您可以通过缓慢添加越来越多的断点然后单步执行和退出函数来缩小请求的范围.

你在代码中寻找什么

与以下内容类似的东西:

var url = workingUrl + someObject['someProperty'];

var url = workingUrl + someObject.someProperty;
Run Code Online (Sandbox Code Playgroud)

请记住,someObject可能是对象{},数组[]或任何内部浏览器类型.关键是将访问不存在的属性.

我没有看到任何404 /红色请求

然后,任何导致它的东西都不会被你的测试触发.尝试使用更多东西.关键是你应该能够以某种方式使请求发生.你还不知道.它必须出现在Net面板中.唯一不会在你不做任何事情的时候触发它.

结论

没有超级简单的方法来确定究竟发生了什么.然而,使用我概述的方法,你至少应该能够接近.这可能是你甚至没有考虑的事情.


Wil*_*rro 16

基于这篇文章,我对"Complitly"Chrome插件/恶意软件进行了逆向工程,发现此扩展程序注入了"改进的自动完成"功能,该功能在每个具有NAME输入文本字段的站点上抛出"未定义"请求或"搜索","q"以及许多其他的ID.

我还发现enable.js文件(complitly文件之一)正在检查名为"suggestmeyes_loaded"的全局变量,以查看它是否已经加载(如Singleton).因此,将此变量设置为false会禁用该插件.

要停用恶意软件并停止"未定义"请求,请将其应用于您网站上包含搜索字段的每个网页:

<script type="text/javascript">
    window.suggestmeyes_loaded = true;
</script>
Run Code Online (Sandbox Code Playgroud)

此恶意软件还会将您的用户重定向到"searchcompletion.com"网站,有时会显示竞争对手ADS.所以,应该认真对待.


Ja͢*_*͢ck 8

您已正确确定undefined与JavaScript问题相关,如果您的网站用户没有抱怨看到错误页面,您可以检查以下内容.

如果使用JavaScript来设置或更改图像位置,则有时会发生undefined进入URI的情况.

当发生这种情况时,浏览器会愉快地尝试加载图像(没有AJAX标题),但它会留下提示:它设置一个特定的Accept:标题; 而不是text/html, text/xml, ...它将使用image/jpeg, image/png, ....

确认此标题后,您已将问题范围缩小到仅图像.找到根本原因可能需要一些时间:)

更新

为了帮助调试,您可以$.fn.attr()在将某些内容分配给undefined时覆盖并调用调试器.像这样的东西:

?(function($, undefined) {
    var $attr = $.fn.attr;

    $.fn.attr = function(attributeName, value) {
        var v = attributeName === 'src' ? value : attributeName.src;

        if (v === 'undefined') {
            alert("Setting src to undefined");
        }

        return $attr(attributeName, value);
    }
}(jQuery));
Run Code Online (Sandbox Code Playgroud)