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