2013-04-09 66 views
22

我鎖定了IP地址。PHP鎖定IP地址

這是否意味着用戶只能使用相同的IP地址登錄?或者用戶註銷並且必須重新登錄才能獲得新的會話?

if (isset($_SESSION['last_ip']) === false) { 
    $_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR']; 
} 

if ($_SESSION['last_ip'] != $_SERVER['REMOTE_ADDR']){ 
    session_unset(); 
    session_destroy(); 
} 

回答

13

如果用戶的IP地址發生變化,此代碼將刪除會話(註銷)。

因此,用戶可以從任何IP地址登錄,但如果它發生更改,則會被註銷。

這可以防止會話劫持,但如果您使用動態IP,因爲IP會不斷變化,所以它不會很好地工作。

+0

如果會話中刪除,將用戶能夠從新的IP獲取新的會話,如果他們登錄 – 2013-04-09 10:05:40

+0

是的,他們會的。 – Halcyon 2013-04-09 10:05:58

+0

我有添加session_regenerate_id(true);那麼這兩個如何一起工作呢? – 2013-04-09 10:07:45

8

它的確如此。如果用戶的IP更改,他將被註銷。雖然攻擊者如果知道知識就可以模仿知識產權,但這並不完全安全。看看這些網頁的更多信息,如何防止會話劫持:

我還強烈推薦克里斯Shiflett。他對會話劫持的文章可以在這裏找到:

http://shiflett.org/articles/session-hijacking

1
if (isset($_SESSION['last_ip']) === false) { 
    $_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR']; 
} 

上面的代碼意味着,如果會話「last_ip」尚未創建,它會被創建和用戶當前的IP的存儲值。

if ($_SESSION['last_ip'] != $_SERVER['REMOTE_ADDR']){ 
    session_unset(); 
    session_destroy(); 
} 

上面的代碼表明,如果「last_ip」的會話值不等於您當前的IP,它會釋放所有會話變量(session_unset)和破壞註冊到會話(session_destroy)的所有數據。

讓我們來描述真實場景。

例如我首先訪問您的網站 代碼塊存儲我當前的IP。現在我的互聯網斷開連接 ,我重新連接到我的isp,它啓用了dhcp並給了我新的ip給 。因此,如果再次訪問您的網站,第二塊代碼會檢查我是否擁有不同的IP,因此它會將我註銷。

也編輯你的第二塊代碼,以便如果會話「last_ip」尚未創建,它不會拋出PHP通知。

if (isset($_SESSION['last_ip']) && $_SESSION['last_ip'] != $_SERVER['REMOTE_ADDR']){ 
    session_unset(); 
    session_destroy(); 
}