在我的一个网站中,我记录了对服务器的所有 URL 请求。我记录这些数据是为了统计目的,以改进网站。
日志看起来像
http://example.com/search 2016-01-12 23:03:09
http://example.com/post/1234 2016-01-12 23:03:12
..........
所以,这看起来很正常。我现在在日志中发现了一些对我来说不合理的东西,我有几百个带有不同域名的条目
http://dhg.example.org/httptest.php 2016-01-10 20:12:15
过去我也遇到过类似的问题,与我的域名或服务器 IP 地址有关
http://example.com/httptest.php
http://192.0.123.12/httptest.php
我想知道为什么对我的服务器发出的请求有该 URL 而不是我的网站 URL 或服务器 IP。
我应该担心吗?这是对我的服务器的某种攻击吗?
编辑
具体来说,服务器上运行的应用程序会记录这些 URL,而不是服务器本身。因此,在每个页面请求中,我的脚本都会将 URL 记录在数组$_SERVER
中
答案1
$_SERVER
当您说正在使用来自的值时,大概您的意思是$_SERVER['HTTP_HOST']
。
将此值设置为任意值非常容易——它来自向您的服务器发送的请求中的 HTTP“Host:”标头。例如,您的服务器的 IP 为 1.2.3.4:
curl -H 'Host: otherserver.com' http://1.2.3.4/httptest.php
你的日志系统可能会将其重新组装成一个请求http://otherserver.com/httptest.php。
在您的网络服务器上尝试这样的请求,看看您的日志中发生了什么!
我只能猜测为什么有人会这样做。人们可能想测试在 IP 地址上运行的 HTTP 服务,但不知道那里的任何有效主机名。一些 Web 服务器可能会拒绝没有“Host:”标头的请求,因此发送/some/“Host:”标头可能比没有要好。
此外,有时恶意 URL 似乎会被发送到服务器,以便它们最终出现在日志中,服务器管理员可能会看到这些 URL 并可能点击它们。
一个好的安全做法是删除与server{}
Nginx 中的默认块建立的连接。这是缺少或无效Host:
标头的连接所在的位置。以下是示例:
server {
listen 80 default_server;
server_name _; # some invalid name that won't match anything
return 444;
}
444 响应代码是 Nginx 特有的。它只是关闭连接并且不返回任何内容,从而最大限度地减少您在这些连接上花费的带宽和资源使用。