【一次和黑客对抗的浮想】Http中几个不常见的地址请求头

1,281 阅读3分钟

这是我参与8月更文挑战的第六天,活动详情查看:8月更文挑战

HTTP 请求头中的 X-Forwarded-For及几个相关请求头

最近脑子抽风,老是想着和黑客们对抗一下。最近就想到一个问题,如果一个黑客恶意访问我的网站,我改怎么办?这还用说,照我的脾气,肯定是找到他,搂他一顿!那么问题来了,怎么找到他呢?于是,我上网查资料,发现http中有这么几个请求头是有关访问地址记录的。

remote_addr

是最近一次代理服务器或者直接是客户端(中间不存在任何代理服务器的情况)的请求ip;其不可以伪造,因为TCP的建立是要经过三次握手的,如果伪造了源ip,就无法建立TCP,所以伪造remote_addr是一件没有意义的事情;

X-Real-IP

这是一个自定义头,X-Real-Ip 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-Ip 目前并不属于任何标准,代理和 Web 应用之间可以约定用任何自定义头来传递这个信息

X-Forwarded-For(获取到的并不一定真实)

这是一个扩展头。这是唯一一个在拥有代理服务器的情况下,能够获得客户端ip地址的请求头。他的请求头格式为:

X-Forwarded-For:client,proxy1,proxy2

例如,一个http请求到达服务器之前经过了三个代理,name最终服务器获得的信息如下:

X-Forwarded-For:IP0,IP1,IP2

最开始的ip0就是真实客户端请求地址,其次依次是离客户端最近的1,2号代理服务器。

那么,为什么记录中没有最后一个代理服务器的ip呢?那就要从它的工作流程说起了!

在整个http请求过程中,每个服务器都记录了上一个服务器传递过来的信息,然后将上一个服务器信息追加到这个信息的后面,并且将这些消息传递给下一个服务器。以此类推,最后一个服务器只是将上一个服务器信息追加到之前所有代理服务器信息的后面,并没有将自己的信息放入,然后直接发给服务器端了。这样就造成了整个请求头信息中,包含了http请求过程中经过的所有代理服务器的信息,但是就是没有最后一个代理服务器的地址信息,如果我们想要获取到最后一个服务器的信息,那么该怎么办?我们就可以用remote_addr字段来获取(以上论述中的信息都是指该请求头中的信息)。

这么看来,X-Forwarded-For插件,然后就可以自定义自己的X-forward-For请求头ip了。所以,我们最好还是通过客户端自己带上ip来获取访问者ip。请求头中携带的ip地址能让我们找到真正的访问者ip,其实不然,这个地址也是可以伪造的。比如,就可以在火狐浏览器中下载一个X-Forwarded-For插件,然后就可以自定义自己的X-forward-For请求头ip了。所以,我们最好还是通过客户端自己带上ip来获取访问者ip。所以此次和黑客的联想对战,我输了,还是我太菜鸡了!!!