我有一个表temp_views
,它根据帖子的ID、用户的IP及其用户代理字符串存储临时视图(一个小时)。
SELECT COUNT(*) as viewed
FROM temp_views
WHERE showcase_id=:showcase_id AND ip=:ip AND user_agent=:user_agent
IP 和用户代理都作为简单TEXT
存储在表中。(我应该以另一种方式这样做吗?
如果viewed
为 0,则添加视图 - 否则不执行任何操作。
我想知道的是,这能被"玩弄"吗?如果 IP 匹配但用户代理不匹配,则它将添加一个视图。用户代理可以轻易欺骗还是什么?(当用户向下滚动页面时,视图与 Ajax 异步添加)。
此外,这是缓慢/低效还是可以?
实际上没有"确定"的方法来检查唯一视图。
对于 IP 地址,用户可以使用 VPN、代理服务器等修改其 IP 地址。
对于用户代理,用户可以定义自己的用户代理,通常在开发人员选项中。即使在iOS中,Safari中也有Request Desktop Site
。
为了存储 Cookie,用户还可以删除 Cookie,因此访问的每个页面将导致 1 次浏览计数。
因此,没有万无一失的方法来检测唯一身份访问者。
一种方法是在用户的浏览器中存储一个 Cookie,因此如果找到 Cookie,则不会记录该 IP。即使用户可以删除 Cookie,通常人们也不会这样做。这比仅使用 IP 更准确。
区分无法轻易欺骗的不同用户的唯一方法是要求他们进行身份验证。
跟踪用户的常用方法是使用 cookie。用户可以删除cookie,所以它并不完美,但他们通常不会。
当用户连接时,检查是否设置了跟踪cookie。如果不是,请生成一个随机字符串,将其设置为 cookie 值,然后将其插入数据库。如果已设置,请在数据库中搜索具有此值的行。
你不应该依赖用户代理,它是由客户端发送的,它可以由用户在浏览器中定义,cURL 客户端等。想要增加此计数器的用户可能会使用随机用户代理执行无限数量的请求,即使来自相同的 IP 地址,并用虚假数据填充您的数据库。
例如,它可以通过Firefox附加组件来完成。
我建议只使用IP地址来区分访问者。更改 IP 地址(使用 VPN 并不容易)比更改用户代理要困难得多。这些数字将接近实际访客的数量。