2009-07-29 30 views

回答

11

永遠不要依賴來自客戶端的信息。在這種情況下,您遇到了簡單的網絡問題(您永遠無法確定客戶端的IP地址是否正確),而在其他情況下,客戶端可能會故意欺騙信息。

如果您需要唯一標識您的客戶,請在首次訪問時向他們提供一個cookie,這是您可以做的最好的。

0

我不認爲還有其他辦法做你想做的事。這是因爲代理服務器代理客戶的請求並代表他們行事。所以,從服務器的角度來看,客戶端實際上是隱藏的。但是,我可能是錯的。

0

如果您知道代理服務器,我認爲這意味着這是某種公司的LAN。你在控制局域網嗎?也許構建和安裝一些ActiveX服務器插件可以爲服務器發送一個機器唯一ID。

通常,HTTP代理服務器是而不是需要發送其客戶端的IP。因此,代理髮送的每個請求看起來都來自代理的IP。 (雖然維基百科提到了一些自定義標頭,但一些代理髮送到client's ip。)

當HTTP代理本身使用另一個HTTP代理時,它會變得更糟 - 獲取請求的服務器只會獲得IP代理鏈中的最後一個代理,並且不能保證第二個代理甚至知道第一個代理不是常規客戶端!

5

你最好的選擇是:

$uid = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']); 

但是,有沒有辦法知道他們是否改變了他們的用戶代理或不同的瀏覽器。

+2

如果同一代理背後只有兩個人使用相同的瀏覽器,則這不起作用。 – deceze 2009-07-29 04:58:37

+0

確切地說,沒有辦法100%確定它是誰,你可以使用不同的$ _SERVER變量的組合,並祈禱它們會以某種方式獨一無二。 – OneOfOne 2009-07-29 05:02:28

4

你可以使用一些其他的標題來幫忙,像這些的(那些浮現在腦海在$_SERVER轉儲看時):

  • HTTP_USER_AGENT
  • HTTP_ACCEPT
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_CHARSET

使用多個信息來自客戶端將幫助differenciate不同的客戶端(您使用的更多信息,更多的機會,你有那些至少有一個是不同的兩個客戶端之間)...

...但它不會是:-(

一個完美的解決方案根據不同的類型的代理軟件和它的配置,可能會有一個名爲X-Forwarded-For頭,你可以使用:

的X Forwarded-對於(XFF)HTTP標頭 是一個發明cto標準,用於識別 客戶端的始發IP地址 通過 HTTP代理或負載平衡器連接到Web服務器。這是 非RFC標準請求頭,其中 是由Squid緩存 代理服務器的開發人員引入的。

但我不會依賴其:它可能不會永遠存在(不認爲其要求)

祝你好運!

+0

X-Forwarded-For可用於確切的情況。你不能依賴它,特別是對於唯一性,但它是有用的。 – zombat 2009-07-29 06:07:58

0

JKS,

遠程機器沒有唯一的標識符。這是不可能的。

由於安全原因,開發者通常喜歡在最終用戶使用類似登錄的表單訪問頁面時跟蹤機器。

這是我做的:我存儲一個cookie,一個會話變量,並使用新的html5 localStorage來跟蹤我的敏感頁面上的人。這是真正做到這一點的唯一方法。關於localStorage的好處(當瀏覽器可以做到這一點時),最終用戶通常不知道您正在將東西存儲在他們的機器上,並且刪除cookie沒有任何影響。

所以,你可能做一個數據庫表跟蹤的細節,如: 時間戳,IP_ADDRESS USER_AGENT

然後讓我們說你是跟蹤失敗的登錄嘗試。我這樣做:

if(isset($_SESSION['failed_logins'])) { 
     $failed_logins = $_SESSION['failed_logins']; 
     $_SESSION['failed_logins'] = ($failed_logins + 1); 
} else { 
     $_SESSION['failed_logins'] = 1; 
} 

我然後對setcookie()和localStorage腳本執行相同操作。

現在我正在跟蹤此人並知道他們登錄失敗的次數。

然後,我會寫這個用戶的數據到我的failed_login表中,如上所述。

我確定這不是您正在尋找的答案,但它確實是跟蹤您網站上用戶的最佳方式。