【问题标题】:Updating unique views based on IP and user agent string根据 IP 和用户代理字符串更新唯一视图
【发布时间】:2016-06-10 08:56:12
【问题描述】:

我有一个表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 异步添加视图)。

此外,这是缓慢/低效还是可以?

【问题讨论】:

  • Opera 浏览器和/或 Safari 浏览器(我忘了哪个)可以选择查看提供其他用户代理标签的内容,也有各种用于 Firefox 的插件可以做同样的事情,您可以在其中选择什么您发送到与之交互的服务器的用户代理字符串的排序。更难区分的是您的用户群中有多少百分比可能正在使用这些功能?这决定了是否值得花时间关心它......
  • 一般应该使用VARCHAR而不是TEXT,除非尺寸很大。
  • @Barmar 我指定VARCHAR 的长度是多少?
  • 您希望允许的最大尺寸。
  • 如果我将VARCHAR 设置为 10 并且 IP 大于 10 个字符,那怎么办?我只使用TEXT,因为 60k+ 个字符或任何它可能是安全的。

标签: php mysql sql


【解决方案1】:

您不应该依赖用户代理,它是由客户端发送的,它可以由用户在浏览器中定义,cURL 客户端等。想要增加此计数器的用户可能会执行无限随机用户代理的请求数量,即使来自相同的 IP 地址,并用虚假数据填充您的数据库。

例如,可以使用Firefox add-on 来完成。


我建议仅使用 IP 地址来区分访问者。更改 IP 地址(使用 VPN 并不容易)比更改用户代理要困难得多。这些数字将接近实际访问者的数量。

【讨论】:

  • 我是这么认为的。问题是如果有多个人在同一个 IP 地址上,那么它不会计算视图。 Stack Overflow 是如何做到的?
  • @frosty 我不知道 Stack Overflow 是怎么做的,抱歉。
  • @frosty 做这种事情的常用方法是使用 cookie。
  • 用户代理如何帮助您区分同一IP上的不同人?如果他们都使用相同的浏览器,则用户代理将是相同的。
  • 对,除了要求用户进行身份验证,没有万无一失的方法。
【解决方案2】:

实际上没有“确定”的方法来检查独特的视图。

对于 IP 地址,用户可以使用 VPN、代理服务器等修改其 IP 地址。

对于用户代理,用户可以定义自己的用户代理,通常在开发人员选项中。即使在 iOS 中,Safari 中也有一个Request Desktop Site

为了存储 Cookie,用户还可以删除 Cookie,因此每个访问的页面都会产生 1 次查看。

因此,没有万无一失的方法来检测唯一身份访问者。

一种方法是在用户的浏览器中存储一个Cookie,这样如果找到了Cookie,就不会记录IP。尽管用户可以删除 Cookie,但通常人们不会这样做。这会比只使用 IP 更准确。

【讨论】:

  • 我不介意他们可以这样作弊,只要他们可以荒谬地增加浏览量,从而影响帖子的热度(假设考虑浏览量)
  • @frosty 通常,人们不会那样做,因此使用 IP 仍然是 PHP 中最好的方法。观看次数将是实际观看次数的衡量标准。另一种方法是使用外部工具,例如 Google Analytics?
  • @frosty 为了更准确,您还可以先存储一个 Cookie,这样如果用户使用 VPN 或更改他们的 IP,您将检测到 Cookie 而不会跟踪他们的 IP 地址跨度>
  • 我很确定 Google Analytics 主要使用 cookie。
  • 等等,如果没有存储 IP,他们可以运行脚本通过不断删除 cookie 来添加无限视图,不是吗?我认为仅 IP 是最好的选择……
【解决方案3】:

区分不容易被欺骗的不同用户的唯一方法是要求他们进行身份验证。

跟踪用户的常用方法是使用 cookie。用户可以删除cookies,所以并不完美,但一般不会。

当用户连接时,检查是否设置了跟踪cookie。如果不是,则生成一个随机字符串,将其设置为 cookie 值,并将其插入数据库。如果已设置,请在数据库中搜索具有此值的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多