0

我正在做一个项目,我们的 Web 应用程序之一将以某种方式使用 JavaScript 代码来收集有关访问者的统计信息但据我所知,在服务器端 PHP 应用程序上,我应该以某种方式处理代码,即多次刷新不计算在内,并且基于 IP 的计数不是一个好主意,因为许多用户可能具有相同的 IP、cookie 或会话也容易受到这个问题的影响,因为 cookie 管理器可以清除与站点相关的所有 cookie,因此 PHP 不会识别用户并将其计数为新用户,时间框架作业和所有其他解决此问题的方法也一样我知道基于 cookie 或会话或 ip 或 ip/referrer 和来自标头的所有其他可用数据的混合,我如何处理它并从用户那里获得更可靠的数据,并且不允许他们创建虚假统计信息。因为我相信一定有办法(我希望如此)......!?

4

1 回答 1

1

我认为 cookie 是解决这类问题的理想选择,但如果你不想使用它,那么你自己就有了一个坚韧的 cookie。不幸的是,由于 HTTP 是无状态的,因此您没有很多其他选择。

在这种情况下,我会使用会话变量,因为用户无法干预保存在那里的数据。然而,存在会话劫持的风险,但如果您的站点对该漏洞持开放态度,则您需要在更全局的层面上保护站点,而不仅仅是命中计数器。session 变量绑定到您的站点,因为其中的数据保存在服务器上而不是用户浏览器中。并且绑定到您的用户,因为它在用户浏览器中保存一个带有密钥的 cookie,以从服务器请求数据。

这是一个示例,说明如何实现这一点,而不必担心删除站点上的其他会话。

<?php
function hit_counter() {
    if(isset($_SESSION['hit_counter'])) { // Check if the user has the hit_counter session
        if(isset($_SESSION['hit_counter']['time']) && isset($_SESSION['hit_counter']['page'])) { // Check if the user has the time and the page set from the last visit
            $last_time = $_SESSION['hit_counter']['time'];
            $last_page = $_SESSION['hit_counter']['page'];

            $now = time(); // The current UNIX time stamp in seconds
            $current_page = $_SERVER['REQUEST_URI']; // The page name

            /*
                If the users hasn't requested this page
                in the last 10 seconds or if the user 
                comes from another page increment the 
                hit counter
            */
            if(($now - $last_time) > 10 || $last_page != $current_page) {
                /* INCREMENT YOUR HIT COUNTER HERE */
            }
        }

        unset($_SESSION['hit_counter']); // Delete this hit counter session
    }

    // And create a new hit counter session
    $_SESSION['hit_counter'] = array();
    $_SESSION['hit_counter']['time'] = time();
    $_SESSION['hit_counter']['page'] = $_SERVER['REQUEST_URI'];
}
?>

您将永远不会触及任何其他会话变量,因为您只是在unset()输入命中计数器变量。不需要你处理session_destroy(),但你需要确保session_start()在你想使用函数的每个页面的开头都有一个。

如果您只想在用户来自您网站上的另一个页面时计算点击次数,您可以编辑脚本以不考虑时间。

据我所知,这是一个对大多数站点具有合理安全级别的计数器。或者至少是一个好的开始。

有关PHP 会话的更多信息。

于 2012-11-15T23:11:17.920 回答