0

私は、訪問者に関する統計情報を収集するためのJavaScriptコードをWebアプリケーションの1つにするプロジェクトに取り組んでいます。しかし、サーバー側のPHPアプリケーションで知っている限り、マルチリフレッシュがカウントされない方法でコードを処理する必要があります。多くのユーザーが同じIP、Cookie、またはセッションを持っている可能性があるため、IPベースでカウントすることはお勧めできません。また、Cookieマネージャーはサイトに関連するすべてのCookieを消去できるため、PHPがユーザーを認識して新しいものをカウントしないため、この問題に対して脆弱です。時間枠のジョブや、この問題を回避するための他のすべての方法も、私は、Cookie、セッション、IP、またはIP / Referrerとヘッダーから利用可能な他のすべてのデータの組み合わせに基づいて、それを処理してユーザーからより信頼性の高いデータを取得し、偽の統計を作成することを許可しない方法を知っています。私は方法があるに違いないと信じているので(私はそう願っています)...!?

4

1 に答える 1

1

この種の問題にはCookieが理想的だと思いますが、それを使用したくない場合は、タフなCookieを使用することになります。残念ながら、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'];
}
?>

unset()ヒットカウンター変数のみを使用しているため、他のセッション変数に触れることはありません。を処理する必要はありませんが、関数を使用するすべてのページの先頭にが含まれsession_destroy()ていることを確認する必要があります。session_start()

ユーザーがサイトの別のページからアクセスした場合にのみヒットをカウントしたい場合は、時間を考慮しないようにスクリプトを編集できます。

これは私が見る限り、ほとんどのサイトで適切なレベルのセキュリティを備えたヒットカウンターです。または、少なくとも良いスタートです。

PHPセッションに関する詳細情報。

于 2012-11-15T23:11:17.920 に答える