Php 如何防止用户表单进入其他用户配置文件
我有一个用户登录系统,用户页面在URL中有自己的id。例如xxx/profile.php?id=1 我的问题是:如何防止登录用户在URL中写入其他用户id并进入其站点 下面是profile.php文件的代码:Php 如何防止用户表单进入其他用户配置文件,php,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
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]'";
}
session_start();
需要'config2.php';
需要一次“user.class.php”;
如果(!user::isLogged()){
echo'Przykro nam,ale ta strona jest dostepna tylko dla zalogowanych u?ytkowników.
;
}
否则{
$id=$_GET['id'];
$userExist=mysql\u fetch\u数组(mysql\u查询(“从用户中选择COUNT(*),其中id='$id'));
如果($userExist[0]==0){
死亡(“Przykro nam,ale u?ytkownik o podanym identifikatorze nie istnieje.”);
}
$profile=user::getdatabyd($id);
echo'Profil u?ytkownika'。$profile['login'.';
回显'ID:'.$profile['ID'].
;
回显“尼克:”.$profile['login']。
;
回显“Email:”.$profile['Email']。
;
回显“Obiekt:”.$profile['Obiekt']。
;
回显'Typ obiektu:'.$profile['Typ'].
;
回音“Kod pocztowy:”.$profile['Kod'].
;
回音“地址:”.$profile['Adres'].
;
回显'Poczta:'.$profile['Poczta'].
;
echo'Tel.stacjonarny:'.$profile['tels'].
;
echo'Tel.komórkowy:'.$profile['telk'].
;
echo“Adres strony internetowej:”.$profile['www']。
;
回声“
下面是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>';
}
if(user::isLogged()=$\u GET['id']{
$user=user::getData(“”,”);
回显“您已登录”。$user['login']。!”;
回显“您可能会看到您的或”;
}
否则{
echo'您未被登录。
sięlub jeśli jeszcze nie masz konta。;
}
我尝试了Ryan建议的方法,但它(页面)只有在我双击配置文件链接时才起作用,否则链接会将我再次发送到登录页面。不要通过URL($\u GET)传递用户ID,尝试在用户登录时用用户ID设置一个$\u SESSION
变量
然后,您可以转到xxx/profile.php
并读取$\u会话变量,找出要显示其配置文件的用户的id。现在我不知道如何检索当前登录用户的id,但举例来说,您可以从user::loggedInID()获取该id
-您只需将其与正在访问的配置文件的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.*
函数(由于不推荐)。更好的是,使用准备好的语句。登录时只需将登录的用户ID存储到会话变量中,如$\u session['Loggedusr']
并在每页开始时检查此项
session_start();
if($_SESSION['Loggedusr'] != $_GET['id'])
header("Location: loginpage.php");
您的代码易受sql注入攻击请检查此