为什么 apache 会将代码为 200 的 GET http://www.google.com 请求记录下来?

为什么 apache 会将代码为 200 的 GET http://www.google.com 请求记录下来?

最近有人问我“是什么原因导致我们的 access.log 中出现这样的行?”

59.56.109.181 - - [22/Feb/2010:16:03:35 -0800] “获取http://www.google.com/HTTP/1.1” 200 295“-” “Mozilla/5.0(兼容;MSIE 5.01;Win2000)”

我立即回答说,这是有人在探索一些有点狡猾的东西。

但:

  • 怎么办?推测... 一个简短的 perl 或 python 脚本可以轻松连接并请求具有无效主机的 URL。
  • 漏洞?人们这样做是为了什么?他们学到了什么?我们应该修补它吗?
  • 我是否需要戴一顶锡箔帽来阻止他们读懂我的心思?
  • 对我来说真正的问题是:这难道不应该是 404 响应,而不是 200 响应吗?

这是在标准 LAMP 服务器(Ubuntu)上。

答案1

也许你想读http://wiki.apache.org/httpd/ProxyAbuse

特别是这一点:“我的服务器已正确配置为不使用代理,那么为什么 Apache 返回 200(成功)状态代码?”,它会问你的问题“这不应该是一个 404 响应,而不是 200!?”

如果 apache 配置没问题,它只会发送根页面。这是因为您获得的状态代码是 200。

答案2

我认为如果有人尝试将服务器用作代理,就会发生这种情况。这会使 http://... URL 变得“正常”(而不是您期望从常规服务器请求中获得的路径部分)。

至于 200 状态代码,那...呃...好吧,我的服务器也是这样。它似乎忽略了http://主机名部分并使用剩余路径从本地服务器返回结果。您可能必须仔细研究 RFC 才能弄清楚为什么这样做有意义;我不知道答案。

答案3

假设你没有使用你的服务器作为代理,这些可能是代理滥用在面向互联网的网络服务器上经常看到。

收到状态代码 200 的请求可能返回了您的索引页。您可以使用以下方法检查telnet或者curl

假设:

  • 您的服务器名称是site.example.org

  • 第三方正在尝试连接news.example.netsearch.example.com

  • 您的/index.html文件包含:

      <!DOCTYPE html>
      <html>
      <head><title>It works!</title></head>
      <body><h1>It works!</h1></body>
      </html>
    

使用卷曲,您可以像这样重建收到的请求:

$ curl site.example.org --request-target http://news.example.net/
<!DOCTYPE html>
<html>
<head><title>It works!</title></head>
<body><h1>It works!</h1></body>
</html>

使用远程登录,您可以像这样重建收到的请求:

$ telnet site.example.org 80
> GET http://news.example.com/ HTTP/1.1
> Host: news.example.com
>
HTTP/1.1 200 OK
...
Content-Type: text/html
...

<!DOCTYPE html>
<html>
<head><title>It works!</title></head>
<body><h1>It works!</h1></body>
</html>

如果您收到index.html结果,则表示您的服务器未配置为代理,您不必担心这些请求。

如果您确实收到了内容,news.example.com或者news.example.net 您​​的 Web 服务器配置为代理。您可以通过注释proxy on;Nginx 配置中的任何行或在mod_proxyApache 配置上禁用来停用此功能。

关于此的一些有趣的参考资料:

相关内容