我试图创建一个php计数器,并且为了不计算来自同一访问者的重复访问,我一直在考虑saving the visitor's IP address into the database,我应该转向{{3 }}
我已经阅读了$_SERVER,这看起来很方便:
<?php
function get_IP() {
// ADDRESS IP
if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR');
else $ipaddress = 'UNKNOWN';
//return $ipaddress;
}
?>
但我已经完成了sample funtion by @Dusza,并发现其中存在安全漏洞,因为用户可以欺骗除REMOTE_ADDR之外的所有值,这些值可由代理修改。
所以我想当他们说存在安全漏洞时,这意味着当我将数据插入数据库进行一些绑定时,我应该清理用户的输入。
还有其他预防措施吗?
鉴于所有其他值都不可靠,我应该完全避免使用它们吗?
但REMOTE_ADDR的非剥离价值怎么样?这可以通过代理进行修改。
我应该采取什么样的路径?
如果您想进行投票或投票要关闭或删除,请离开 我评论为什么,所以我可以改进我的问题。感谢。
答案 0 :(得分:4)
REMOTE_ADDR
是通过3路TCP / IP握手建立的IP地址。响应将被发回的IP是IP。这是您的服务器验证的唯一内容。其他所有内容都只是任何人可以设置的任意HTTP标头。
现在,如果您知道您的服务器正在代理(例如负载均衡器)后面运行,这会掩盖访问者的IP地址(您的服务器只会看到代理&#39) ; s IP),但您知道代理有助于在HTTP标头中转发访问者的IP(作为此情况的解决方法,以便您的服务器仍然可以看到访问者&#39; s),然后只有可以使用其中一个HTTP标头,而只使用您知道代理设置的标头。 如果您的服务器不在代理服务器后面,请专门使用REMOTE_ADDR
。否则,请查阅您的代理手册并根据情况实施。