2010-10-23 97 views
3

我發展,你不允許在多個帳戶登錄一臺計算機上的網站,但我不知道如何做到這一點。該方法必須是:PHP/Java腳本:分辨兩臺電腦從同一網絡

  • 跨平臺(可在Windows/Mac/Linux客戶端上使用)。
  • 獨立於瀏覽器。

這是爲了避免一些用戶利用多個用戶獲得不公平的優勢,同時仍然允許兩個人在本地網絡上連接,只要他們在不同的計算機上。

任何提示?

回答

2

編輯:我認爲我的回答一個黑客,希望能看到一個最佳實踐方案。

就像我討厭他們一樣,檢查Flash Cookies會在這裏工作。大多數用戶甚至不知道他們甚至在電腦上,所以你不必擔心他們被刪除。進入這個鏈接,看看有多少一直坐在您的計算機上的年齡沒有您的知識:Flash Cookie Manager

雖然我不認爲Flash可以和iPhone一起工作,但是你沒有提到它。

這裏是土坯的閃光install baseWikipedia也有Flash穿透。

+0

這似乎是我的問題的答案,要更徹底地進行調查。如果可以相信Adobe的數字,幾乎每個人都會啓動Flash。應該能夠想出一些可以讓iPhones或類似的連接。我會看看我能用這些信息做些什麼。 – user485158 2010-10-23 18:24:36

+0

這是相當可怕的一些未知的曲奇... ** dammit **。 (爲了向我展示我存儲在我的系統中的多少,我從來不知道)。 – 2010-10-23 18:25:51

4

您可以嘗試使用持久性Cookie,如「Evercookie」http://samy.pl/evercookie/,這樣您可以識別每臺計算機具有獨特的cookie,並且它會持久。

然後,所有你需要做的是鏈接,cookie來您的會話處理架構。

編輯: 正如Claudiu指出的那樣,您還需要檢查用戶是否已啓用JS,並在禁用的情況下拒絕訪問。

使用驗證IP地址的所有的方法有2個問題: - 任何人都可以使用代理服務器繞過它們 - 它不會對NAT的enviroments

+0

用戶可以禁用了JavaScript,因此你的方法可以繞過 – Claudiu 2010-10-23 16:43:09

+0

Evercookie看起來很有希望。無論如何,人們需要啓用JavaScript才能使用該站點,並且仍然比使用Java的用戶數量更多,而這些用戶禁用了更多。 – user485158 2010-10-23 17:38:04

+0

將刪除我的答案,因爲這完全一樣。只有相關的附加信息:「由於Cookie是每個瀏覽器,而不是每臺計算機,你也許可以限制每個IP一個特定瀏覽器的使用」,讓我們知道您的進步! – sunn0 2010-10-23 18:02:22

0

我看到的唯一方法是通過IP來檢查工作,如果你已經連接了$ _SERVER ['REMOTE_ADDR'],那麼不要讓其他任何一個。當然,在某些情況下,您可以在兩臺不同的PC上擁有相同的IP,但這是最安全的方式,因此您的用戶應該意識到這一點。

+0

但是,這不會讓兩個室友同時與不同的賬戶連接,我想向我的用戶提供。 – user485158 2010-10-23 17:15:10

+0

是的,但你必須退出這樣的想法,即沒有人能夠打入你的系統......就像在系統上作弊 – Claudiu 2010-10-23 17:36:12

+0

我不相信如果你真的想要我的系統不會破壞,不鼓勵人們這樣做。如果計算機使用相同的cookie,無論同一臺計算機上的瀏覽器如何,使用代理服務器都無濟於事,這似乎是我必須走下坡路。 – user485158 2010-10-23 17:41:28

0

即使世界,你需要看幾個因素。

確保有每個IP地址的只有1個會議將是做到這一點的最好辦法,唯一的缺點是如果用戶不註銷,你可能有問題。

我會怎麼做,是

商店登錄的用戶在一個表中,並跟蹤有最後一項活動,如果你的網站是一個網站,用戶可以有一段時間無法更改頁面,那麼你應該建立一個javascript心跳只需從瀏覽器ping您的服務器,以便PHP始終處於最新狀態。

如果用戶A登錄並從不同IP的另一種嘗試嘗試登錄,那麼你應該禁用用戶A的登錄狀態,並允許用戶B開始一個新的會話。

你也應該跟蹤IP地址的用戶使用登錄,這樣就可以有一個遞增的表像

user_id   ip    hits 
-------------------------------------- 
1    xxx.yyy.zzz.244  6 
1    xxx.yyy.zzz.224  4 
1    xxx.yyy.zzz.264  1 
1    xxx.yyy.zzz.124  1 
1    xxx.yyy.zzz.174  1 
2    aaa.bbb.zzz.678  3 
..... 

這樣,如果在與用戶B的嘗試登錄用戶A,你可以運行檢查,看是否該IP已經被使用過,如果有,那麼你只運行一個直接註銷,否則你可以要求註冊時提供機密問題,以幫助的事情在安全性方面

+0

只要在兩臺不同的計算機上,這仍然不允許來自同一個IP的兩個連接。 – user485158 2010-10-23 17:18:27

+0

你不能從同一個ip同時連接不同的控制檯。 – RobertPitt 2010-10-23 19:57:42

+0

問題不在於每個IP只允許一個會話(不會被強制),也不會同時從不同的位置登錄(這是不可能的)。問題是每臺計算機只允許一個會話。同一網絡下的多臺計算機應能夠登錄,但每臺計算機只能有一個活動會話。 – user485158 2010-10-23 20:30:10

0

你可以只把數據庫中有一列(IsLoggedIn)指示一個人當前是否登錄?

的事情,是行不通的,爲什麼:

  1. IP:本地局域網內所有人都在路由器後面會出現你的網站具有相同的IP地址。

  2. Cookie:它們依賴於瀏覽器。例如, IE不會在Firefox中知道。

+0

檢查用戶是否登錄不會幫助他們使用多個帳戶。我知道那些行不通,所以,我想知道的是,還有什麼可行的? – user485158 2010-10-23 17:12:20

1

的唯一方法是通過客戶端的IP地址,來區分作爲別人講到這裏,但是如果你的用戶將是代理服務器後面的事情得到了很多麻煩。

代理之間有一個事實上的標準來添加一個名爲「X-Forwarded-For」的HTTP頭,它反映了客戶端的內部IP。一對$ _ SERVER [「REMOTE_ADDR」]加X - 轉發,對於在價值原則,爲您提供了客戶端的機器的唯一標識。但是,X-Forwarded-For可以被使用真實IP地址的高級攻擊者輕易僞造。

要獲得X - 轉發,對於價值在PHP中:

$headers = apache_request_headers(); 
$full_client_id = $_SERVER['REMOTE_ADDR'] . '|' . $headers["X-Forwarded-For"]; 

$ full_client_id,這可能看起來像如'123.1.2.3 | 192.168.1.1'會爲您提供幾乎可靠的標識,以存儲在會話數據中並與每個新創建的會話進行比較。

這樣可以保護您至少免遭非高級用戶的非常明顯的誤用。

+0

有用,證明它可以完成,但不幸的是,如您所述,它可以由高級攻擊者僞造。這使得這種方法無用。 – user485158 2010-10-23 17:21:55

1

會話ID應該告訴他們分開容易就好了。

試試這個:

<?php 
$a = session_id(); 
if(empty($a)) session_start(); 
echo "SID: ".SID."<br>session_id(): ".session_id()."<br>COOKIE: ".$_COOKIE["PHPSESSID"]; 
?> 

三種方式得到顯示你的ID。 Session_id()是最可靠的。我注意到firefox沒有得到SID,Internet Explorer沒有得到PHPSESSID。兩者都會報告session_id。

相關問題