我正在构建一项功能,允许用户每24小时只投票一次。
这是我的数据库结构
id ip timestamp userid
9 127.0.0.1 2013-06-27 16:52:49 35
我使用此函数来获取用户客户端的地址,我在localhost环境中并且它一直给我localhost ip 127.0.0.1而不是我的公共ip。它有什么问题吗?
function get_client_ip() {
$ipaddress = '';
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;
}
这个功能的逻辑是否有问题,我的想法是
1)首先查询tabel以查看用户的ip是否持久化。如果是这样,他/她投了票 2)检查当前时间戳的投票时间戳,如果他的投票时间在24小时之前,则允许他再次投票。
我关心的不是时间戳,而是ipaddress。我不知道我构建的功能是否足以获得他的ipaddress,即使他落后于代理。
建议表示赞赏。感谢
干杯
答案 0 :(得分:1)
我很害怕,但是可靠地确定用户是否已经投票的唯一方法是让他们进行身份验证。依赖IP地址将无法工作,因为用户可以断开连接并重新连接到Internet并获取新IP或使用代理。依赖cookie不会起作用,因为cookie很容易被删除。
无论如何,如果你想坚持知道它不会工作的IP地址解决方案100%检查这个问题的解决方案,以获得一个很好的函数来获取IP地址:What is the most accurate way to retrieve a user's correct IP address in PHP?
答案 1 :(得分:0)
为什么不设置cookie? 您设置了24小时的到期时间。 我知道这不是100%安全,但我可以轻松地重新连接到互联网以更改我的IP,所以ip检查也是“不安全”。
if $_COOKIE["alreadyVoted"] throw new Exception(...)
http://php.net/manual/en/features.cookies.php
http://www.php.net/manual/en/function.setcookie.php
希望这有帮助。