如何知道它实际上是404页?

时间:2016-06-01 11:42:34

标签: http webserver http-status-code-404

我从Foregenix学到了什么:

  

HTTP 404 Not Found Error表示无法在服务器上找到您尝试访问的网页。这是客户端错误,这意味着页面已被删除或移动,URL未相应更改,或者您在URL中输入错误

但后来我也用Python做网络应用程序测试,我想知道如果我只检查页面上的字符串404,它可能不是真正的404错误。 可能会出现页面存在但标题为404只是为了欺骗我们。

那我怎么知道呢?

3 个答案:

答案 0 :(得分:55)

您可以检查HTTP状态代码,看看它是否为404。状态代码位于响应的第一行:

HTTP/1.1 404 Not Found

如果您使用HTTPlib,则可以阅读status对象的HTTPResponse属性。

但是,服务器决定要发送什么HTTP状态代码。仅仅因为404被定义为"页面未找到"并不意味着服务器不能欺骗你。做这样的事情很常见:

  • 发送404而不是403,以隐藏需要身份验证的资源。
  • 发送404而不是500,以隐藏某些内容无效的事实。
  • 出于某种原因阻止您的IP时发送404。

如果无法访问服务器,就无法知道窗帘背后的真实情况。

答案 1 :(得分:9)

你是对的:有人可以写" 404 Page Not Not Found"在HTML页面中,让您认为该页面不存在。

为了正确识别HTTP状态代码(如404),您应该使用Python捕获HTTP响应并进行解析。 HTTP 1和HTTP 2标准规定HTTP响应(以HTTP通用消息格式编写)必须包含状态代码。

HTTP响应示例(来自Tutorials Point):

HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
  <h1>Not Found</h1>
   <p>The requested URL /t.html was not found on this server.</p>
</body>
</html>

你绝对不应该相信HTML部分,它实际上可以在找到页面时显示404错误(甚至是418 I'm a teapot)。

答案 2 :(得分:4)

除了Anders的回答之外,我还找到了一种方法来检测404被Timing攻击误用的情况。但这并不可靠。

  • 发送404而不是403,以隐藏需要身份验证的资源。

通常服务器需要更多时间来确定“你没有获得此资源的授权”,因为他们需要更多往返于外部资源(如数据库),然后他们需要确定“这不存在”,通常甚至可缓存和很快就确定了。

使用RDBS作为后端的MVC应用程序中的典型示例是简单SELECT COUNT(id) FROM articles WHERE id=123 LIMIT 1之间的区别 而且复杂得多SELECT access FROM accesses JOIN articles ON articles.id = accesses.foreign_id WHERE articles.id = 123 AND accesses.type='articles' AND accesses.user_id = (SELECT id FROM users WHERE token='t0k3n' LIMIT 1)。这意味着应用程序可以首先进行这样的单行查询:更常见的是“获取用户,提取一些数据,现在获取Thing,现在询问Thing用户是否可以通过授权访问它” API”。

除非网站的开发人员或框架负责处理此案例,否则您经常会看到服务这两种情况的时间差异显着。

  • 发送404而不是500,以隐藏某些内容无效的事实。

通常,只有在运行某些代码后才会发生崩溃或意外错误。 404检测通常是早期的:毕竟,确定某些东西不存在是很便宜的(参见上文)。而错误将在以后发生。这意味着这样一个500隐藏的404错误通常会花费更长的时间才能达到正常的404。

  • 出于某种原因阻止您的IP时发送404。

此处,时间通常是相反的,具体取决于实施方式。这种IP阻塞通常会保留在Web应用程序(CMS等)之外,因为在堆栈中处理更高级别更加简单和高效:Web服务器,代理等。 然而,当应用程序本身处理这个问题时,生成实际的404通常相当便宜,而在数据库中查找IP,应用掩码等需要一些时间。类似于将403隐藏为404。