2012-11-15 52 views
0

我正在一個項目,其中一個我們的Web應用程序將以某種方式收集JavaScript代碼關於訪問者的統計信息但據我所知在服務器端PHP應用程序我應該以某種方式以多刷新不計算的方式處理代碼並且基於IP計數並不是一個好主意,因爲許多用戶可能具有相同的IP,cookie或會話也容易受到這個問題的困擾,因爲cookie管理器可以將所有cookie相關的網站,所以PHP不會識別用戶,並計算它新的,時間表工作和所有其他方式來解決這個問題也據我所知,基於cookie或會話或IP或IP的混合物/ referrer和頭部的所有其他可用數據,我如何處理它並從用戶那裏獲得更可靠的數據,並且不允許他們製造假貨統計。因爲我相信一定有辦法(我希望如此)...!?防止多刷新統計腳本

+1

IP,會話和cookie(標題數據)是您可以從用戶獲得的所有數據,它們都可以被刪除或僞造。它的最終用戶隱私和他們有權訪問它 –

+0

在JavaScript中使用'localStorage'(在您使用Ajax調用PHP代碼之前...)。第一次你填寫'localStorage'並在你確認'localStorage'是否有舊數據=>什麼都不做 –

+1

要添加到@ MohdMoe的觀點,引用數據(如你建議使用的)也可以僞造。您最好的選擇是使用會話數據,如果您相信您的用戶不會僞造統計信息,或者如果您不信任IP地址,請使用會話數據。 –

回答

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(),您希望使用該功能。

您可以編輯腳本以不考慮時間if如果用戶來自您網站上的其他網頁,則只需計算點擊次數。

這是據我所知,這是一個對大多數網站具有合理安全級別的計數器。或者至少是一個好的開始。

有關PHP sessions的更多信息。

+0

所以沒有其他辦法,生病嘗試在我的應用程序中考慮會話方式,並看看我能得到多少多少 感謝代碼示例的方式 – Darkc0d3r

+0

不幸的是,由於HTTP是無狀態的(即每個請求都是新的且獨特的)。沒有其他方法可以知道請求來自誰。歡迎您:) – fimas

+0

您可以添加一個安全措施,在會話var中添加一個字段,您可以在其中保存根據用戶信息創建的唯一散列。 '<?php $ _SESSION ['hit_counter'] ['user_hash'] = sha1($ _ SERVER ['HTTP_USER_AGENT']。$ _ SERVER ['REMOTE_ADDR']); ?>'。您可以將更多數據添加到哈希中以使其更加獨特。 – fimas