2

我知道这个主题已经涵盖了很多,并且我已经查看和搜索过,所以我认为我缺少一些基本的东西。

我有一个用户名密码登录系统,设置为:

登录页面:设置为 Action - checklogin.php

checklogin.php - 检查数据库中的用户名和密码,然后在标题中将它们带到他们的自定义 URL,该 URL 位于数据库的第 3 列中。所以 user1 去 folder1/,user2 去 folder2/,等等。

它似乎工作正常,但假设我以 user1 (URL /folder1/) 身份登录,它允许我在 URL 窗口中输入“/folder2/”,然后文件夹索引文件出现。

所以基本上,如果我登录任何用户名,我可以拉出其他用户文件夹/index.php 文件。

所以我认为 index.php 页面上的代码无法正确验证用户。

代码(顶部很好,连接到数据库等,所以我把它省略了):

checklogin.php:
// Define $username and $password
$username=$_POST['username'];
$password= $_POST['password'];

// To protect MySQL injection 
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);

$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $username and $password, table row must be 1 row

if($count==1){

 // Register $username, $password and redirect to file "index.php"
session_start();
$_SESSION[$username];
$_SESSION[$password];
$_SESSION['loggedin'] = true;
$_SESSION[$id];
$row = mysql_fetch_assoc($result);
$result = mysql_query("SELECT folder FROM users2");
$_SESSION['folder'] = $row['folder'];
   if( isset($username) ) {
$_SESSION["loggedin"] = true;
$_SESSION["username"] = $username;
header('Location: clients/'. $row['folder'].'/index.php');
exit();
}
else {
echo "Wrong Username or Password";
}
ob_end_flush();
}
?>

在接收 URL index.php 页面上:

session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true)  {
// not logged in, move to login page
 header("location:../../login.php");
exit;
}  

我已经尝试了接收“保护页面”代码的许多其他变体,但似乎没有一个能正常工作。是接收码还是登录码???我觉得我错过了一些明显的东西。

在此先感谢,对此的任何看法将不胜感激。- 兰迪

4

3 回答 3

0

您使用了很多不必要的!== 替换其中的大多数!=

也改变

if($count==1){ 

while($count>=1){

改变

if( isset($username) ) {

if( isset($username) && $username != "" && $username != NULL ) {

Var_dump $result,确保它包含你想要的,你已经列出了两次。

当您在会话中引用变量时,我建议双/单引用它。

magic quotes帮自己一个忙,完全避免mssql()。切换到pdoMYSQLI

于 2013-02-08T22:05:34.500 回答
0

您需要在受保护的页面中添加额外的检查;您不仅需要登录用户,还需要检查请求的路径并查看用户是否可以访问该路径。

类似的东西(例如......):

session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true 
    || stripos($_SERVER['REQUEST_URI'], $_SESSION['folder']) === false)  {
// not logged in, move to login page
 header("location:../../login.php");
exit;
}

除此之外,您永远不应该存储纯文本密码,您应该真正切换到 PDO(或 mysqli)并使用绑定变量准备语句。

编辑:另一个明确发生了什么的解决方案:

session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true)  {
  // not logged in, move to login page
  header("location:../../login.php");
  exit();
}
elseif (stripos($_SERVER['REQUEST_URI'], $_SESSION['folder']) === false)
{
  // $_SESSION['folder'] is not found in the path,
  // not user's folder, go to own folder
  header('Location: /clients/'. $_SESSION['folder'].'/index.php');
  exit();
}
else
{
  // show page of user
}
于 2013-02-07T21:21:17.373 回答
-1
if (!isset($_SESSION['loggedin']) |$_SESSION['loggedin'] !== true)     
if (stripos($_SERVER['REQUEST_URI'], $_SESSION['folder']) === false)
 { 
// not logged in, move to login page
 header("location:../../login.php"); exit; } – RandyS just now edit 
于 2013-02-07T22:00:17.403 回答