最近有人问我“是什么原因导致我们的 access.log 中出现这样的一行?”
59.56.109.181 - - [22/Feb/2010:16:03:35 -0800] “GET http://www.google.com/HTTP/1.1 ” 200 295 “-” “Mozilla/5.0(兼容;MSIE 5.01 ;Win2000)"
我的直接回答是有人在探索一些有点狡猾的东西。
但:
- 如何?推测... 一个简短的 perl 或 python 脚本可以很容易地连接并请求一个带有无效主机的 URL。
- 漏洞?当他们这样做时,有人在寻找什么,他们学到了什么,我们应该修补它吗?
- 我需要一顶锡箔帽来防止他们读懂我的想法吗?
- 对我来说真正的问题是:不应该是 404 响应,而不是 200!?
这是在标准 LAMP 服务器 (Ubuntu) 上。
也许你想阅读http://wiki.apache.org/httpd/ProxyAbuse
特别是这一点:“我的服务器已正确配置为不代理,那么为什么 Apache 返回 200(成功)状态代码?”,它问您的问题“不应该是 404 响应,而不是 200!?”
如果 apache conf 没问题,它只是发送根页面。这是因为你得到的状态码是 200。
我认为如果有人试图将服务器用作代理,就会发生这种情况。这将使 http://... URL “正常”(而不是您期望从常规服务器请求中获得的路径部分。)
至于 200 状态码,那... err.. 好吧,我的服务器也是这样做的。它似乎忽略了http://hostname部分并使用剩余路径从本地服务器返回结果。您可能必须深入研究 RFC 才能弄清楚为什么这样做是有意义的;我不知道答案。
假设您没有将服务器用作代理,这些可能是在面向 Internet 的 Web 服务器上经常看到的代理滥用的常见尝试。
收到状态代码 200 的请求可能会返回您的索引页。您可以使用
telnet
或进行检查curl
。假设:
您的服务器名称是
site.example.org
;第三方正在尝试连接
news.example.net
和search.example.com
;您的
/index.html
文件包含:使用curl,您可以重建收到的请求,如下所示:
使用telnet,您可以重建收到的请求,如下所示:
如果您收到您
index.html
的结果,这意味着您的服务器未配置为代理,您不必担心这些请求。如果您实际收到的内容
news.example.com
或news.example.net
您的 Web 服务器被配置为代理。您可以通过注释proxy on;
Nginx 配置中的任何行或禁用mod_proxy
Apache 配置来停用此功能。关于这个的一些有趣的参考: