PHP会话值随页面的变化而变化

PHP会话值随页面的变化而变化,php,session,Php,Session,我做了一个自定义的登录脚本,它工作得很好。但是,在重定向到主页后,$_SESSION['username']值将更改为'root',而不管它之前有什么值。哪个“root”是我数据库登录的用户名 我必须手动输入所有这些内容,因此可能会有一两个明显的错误- main_login.php(php在sidebar.php上包含一次,每个页面都包含一次) checklogin.php: session_start(); $db_name = "database"; $tbl_name = "users

我做了一个自定义的登录脚本,它工作得很好。但是,在重定向到主页后,$_SESSION['username']值将更改为'root',而不管它之前有什么值。哪个“root”是我数据库登录的用户名

我必须手动输入所有这些内容,因此可能会有一两个明显的错误-

main_login.php(php在sidebar.php上包含一次,每个页面都包含一次)


checklogin.php:

session_start();
$db_name = "database";
$tbl_name = "users";

mysql_connect("localhost","root","password") or die("Cannot connect to SQL server");
mysql_select_db("$db_name")or die("Cannot select database.");

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

$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$password = md5($password);

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

$count = mysql_num_rows($result);

if($count == 1){
$_SESSION["username"] = $username;
$_SESSION["password"] = $password;
header("location:login_success.php");
}
else{
echo "<script type='text/javascript'>\n";
echo "setTimeout('redirect();',2000);\n";
echo "function redirect(){\n";
echo "window.location = 'index.php';\n";
echo "}\n";
echo "</script>\n";
echo "Wrong Username or Password";
session_start();
$db_name=“数据库”;
$tbl_name=“用户”;
mysql_connect(“localhost”、“root”、“password”)或die(“无法连接到SQL server”);
mysql_select_db($db_name)或die(“无法选择数据库”);
$username=$_POST['username'];
$password=$_POST['password'];
$username=stripslashes($username);
$password=stripslashes($password);
$username=mysql\u real\u escape\u字符串($username);
$password=mysql\u real\u escape\u字符串($password);
$password=md5($password);
$sql=“从$tbl\U名称中选择*,其中用户名='$username'和密码='$password';
$result=mysql\u查询($sql);
$count=mysql\u num\u行($result);
如果($count==1){
$\会话[“用户名”]=$username;
$\u会话[“密码”]=$password;
标题(“位置:login_success.php”);
}
否则{
回音“\n”;
echo“setTimeout('redirect();',2000);\n”;
echo“函数重定向(){\n”;
echo“window.location='index.php';\n”;
回声“}\n”;
回音“\n”;
回显“错误的用户名或密码”;
登录_success.php:

<?php
session_start();
if(!isset($_SESSION['username'])){
header("location:index.php");
}else{
session_regenerate_id();
}
// Apply permissions - problem existed before all of this code

mysql_connect("localhost","root","password") or die("Cannot connect to database.");
mysql_select_db("database") or die("Cannot select database.");

$username = $_SESSION['username'];

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_num_rows($result);

mysql_close();

$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');
?>

<html>
<head>
<script type="text/javascripnt">
setTimeout("redirect();",4000);
function redirect(){
window.location = "index.php";
}
</script>
</head>
<body>
Login Successful.
<?php echo "Welcome ".$_SESSION["username"].".";
var_dump($_SESSION); // var_dump reveals that $_SESSION['username'] is still the login name.
?>
</body>
</html>

setTimeout(“重定向();”,4000);
函数重定向(){
window.location=“index.php”;
}
登录成功。
一旦完成整个过程,一切都很好。但是,当它重定向到index.php时,$\u会话['username']现在是'root'

我想知道是否有人知道为什么会发生这种情况(这样我就可以理解这个问题并在将来预防它),以及如何实施修复


谢谢大家。

答案很简单:

应用程序中有一些代码将$\u会话['username']值更改为'root'


你必须调查你的代码并找到那个地方。没什么大不了的。答案很简单:

应用程序中有一些代码将$\u会话['username']值更改为'root'

你必须调查你的代码并找到那个地方。没什么大不了的

这部分看起来很奇怪:

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_num_rows($result);

mysql_close();

$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');
试试这个:

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_query($result);


$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');
msql_close();
这部分似乎很奇怪:

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_num_rows($result);

mysql_close();

$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');
试试这个:

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_query($result);


$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');
msql_close();

为什么要在login\u success.php上再次设置$\u SESSION['username']变量您要在check\u login.php上设置变量,对吗

这就是我要做的

登录时,打印会话变量以查看发生了什么。我几乎可以看到sql查询中发生了什么。设置一个条件以确保实际得到结果

print_r($_SESSION);

if(!$_SESSION['username']) die('no session user name');

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_query($result);

if(mysql_num_rows($result) == 1){
    $_SESSION['username'] = mysql_result($result,0,'username'); //why do you need this?
    $_SESSION['permissions'] = mysql_result($result,0,'permissions');
    mysql_close(); 
}
else die('no user found');
另外,在您的checklogin页面上,更改if语句以在$\u会话['username']中查找实际变量。不仅是如果设置了,我还尝试远离isset()


看在上帝的份上,不要存储纯文本密码,实现一个安全的密码散列方案不需要花费任何费用。利用php的crypt()函数非常容易,还可以查看这个开源安全方法。

为什么要设置$\u会话['username']在login_success.php上再次设置变量您正在check_login.php上设置变量,对吗

这就是我要做的

登录时,打印会话变量以查看发生了什么。我几乎可以看到sql查询中发生了什么。设置一个条件以确保实际得到结果

print_r($_SESSION);

if(!$_SESSION['username']) die('no session user name');

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_query($result);

if(mysql_num_rows($result) == 1){
    $_SESSION['username'] = mysql_result($result,0,'username'); //why do you need this?
    $_SESSION['permissions'] = mysql_result($result,0,'permissions');
    mysql_close(); 
}
else die('no user found');
另外,在您的checklogin页面上,更改if语句以在$\u会话['username']中查找实际变量。不仅是如果设置了,我还尝试远离isset()

看在上帝的份上,不要存储纯文本密码,实现一个安全的密码散列方案不需要花费任何费用。利用php的crypt()函数非常容易,还可以查看一下这是一个开源的安全方法。

您的评论感觉可能是对的,您正在将其设置为root而没有意识到。我刚刚意识到,经过2个小时的故障排除,这就是我正在做的

不管我怎么做,$\u会话['username']都从一个真正的用户名变为'root'

我终于意识到,$\u会话['username']实际上并没有在任何地方发生变化,但$username确实发生了变化。原因如下:

<?php
    if(!empty($_SESSION['username'])){
            $username = $_SESSION['username'];
            require_once '../includes/connect_to_db.php';
            echo $_SESSION['username']. ' is correct but '. $username. 'is not.';
    }
?>
所以我实际上也设置了root=)希望这对其他人有帮助。

好吧

您的评论感觉可能是对的,您正在将其设置为root而没有意识到。我刚刚意识到,经过2个小时的故障排除,这就是我正在做的

不管我怎么做,$\u会话['username']都从一个真正的用户名变为'root'

我终于意识到,$\u会话['username']实际上并没有在任何地方发生变化,但$username确实发生了变化。原因如下:

<?php
    if(!empty($_SESSION['username'])){
            $username = $_SESSION['username'];
            require_once '../includes/connect_to_db.php';
            echo $_SESSION['username']. ' is correct but '. $username. 'is not.';
    }
?>

因此,我实际上也在设置它root=)希望这对其他人有所帮助。

没有必要对密码进行stripslash和mysql\u real\u转义,因为您只需创建一个md5哈希。使用您的解决方案,对stripslash或mysql\u real\u转义的任何更改都可能会破坏您的登录Ank you fender,我将更改它。这是我第一次尝试PHP…永远不会我猜到了,嗯?它已经被修复了-代码没有错误。不过如果我有更多的代表,我会给你们每个人+1,以获得肯定会用到的有用信息。谢谢大家!!做stripslashes和mysql\u real\u escape\u string其实没什么不好的。你只需要知道在哪里使用它。stripslashes应该被使用。但是有条件的,仅当magic_quotes_gpc设置已打开时(但更好的方法是将其关闭).mysql\u real\u escape\u string也可以使用,但是在它的位置上。它是与数据库相关的函数,因此,它应该是对进入查询的字符串变量所做的最后一件事。请参阅我关于主题的回答,没有必要使用stripslash和mysql\u real\u escape密码,因为