2010-07-09 59 views
2

我面臨一個問題,我的會話正在被其他登錄用戶在PHP中覆蓋。會話正在被覆蓋在php

當我們有一個合理的負載約50 -100用戶會話開始混合起來。例如,如果用戶在一會兒之後登錄爲A,他的會話切換到也登錄的用戶B.該系統已運行一年多,這是我們第一次遇到問題。

服務器運行Centos。

我沒有任何代碼錯誤的地方,但不知何故一個人的數據被其他人覆蓋。

請幫助我,因爲我試圖解決這個錯誤,但沒有成功。

是否有任何php ini設置會覆蓋用戶會話數據?或 這是什麼在服務器端像會話id隨機化不正確?

在此先感謝。

+1

Plese顯示您用來初始化會話的代碼。 – Unicron 2010-07-09 07:44:58

+0

是的,正如Unicron所說,這看起來像代碼中的問題。 – codingbear 2010-07-09 07:46:48

+0

您使用PHP的默認會話處理程序嗎? – Gumbo 2010-07-09 08:21:50

回答

0

是的,我正在使用PHP的默認會話處理程序 我已經在登錄頁面中設置了會話變量。

<?php 
session_start(); 
include("dbconfig.php"); 

if($_POST['login']) { 

    $user = $_POST['user']; 
    $pass = $_POST['pass']; 
    $msg = ''; 

    $check = mysql_query("SELECT * FROM `user` WHERE username = '{$user}' AND pass = '{$pass}'") or die(mysql_error()); 
    $row = mysql_num_rows($check); 
    $ck = mysql_fetch_assoc($check); 

    if($row == 1) {  
      $_SESSION['name'] = $user; // used to be set to $ck['iname']; 
      $_SESSION['isadmin'] = 1;    
      $_SESSION['team'] = $ck['teamstatus']; 
      $_SESSION['logintime'] = time(); 
      $_SESSION['priority'] = $ck['priority']; 
      $_SESSION['id'] = $ck['id']; 
      $_SESSION['designation'] = $ck['designation']; 
      $_SESSION['course'] = $ck['course']; 
      $_SESSION['year'] = $ck['year'];    
      $_SESSION['no'] = $ck['no'];    
      $_SESSION['div'] = $ck['div']; 
      $_SESSION['sp_designation'] = $ck['sp_designation'];  
      header("Location: index.php"); 
      exit;     
    } else { 
     $msg = "Invalid Username or Password"; 
    } 
} 
?> 

,然後在頁面的每一個頂部,我會覈實該人在

<?php 
session_start(); 

if(!(isset($_SESSION['name'])) && ($_SESSION['isadmin'] == 1) && (isset($_SESSION['id'])) && (isset($_SESSION['designation']))) { 
    header("Location: error.php"); 
    exit; 
} 

otherwise perform the action 
?> 
+1

有了這段代碼,你最好留意小Bobby Tables:http://xkcd.com/327/ – Borealid 2010-07-09 09:02:33

+3

當你想添加更多信息時,請**編輯**你的問題,不要**回答問題。 – Quentin 2010-07-09 12:13:29

+0

'mysql_real_escape_string'是你的朋友 – 2010-07-09 16:41:54

0

記錄通過閱讀你的問題,我覺得有可能是這些原因:

首先,我建議你,如果你將搜索字符串從一個頁面傳遞到另一個頁面,你可以使用查詢字符串,因爲創建大量會話變量可能會降低你的應用程序速度。

第二,由於會話依賴於會話狀態提供程序,它爲每個會話創建一個唯一的會話ID,它幾乎不可能重新生成[雖然它不是通用唯一ID],只需檢查您是否使用無Cookie會話,其中你的會話不依賴於cookie,並依賴於URL,這可能會重新激活會話。

希望它能夠解決您的問題

0

ERK,我希望你已經發布的代碼是僅用於說明這將是非常容易實現針對它的攻擊感染(如

user = "admin' OR ('bla'='" 
password="')" 

它也容易實現會話劫持。 - 你應該產生一個新的會話ID,當用戶通過認證

假設你使用的是默認的會話處理程序,故障是不太可能是會話處理代碼中這是在使用數千(數百萬)個應用程序,並且正在爲其他人工作。

最可能的原因是數據的緩存不良 - 您是否可以在沒有任何中間代理的情況下複製它?你有沒有檢查出網絡服務器的頭文件?

C.

1

我已經研究了這個問題,並發現有1位ID的幾個會話文件越來越躋身32位的人創建的。例如。 sess_1和sess_8以及sess_f1d9037025f544376ff0d44511ed3192。

我所看到的是,如果用戶A閒置並且用戶B登錄,則用戶A和用戶B都在其Cookie中包含額外的PHPSESSID,其中包含sess_1之類的單個位會話標識。他們仍然保留他們的32位PHPSESSID,但是,這些從服務器上被刪除,所以兩個用戶都默認使用相同的會話ID,因此用戶A現在獲得用戶B的會話和他的訪問權限。

+0

我已經看到服務器上創建的會話列表,並找到一些1位的ID。你知道如何解決這個問題嗎? – user387493 2010-07-12 11:44:19