2014-01-30 50 views
0

我得到了用戶登錄系統,其中用戶頁面在URL中有自己的id。例如。 xxx/profile.php?id = 1 我的問題是:如何防止登錄的用戶在URL中寫入其他用戶ID並進入他的網站?如何防止用戶表單進入其他用戶配置文件

這裏是文件profile.php的代碼:

  session_start(); 
require 'config2.php'; 
require_once 'user.class.php'; 

if (!user::isLogged()) { 
echo '<p class="error">Przykro nam, ale ta strona jest dostepna tylko dla zalogowanych  u?ytkowników.</p>'; 
    } 

else { 
$id = $_GET['id']; 


    $userExist = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM users WHERE id = '$id'")); 


    if ($userExist[0] == 0) { 
    die ('<p>Przykro nam, ale u?ytkownik o podanym identyfikatorze nie istnieje.</p>'); 
} 



$profile = user::getDataById ($id); 

echo '<h1>Profil u¿ytkownika '.$profile['login'].'</h1>'; 
echo '<b>ID:</b> '.$profile['id'].'<br />'; 
echo '<b>Nick:</b> '.$profile['login'].'<br />'; 
echo '<b>Email:</b> '.$profile['email'].'<br />'; 
echo '<b>Obiekt:</b> '.$profile['obiekt'].'<br />'; 

    echo '<b>Typ obiektu:</b> '.$profile['typ'].'<br />'; 
echo '<b>Kod pocztowy:</b> '.$profile['kod'].'<br />'; 

    echo '<b>Adres:</b> '.$profile['adres'].'<br />'; 

echo '<b>Poczta:</b> '.$profile['poczta'].'<br />'; 

echo '<b>Tel. stacjonarny:</b> '.$profile['tels'].'<br />'; 

echo '<b>Tel. komórkowy:</b> '.$profile['telk'].'<br />'; 
    echo '<b>Adres strony internetowej:</b> '.$profile['www'].'<br />'; 




    echo "<img src ='wyslane/$profile[photo]'"; 

     } 

和這裏的user_class.php:

   <?php 

     class user { 

      public static $user = array(); 


     public function getData ($login, $pass) { 
    if ($login == '') $login = $_SESSION['login']; 
    if ($pass == '') $pass = $_SESSION['pass']; 

    self::$user = mysql_fetch_array(mysql_query("SELECT * FROM users WHERE login='$login' AND pass='$pass' LIMIT 1;")); 
    return self::$user; 
    } 



    public function getDataById ($id) { 
    $user = mysql_fetch_array(mysql_query("SELECT * FROM users WHERE id='$id' LIMIT 1;")); 
    return $user; 
    } 


    public function isLogged() { 
    if (empty($_SESSION['login']) || empty($_SESSION['pass'])) { 
    return false; 
    } 

    else { 
    return true; 
    } 
} 





    public function passSalter ($pass) { 
    $pass = '[email protected]@#$#@$'.$pass.'q2#$3$%##@'; 
    return md5($pass); 
} 

    } 
    ?> 

我得也是我的主網頁代碼在這裏:

  if (user::isLogged() == $_GET['id']) { 

    $user = user::getData('', ''); 

echo '<p>You are logged '.$user['login'].'!</p>'; 
    echo '<p>You may see your <a href="profile.php?id='.$user['id'].'">profil</a> or <a    href="logout.php">wylogować</a></p>'; 
     } 

    else { 

    echo '<p>You are not logged.<br /><a href="login.php">Zaloguj</a> się lub <a href="register.php">zarejestruj</a> jeśli jeszcze nie masz konta.</p>'; 
    } 

我試過了,Ryan建議的,但它(頁面)只有當我雙擊配置文件鏈接,否則鏈接再次發送給我logi n頁。

+0

你的代碼是容易受到SQL注入檢查這個http://stackoverflow.com /問題/ 12859942 /爲什麼 - 不應該,我使用MySQL的函數式的PHP/14110189 –

回答

1

而不是傳遞用戶的ID通過URL($ _ GET)嘗試並設置$_SESSION變量,當他在記錄用戶的ID。

然後,你可以去xxx/profile.php和閱讀$ _SESSION var找出想要顯示其配置文件的用戶的ID。

1

現在我不知道如何檢索當前登錄用戶的ID,但是例如可以從user::loggedInID()得到它 - 您只需將它與正在訪問的配置文件的id相匹配即可。

例如:

if(user::loggedInID() == $_GET['id']) { 
    /* Allow profile to be edited */ 
} else { 
    /* Unable to edit profile */ 
} 

作爲一個側面說明,你的數據庫是一個像這樣的查詢極其脆弱:

mysql_query("SELECT COUNT(*) FROM users WHERE id = '$id'") 

眼見爲$id從查詢字符串檢索,而不被消毒,該查詢是開放的注入。

我建議您不僅要清理您的查詢輸入,還要使用mysqli_*函數而不是mysql_*函數(由於棄用)。更好的是,使用準備好的語句。

0

在登錄時只存儲在開始檢查登錄的用戶ID像$_SESSION['Loggedusr']會話變量,並在每一頁這

session_start(); 
if($_SESSION['Loggedusr'] != $_GET['id']) 
header("Location: loginpage.php"); 
相關問題