Php 防止多重刷新以依赖统计脚本

Php 防止多重刷新以依赖统计脚本,php,Php,我正在做一个项目,我们的一个web应用程序将以某种方式使用JavaScript代码来收集访问者的统计信息,但据我所知,在服务器端PHP应用程序中,我应该以某种方式处理代码,多次刷新不算数,而基于IP的计数并不是一个好主意,因为许多用户可能具有相同的IP,cookie或会话也容易受到此问题的攻击,因为cookie manager可以删除与站点相关的所有cookie,因此PHP不会识别用户并将其计算为新用户,据我所知,基于cookie、会话或ip,或者ip/推荐人和来自header的所有其他可用数据

我正在做一个项目,我们的一个web应用程序将以某种方式使用JavaScript代码来收集访问者的统计信息,但据我所知,在服务器端PHP应用程序中,我应该以某种方式处理代码,多次刷新不算数,而基于IP的计数并不是一个好主意,因为许多用户可能具有相同的IP,cookie或会话也容易受到此问题的攻击,因为cookie manager可以删除与站点相关的所有cookie,因此PHP不会识别用户并将其计算为新用户,据我所知,基于cookie、会话或ip,或者ip/推荐人和来自header的所有其他可用数据的混合,时间段作业和所有其他绕过此问题的方法也是如此。我如何处理它,从用户那里获得更可靠的数据,并且不允许他们创建虚假的统计数据。我相信一定有办法(我希望如此)

我认为饼干是解决这类问题的理想选择,但如果你不想使用它,那么你就有了一块很难对付的饼干。不幸的是,由于HTTP是无状态的,所以您没有很多其他选项

在这种情况下,我将使用会话变量,因为用户不能干预保存在那里的数据。然而,存在会话劫持的风险,但是如果您的站点对该漏洞开放,您需要在更全局的级别上确保站点的安全,而不仅仅是点击计数器。会话变量绑定到您的站点,因为其中的数据保存在服务器上,而不是用户浏览器中。并绑定到您的用户,因为它在用户浏览器中保存了一个带有密钥的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'];
}
?>

IP、会话和cookie(头数据)是您可以从用户那里获得的所有数据,它们都可以被删除或伪造。它的最终用户隐私,并且他们可以通过javascript中的iTunes
localStorage
(在使用ajax调用PHP代码之前…)进行访问。在第一次填充
localStorage
时,在验证
localStorage
是否有旧数据=>不添加到@MohdMoe的点之后,也可以伪造引用者数据(如您建议使用的)。如果您相信您的用户不会伪造统计数据,则最好使用会话数据,如果您不相信,则最好跟踪IP。没错,正如您在上文中指出的,许多用户可能位于同一IP上,但他们(不得)在cookie中具有相同的加密密钥,您可以使用指纹(使用IP、用户代理、会话密钥创建哈希)来标识每个用户,但是,如果用户删除了cookie@Fesslocalstorage也可以由用户操作,因此没有其他方法,我将尝试在我的应用程序中考虑会话方式,看看我能在多大程度上得到感谢,顺便说一下,因为HTTP是无状态的(也就是说,每个请求都是新的和唯一的)。没有其他方法可以知道请求来自谁。欢迎您:)您可以在会话变量中添加一个字段,用于保存根据用户信息创建的唯一哈希,例如
。您可以向哈希中添加更多数据,使其更具唯一性。唯一性并不是全部,因为我们的数据偶合会话(会话在cookie中处理其会话id,这样它可以被删除,然后就没有会话了,所以新会话新用户)正如您在示例和注释示例中所说的那样,我所能做的就是以某种方式强化过程,但是谢谢你的建议