如何防止用户表单输入其他用户个人资料

时间:2014-01-30 09:44:48

标签: php

我有用户登录系统,其中用户页面在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 = '$@@#$#@$'.$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建议但是它(页面)只有当我双击个人资料链接时工作,否则链接再次发送给我登录页面。

3 个答案:

答案 0 :(得分:1)

不要通过URL($ _GET)传递用户的ID,而是在登录时尝试使用用户的ID设置$_SESSION变量。

然后您可以转到xxx/profile.php并阅读$ _SESSION var,以找出您要显示其个人资料的用户的ID。

答案 1 :(得分:1)

现在我不知道你如何检索当前登录用户的id,但是例如你可以从user::loggedInID()获取它 - 你只需将它与正在访问的配置文件的id匹配。 / p>

例如:

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_*函数(由于弃用)。更好的是,使用准备好的陈述。

答案 2 :(得分:0)

登录时只需将登录的用户ID存储到$_SESSION['Loggedusr']等会话变量中,并在开始时检查每个页面

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