如果我将这两个都存入数据库中,是否足以防止网站访问者伪造他们来自不同的IP地址?
$ip1 = $_SERVER['HTTP_X_FORWARDED_FOR'];
$ip2 = $_SERVER['REMOTE_ADDR'];
如果我将这两个都存入数据库中,是否足以防止网站访问者伪造他们来自不同的IP地址?
$ip1 = $_SERVER['HTTP_X_FORWARDED_FOR'];
$ip2 = $_SERVER['REMOTE_ADDR'];
HTTP_X_FORWARDED_FOR
是一个HTTP头,因此可以很容易地被欺骗。REMOTE_ADDR
是由Web服务器提供的环境变量,如CGI规范中所指定的那样。它不容易被欺骗。因此对缓存任何一个都没有真正的意义。
如果有人使用受损代理服务器欺骗HTTP_X_FORWARDED_FOR
头,则您无法对此做太多事情。
但是,应该更容易信任非代理请求未伪造的内容,因为除非攻击者与其位于同一子网上,否则它们仅限于盲目的欺骗攻击,这需要他们猜测TCP连接的序列和确认号。在现代网络中,这非常难以实现。即使他们设法做到了,他们也无法接收路由到伪造IP的任何数据,因此很容易过滤掉任何盲目的欺骗攻击。
现在,实际上不可能(好吧,没有什么是不可能的,但它确实需要非常特定的情况并且应用范围有限)有人使用伪造的IP向Web服务器进行匿名TCP连接。大多数情况下,数据包欺骗只用于DDoS和洪水攻击。
不,伪造头部信息X-FORWARDED-FOR
非常容易。尝试创建一个账户系统或者依赖于电子邮件等其他方式。你不能仅仅信任IP地址。
根据你上面的评论,$_SERVER['REMOTE_ADDR']
很可能就足够了,因为他们每次想要执行该操作都必须更改IP地址,这将涉及代理或最有可能是Tor。
当任何用户使用代理服务器访问您的网站时,这两个值都是不同的。您可以使用HTTP_X_FORWARDED_FOR服务器变量获取IP地址。因此,在这种情况下,“HTTP_X_FORWARDED_FOR”由代理服务器发布,描述客户端IP,而“REMOTE_ADDR”描述代理服务器的IP。
当任何用户在没有任何代理服务器的情况下访问您的网站时,您可以使用REMOTE_ADDR服务器变量获取IP地址。因此,在这种情况下,HTTP_X_FORWARDED_FOR和HTTP_VIA将不可用。
$_SERVER['REMOTE_ADDR']
将显示远程端点的IP地址,这在连接过程中很难伪造,但在连接的任一端点附近更容易伪造,但该主机上的程序可能会恶意冒充您的某个用户。你真正想要衡量或预防什么? - sarnold