8

首先,我认为这与自 2012 年 6 月 12 日以来在我网站上 1% 的请求网址中随机附加的“未定义”问题或多或少相同,但由于我是新用户,无法评论这篇文章,它没有解决方案,我只能问一个新问题。

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

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

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

4

6 回答 6

6

答案摘要

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

假设

  1. 如果 JavaScript 用于设置或更改图像位置,则有时会发生 anundefined进入 URI 的情况。

  2. 将是一些 javascript 发出 http 请求,并且由于错误,它不是请求绝对 url,而是请求“未定义”。

结论:这个问题,我相信是由 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 网络Firebug 网络

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

  • 如果您提交页面并看到失败的请求很快就消失了,但由于下一页加载而丢失它,请通过单击 Firebug 上的“Persist”或 Net 面板左上角的“Preserve log”图标或在网络面板的左下角。一旦它发生了,它应该考虑你做了什么来实现它。看看你能不能让它再次发生。在弄清楚是什么用户交互导致它发生后,深入研究该代码并开始寻找发出无效请求的东西,并且永远不要忘记查看请求标头。您可以使用“脚本”选项卡在 JavaScript 中设置断点并单步执行它们。调查通过 $(element).bind/click/focus/etc 或从老派事件属性(如 onclick=""/onfocus="" 等)完成的事件处理程序。

  • 如果您无法触发错误请求,那么导致它的任何原因都不会被您的测试触发。尝试使用更多的东西。关键是您应该能够以某种方式使请求发生。你只是还不知道。它必须显示在网络面板中。唯一不会发生的情况是当你没有做任何触发它的事情时。

我们在您的代码中寻找什么

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 可能是 object {}、 array[]或任何内部浏览器类型。关键是将访问一个不存在的属性。

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

于 2012-07-25T15:12:45.077 回答
4

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

出于调试目的(在开发模式下)您应该在发出 ajax 请求之前验证 ajax url,并且每当您发现 undefined 时将其转移到虚拟页面并尝试尽可能多地获取详细信息。

这种事情主要发生在一个异步请求依赖于其他异步请求时。如果不查看代码或示例,很难提出任何建议,但我希望在您的应用程序中添加更多调试功能并获取越来越多的细节将能够识别问题。

在某个地方,我觉得这没什么大不了的,只是在你的繁重的 JavaScript 应用程序中的某个点,你错过了或被忽视了。

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

于 2012-07-16T09:29:18.860 回答
4

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

我在 Drupal 7 网站以及连接到 Drupal 的普通 HTML+CSS(没有任何 JS)迷你站点上看到 /undefined 404,以提供一些特定的内容。

看起来它几乎总是一个 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;媒体中心 PC 6.0;InfoPath.2;.NET4.0C;.NET4.0E)

通过快速日志搜索,Firefox 永远不会发生这种情况。

/undefined 请求出现在页面渲染结束时,在请求 CSS 和图像之后。而且它 ** 不会 ** 再次发生在几乎相同的第二个页面,并重复使用第一个页面的布局、CSS 和图像。

我的两分钱...

于 2012-11-29T16:51:10.550 回答
3

根据这篇文章,我对“Complitly”Chrome 插件/恶意软件进行了逆向工程,发现此扩展程序正在注入“改进的自动完成”功能,该功能在每个输入文本字段为 NAME 或“搜索”、“q”和许多其他的 ID。

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

TL:博士;

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

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

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

于 2013-01-10T17:28:38.813 回答
2

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

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

于 2012-12-29T19:44:01.970 回答
1

看起来像是您可能正在使用的第 3 方代码(例如库、框架或某些外部 JS 文件,如 Google Analytics)。

一个更丰富多彩的替代方案是您网站中的注入漏洞,攻击者正在使用该漏洞,有时会生成这些 URL。我猜这个注入的代码也算作 3rd-party 代码。

于 2012-07-16T09:54:48.370 回答