2012-01-26 88 views
0

在我的網站上,我有一個用戶登錄系統,當他們登錄時,他們被帶到他們的個人資料頁面,這是由他們的uid吃的deism。事情是,沒有什麼可以阻止用戶只是改變uid並轉到其他人的個人資料並以他們的名義行事。爲了阻止這種情況,我實現了一個URL/MySQL系統,通過這個系統,如果用戶的uid不是URL中的uid,他們將被重定向到他們自己的配置文件。這裏的問題是,在配置文件中有更改URL的表單,這樣做會刪除uid查詢,導致頁面(因爲缺少uid)將您帶到您的配置文件並忽略表單輸入。限制用戶到他們的個人資料頁面

的代碼是:

<?php 
mysql_connect ('x', 'x', 'x'); 
mysql_select_db ('x'); 

if(isset($_COOKIE['wd_un'])) { 
    $un = $_COOKIE['wd_un']; 
    $pass = $_COOKIE['wd_pass']; 

    $cook = "SELECT * FROM x WHERE username = '$un' AND password = '$pass' limit 1"; 
    $cookr = mysql_query($cook) or die (mysql_error()); 
     if(mysql_num_rows($cookr) == 0) { 
      header ("Location: index.php"); 
     } 
     else { 
      $urluid = mysql_real_escape_string($_GET['uid']); 
      $uidcheck = "SELECT * FROM x WHERE username = '$un' AND password = '$pass'"; 
      $uidcheckq = mysql_query($uidcheck) or die (mysql_error()); 
      while($rcu = mysql_fetch_assoc($uidcheckq)) { 
       $dbuid = $rcu['uid']; 
         if($urluid != $dbuid) { 
          header ("location: home.php?uid=$dbuid"); 
         } 
         else { 
         } 
      } 
     } 
    } 
mysql_close(); 
?> 

有沒有解決辦法?

+1

如果你知道他們是通過會話的人,爲什麼即使有URL參數? – 2012-01-26 23:21:32

回答

5

此代碼塊您在這裏是壞的。

首先,絕對不要將用戶的密碼存儲在cookie中。 您應該只在cookie中存儲會話ID,然後將剩餘的會話數據存儲在數據庫中的會話表中,其中包含用戶的ID和任何其他您可能想要基本訪問的內容......密碼應該不在此表中。

現在,您可以安全地使用URL中的user_id,因爲交叉引用會讓人不在。

加載當然,你交叉引用你的會話表中的mysql結果,該結果是根據你的cookie標識符來提取的。如果它們不匹配,很明顯會啓動它們。

至於你的表單重定向,你需要重構你如何處理髮布然後。您可以使您的個人資料頁面始終只吸引與Cookie中與會話ID相關的個人資料。這將消除對URL的依賴並完全解決此問題。

另請參閱mysql_real_escape_string()來清理輸入。盲目接受mysql查詢的cookie信息是非常危險的。除非你真的打算在你的網站留下巨大的注射孔。

+0

因此,啓動會話,使用會話ID設置cookie,將用戶用戶名,ppassword和uid存儲到會話表中,如果會話表中的用戶名和密碼與會話表中的用戶名和密碼匹配,則使用cookie查找表中的會話在user_db表中,然後通過從數據庫中選擇uid等於會話表中的uid的信息加載它們自己的頁面? – AviateX14 2012-01-26 23:35:25

+0

不完全。當他們使用他們的用戶名和密碼登錄時,您可以通過多種方式創建一個唯一的ID。這是一個:http://php.net/manual/en/function.uniqid.php。然後,您只將該ID存儲在cookie中。然後在您的會話表中,您僅使用用戶標識存儲該標識。沒有密碼。在頁面加載時,您可以在其cookie中提取與id相關的配置文件,或者如果您仍在使用該方法,則可以將與您的cookie相關的user_id與URL中的user_id交叉引用。如果您擔心安全問題,則可以在每次加載頁面時刷新並重置此Cookie ID。 – 2012-01-26 23:41:39

+0

另外,不要混淆我使用word會話與php的會話()。你實際上並不需要設置任何類型的$ _SESSION變量。您的評論大部分都是正確的,只是您不需要檢查密碼。在這種情況下,Cookie類型的唯一標識符用作該標識符,因爲在頁面加載時刷新的良好唯一標識符幾乎不可能被猜出。您所做的只是根據與cookie ID相關的user_id來提取配置文件。如果用戶恰好有一個cookie集並且在會話表中找到了該id,那麼您應該是安全的。如果需要,您也可以包含時間戳 – 2012-01-26 23:46:06

1

您應該使用Cookie ID來標識用戶,而不是從URL中拉出用戶。如果cookieID不匹配UserID,則重定向到他們自己的配置文件。

基本上,絕對不要使用url來傳遞私人數據的用戶ID。始終引用cookie。

僅依靠URL字符串來標識用戶是您所描述的可用性問題之上的巨大安全漏洞。

+0

好的,我會將其更改爲cookie,但那麼如何使用Cookie將該用戶限制爲僅限他們的個人資料? – AviateX14 2012-01-26 23:21:14

+0

基本上.. userid == cookieID,所以他們去的每一頁只顯示他們的信息。不需要重定向。根據yo0u發佈的內容,永遠不需要爲url字符串添加用戶標識。剛剛閱讀cookie。 – Scott 2012-01-26 23:23:09

相關問題