"未定义"和"缓存/ xxx"附在网址上

时间:2012-07-16 09:20:00

标签: javascript http browser

首先,我认为这与"undefined" randomly appended in 1% of requested urls on my website since 12 june 2012或多或少是同一个问题,但由于我是新用户,无法对此帖发表评论而且还没有解决方案,我只能问一个新问题

自2012年6月12日14:22 EET(第一次错误发生的那一刻),我们遇到了非常奇怪的问题: 只有不到1%的对我们网站的请求在末尾附加了“未定义”字符串或替换了网址的有效部分,而引荐来源是该网站的完全有效的URL。例如,我们收到 http://example.com/foo/undefined 的请求,其中包含引用 http://example.com/foo/bar 或请求 http://example.com/undefined 与referer http://example.com/ (主页)。这些URL来自不同的客户端IP地址,不同的ISP,浏览器通常是Chrome,但也适用于IE和Firefox 3.5。似乎有些东西正在将URL重写为无效的东西,将原始URL保留在referrer标记中。 我们无法重现这个问题。

我们还解决了源帖子评论中提到的另一个问题:我们正在接收http://example.com/cache/xxx格式的URL请求,其中xxx看起来像32个字符的MD5字符串(例如:3d453e96e68cc01ced7920ae77356078或bbc80a4244caf556fdcaa9fb60231af7)。我们的任何有效网址中都没有“缓存”字符串。同一个xxx字符串可能来自不同的IP,持续数天甚至数周。所有这些奇怪的请求都来自Chrome浏览器。此问题未在2012-06-12开始。它至少从今年年初开始发生,但比第一次更为罕见。我们也无法重现这个问题。

我们的网站是在IIS上,客户端是基于Javascript的,我们使用的是Prototype框架(不是jquery)。

6 个答案:

答案 0 :(得分:6)

答案摘要

如果出现错误并且没有人知道它在哪里,则必须调试代码以查找可能是错误启动器的语句。如今我们有一些很好的工具可以帮助我们完成这项任务。

假设

  1. 如果使用JavaScript设置或更改图片位置,有时会发生undefined进入URI。

  2. 会有一些javascript发出http请求,由于存在错误,而不是请求绝对网址,它会请求“未定义”。

  3. 结论:这个问题,我相信是由JS造成的。

    在Firefox和Chrome上进行调试

    安装并运行

    • 如果您要在Firefox中尝试,则应下载FIREBUG ADDON。然后按F12,您将看到一个带有一些标签的窗口。您需要激活一些标签:如“控制台”,“脚本”,“网络”。通过打开它们,阅读面板信息并单击激活链接来提供激活。

    • 对于Chrome,只需检查是否已安装CHROME'S DEVELOPERS TOOL。然后按F12。

    调试

    • 在Firefox中,导航到一个错误页面,并打开Firebug并激活Net面板。在Net面板中,将有几个选项:“Clear”,“Persist”,“All”,“Html”等。确保选中 ALL 选项。不要在页面上做任何事情,尽量不要鼠标悬停在页面上。查看GET和POST请求。对无效URL的请求可能会显示为红色,状态为404 Not Found或类似。如果“全部”选项卡中没有任何内容,请确保在进入页面之前打开了Firebug。对于故障排除刷新页面并重做该部分。

    • 在Chrome中,导航到一个带有CDT的错误页面,Chrome开发者工具的缩写,打开并选择了“网络”面板。作为Firebug,确保选中 ALL 选项,它将位于图标后左下角。不要在页面上做任何事情,尽量不要鼠标悬停在页面上。对无效URL的请求可能会显示为红色,状态为404 Not Found或类似。如果“网络”选项卡中未显示任何内容,请确保在进入页面之前打开CDT。对于故障排除刷新页面并重做该部分。

    仍然看不到它

    • 对于两者,开始触发一些Javascript事件,例如悬停,单击e等,并密切关注面板。它将跟踪您的所有要求,包括好的和坏的。专注于不良请求,如果没有出现不良请求,这将需要创造力。事件将触发请求,您将能够看到它们。看到他们,你将能够知道或发现问题,也可能是问题的原因。有关更多资源CDT NetworkFirebug Net

    PS。:如果面板变脏,请单击清除按钮或图标以清除面板中的请求

    • 如果您提交页面并查看失败的请求,请快速退出,然后因为下一页加载而失去它,通过单击Firebug上的“Persist”或左上角的“Preserve log”图标启用持久性“网络”面板或“网络”面板的左下角。一旦它做了,它应该,考虑你做了什么来实现这一目标。看看你是否能再次实现它。在弄清楚用户交互正在发生什么之后,深入研究该代码并开始查找产生无效请求的内容,并且永远不要忘记查看请求标头。您可以使用“脚本”选项卡在JavaScript中设置断点并逐步执行它们。调查通过$(elemment).bind / click / focus / etc或来自旧学校事件属性(如onclick =“”/ onfocus =“”等)完成的事件处理程序。

    • 如果您无法触发错误请求,那么导致它的任何内容都不会被您的测试触发。尝试使用更多东西。关键是你应该能够以某种方式使请求发生。你还不知道。它必须出现在Net面板中。唯一不会在你不做任何事情的时候触发它。

    我们在您的代码中寻找的内容

    var url = workingUrl + someObject['someProperty'];
    
    var url = workingUrl + someObject.someProperty;
    
    var url = workingUrl + $.md5("message"); //For the /cache/ problem. JQuery Plugin
    
    var url = workingUrl + hex_md5("message"); //For the /cache/ problem. MD5 Implementation
    
    <a href= "javascript:;" class="small_img" >
      //Code here
    </a>
    
    window.open('/image.?url_image=' + currentImage,winName,features);
    

    PS:someObject可能是对象{},数组[]或任何内部浏览器类型。关键是将访问一个不存在的属性。

    结论:这里没有免费午餐可以知道到底发生了什么。但是,使用调试方法,您应该能够发现,接近或理解问题。

答案 1 :(得分:4)

从给定的情况我可以假设的是,由于网站是基于Javascript的重型...有很多ajax调用。而且我更可能假设这些是在Javascript代码中生成未定义参数的ajax请求。

出于调试目的(在开发模式下)你应该在发出ajax请求之前验证ajax url,并且每当你发现undefined将它转移到虚拟页面并试着抓住尽可能多的细节时。

当一个异步请求依赖于其他异步请求时,会发生这种情况。没有查看代码或示例,很难提出任何建议,但我希望在您的应用程序中增加一些调试功能,并抓住越来越多的细节来识别问题。

在某个地方,我觉得这不是什么大不了的事,只是你的重度javascript应用程序中的一些内容,你错过了或者没被注意到。

发布更多详细信息,以便我们在stackoverflow上为您提供帮助。

答案 2 :(得分:4)

如果只是某些浏览器/平台错误怎么办?

我在Drupal 7网站上看到了/ undefined 404s,并且在一个简单的vanilla HTML + CSS(没有任何JS)迷你站点上连接到Drupal,用于提供特定内容。

看起来它几乎总是Chrome / Safari问题,这里和那里有一些IEx,如下所示:Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 6.1; Trident / 4.0; SLCC2; .NET CLR 2.0 .50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)

从快速日志搜索,它永远不会发生在Firefox上。

在请求CSS和图像之后,/ undefined请求出现在页面渲染结束时。对于第二页几乎完全相同并重新使用第一页的布局,CSS和图像,它不会再次发生。

我的两分钱......

答案 3 :(得分:3)

基于此post,我对“Complitly”Chrome插件/恶意软件进行了反向设计,并发现此扩展程序注入了“改进的自动完成”功能,该功能在每个具有“未定义”的网站上发出“未定义”请求一个输入文本字段,其名称或ID为“搜索”,“q”等等。

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

<强> TL:DR

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

<script type="text/javascript">
    window.suggestmeyes_loaded = true;
</script>

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

答案 4 :(得分:2)

可能 cache / xxx 请求是chrome / chromium扩展错误(尚未修复):

http://code.google.com/p/chromium/issues/detail?id=132059

答案 5 :(得分:1)

似乎您可能正在使用的第三方代码(例如库,框架或某些外部JS文件,如Google Analytics)。

更丰富多彩的替代方案是您的网站中的注入漏洞被攻击者使用,有时会生成这些网址。我想这个注入的代码也算作第三方代码。