如何避免用户删除他的会话

How to avoid that a user removes his session

用例

目前,我正在尝试构建一个用户可以对内容进行投票的页面(up/downvote,类似于 StackExchange 网络上的功能)。但是用户不需要自己注册就可以对内容进行投票。所以这将是一种 “匿名”投票页面。它是用 Laravel5 构建的,并使用 MySQL 数据库来存储选票。用户会话存储在平面文件中,但也可以存储在数据库中 table(L5 在这里非常灵活)。


问题

如何保证安全?.

我正在用户会话中存储限制和已投票的内容,例如当用户对内容 XYZ 投票时(因此用户暂时不能对特定内容再次投票)。这些限制是基于时间的,主要是 24 到 48 小时。这很有效,只要用户不扔 away/delete 他的 cookies,这将导致创建新会话并删除时间限制,这可能会导致 轻松投票欺诈.

那么,如何避免用户“丢失”他的session呢?重点是如何让每个“匿名”用户的约束和限制持续存在!匿名投票时无法避免共享 PC 或在不同位置投票,但需要使用给定的解决方案来避免“机器人”或大量投票欺诈。


解决方案尝试

Setting the sessionId of each users session to a combination of IP and User-Agent

我已经就此尝试提出了一个问题(链接如下),但它会带来更多问题,然后再解决(例如简单的会话欺骗)。另外,我无法使用 Laravel5.

手动设置 sessionID

不适合的解决方案


相关

由于没有存储和维护用户,因此非常困难,无法 100% 确定。

我最接近地尝试实现这一目标的方法是使用请求 ip 地址和 csrf 令牌。 您可以从 laravel 应用程序中的任何地方请求和 csrf_token() 获取 IP 地址。

这是我将如何实施的示例

创建一个 table 具有以下字段的命名投票

  • votable_type
  • votable_id
  • ip_address
  • csrf_token

我会检查客户端是否没有相同 votable 类型和 ID 的现有记录。客户是csrf_token。 ip用于保证请求是否合法

votable type和id之间的多态关系可以是评论,帖子等

without persisting user identification in anyway some users might not be either vote or some might vote twice. it can't be done perfectly.

  • some users might vote from different user agents multiple times.
  • some users might spoof ip. clear cookies
  • different users might be using same system to login.
  • some users might be using different connections or system logins.

so either we take any information it wouldn't be 100% accurate.

我的解决方案是实施 evercookie to assign a "Identification Cookie" per user, detecting privacy browsing 并在启用隐身模式或隐私浏览时限制访问,最后在没有 evercookie 时限制一些操作(在我的情况下是投票)。