2010-03-22 24 views
0

我已经为PHP中的客户端创建了一个管理面板,该面板需要登录。这是在要求用户管理页面顶部的代码先登录:(PHP)用户在尝试在管理页面上执行某些操作后被迫重新登录

admin.php的

<?php 
session_start(); 
require("_lib/session_functions.php"); 
require("_lib/db.php"); 
db_connect(); 


//if the user has not logged in 
if(!isLoggedIn()) 
{ 
    header('Location: login_form.php'); 
    die(); 
} 
?> 

显然,如果语句是什么捉住他们,迫使他们在这里登录是产生的登录页面上的代码:

login_form.php

<form name="login" action="login.php" method="post"> 
    Username: <input type="text" name="username" /> 
    Password: <input type="password" name="password" /> 
    <input type="submit" value="Login" /> 
</form> 

哪些职位信息到该控制器页:

的login.php

<?php 
session_start(); //must call session_start before using any $_SESSION variables 
include '_lib/session_functions.php'; 

$username = $_POST['username']; 
$password = $_POST['password']; 

include '_lib/db.php'; 
db_connect(); // Connect to the DB 

$username = mysql_real_escape_string($username); 

$query = "<grab username, hashed password from DB>;"; 
$result = mysql_query($query); 

if(mysql_num_rows($result) < 1) //no such user exists 
{ 
    header('Location: login_form.php?login=fail'); 
    die(); 
} 

$userData = mysql_fetch_array($result, MYSQL_ASSOC); 
db_disconnect(); 
$hash = hash('<myHashingFunction>', $password . $userData['salt']); 

if($hash != $userData['password']) //incorrect password 
{ 
    header('Location: login_form.php?login=fail'); 
    die(); 
} 
else 
{ 
    validateUser(); //sets the session data for this user 
} 

header('Location: admin.php'); 

?> 

和会话功能页面,提供登录功能包含此:

session_functions.php

<?php 
function validateUser() 
{ 
    session_regenerate_id(); //this is a security measure 
    $_SESSION['valid'] = 1; 
    $_SESSION['userid'] = $username; 
} 

function isLoggedIn() 
{ 
    if($_SESSION['valid']) 
     return true; 

    return false; 
} 

function logout() 
{ 
    $_SESSION = array(); //destroy all of the session variables 
    if (ini_get("session.use_cookies")) { 
     $params = session_get_cookie_params(); 
     setcookie(session_name(), '', time() - 42000, 
      $params["path"], $params["domain"], 
      $params["secure"], $params["httponly"] 
     ); 
    } 
    session_destroy(); 
} 
?> 

我抓住了一个在线教程的sessions_functions.php代码,所以它可能是可疑的。

任何想法为什么用户登录到管理面板,试图做一些事情,被迫重新登录,然后允许在管理面板中像普通一样做东西?

+0

您在validateUser()中为会话cookie设置了哪些参数? – jholster 2010-03-22 20:37:30

+0

validateUser()在上面发布的session_functions.php中定义。如果那不能回答你的问题,那么我不明白你在问什么 – sepiroth 2010-03-22 20:40:14

+0

对不起,我的不好。如果浏览器收到/发送的会话ID与成功登录后服务器上的会话ID匹配,我会跟踪(使用livehttpheaders等)。 – jholster 2010-03-22 21:12:23

回答

0

记得清除浏览器的cookie,如果客户端切换服务器:)

0

将session_regenerate_id与重定向一起使用时要小心。一般来说。别。

+0

那么试着摆脱那条线? – sepiroth 2010-03-22 20:49:29

+0

我肯定会推荐你摆脱它,看看它是否修复你的问题。 – pestilence669 2010-03-22 20:53:10

+0

没有工作 – sepiroth 2010-03-22 20:55:39

0

难道只是我,或者是你的isLoggedIn功能真的不安全?你所做的只是检查会话变量的存在,任何人都可以用随机值伪造。您需要根据验证/登录用户的数据库检查实际会话ID /散列。

+0

有人会从外面设置一个会话变量..? – sepiroth 2010-05-13 00:38:48

相关问题