限制基于IP或Cookie的用户活动?

时间:2011-01-24 22:29:12

标签: php security session ip voting-system

我正在开发一个PHP脚本,允许用户对某些项目进行投票。任何用户是否登录都可以投票。请考虑以下情况:

  1. 如果用户已登录,我可以记录用户的ID,如果他再次尝试投票,可以限制对同一项目的投票。
  2. 如果用户未登录,我可以记录用户的IP,并限制对来自同一IP的同一项目的投票。
  3. 如果是第一种情况,则无需记录IP。现在,第二个案例让我疯了。我想知道用户可能正在更改IP,然后再次对同一项目进行投票。现在,即使我使用Cookie或会话变量,也可能发生用户正在开始新会话(或已删除cookie)以再次对同一项目进行投票。

    我错过了什么吗?如果没有,如何处理这种情况?有什么想法吗?

3 个答案:

答案 0 :(得分:6)

我会认真考虑使用Captcha,reCaptcha是一个不错的选择。

您可以通过IP地址进行限制,但可以让许多人共享1个IP地址,例如小型学校或企业。它也很容易绕过因为代理是免费的和充足的。它也容易出错,因为有时负载均衡器会在会话期间更改IP地址。如果你真的想限制每人的投票数量,最好的办法是要求他们登录用户账户并将投票存储在你的数据库中。

答案 1 :(得分:2)

首先,有几种方法可以使用PHP获取客户端的IP地址。以下是我所知道的3种方法:

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    $ipAddress = $_SERVER['HTTP_CLIENT_IP'];
} else if (isset($_SERVER['REMOTE_ADDR'])) {
    $ipAddress = $_SERVER['REMOTE_ADDR'];
}

其次,如果您担心易失性存储(例如cookie或会话),最好有一个存储这些值的数据库表。它可以是一个包含3列的简单表:client_ip,item_id和date_created。这将允许您跟踪是否使用特定的IP地址为某个项目投票。

现在,我看到的唯一问题是客户端是在工作并坐在代理后面。所以,我猜你有几个选择,每个选项各有利弊。

答案 2 :(得分:1)

您可以尝试使用evercookie,这有点难以清除