【问题标题】:PHP Session value changing from page to pagePHP Session 值在页面之间变化
【发布时间】:2022-01-16 22:02:33
【问题描述】:

我制作了一个自定义登录脚本,它运行良好。但是,在它重定向到主页后,$_SESSION['username'] 的值会更改为 'root',无论它之前有什么值。其中“root”是我的数据库登录用户名。

我必须手动输入所有这些,所以它可能会出现一两个明显的错误-

main_login.php (php include_once on sidebar.php 包含在每个页面上)

    <?php
    if(!isset ($_SESSION["username"])){ 
?>

<!-- Simple login form action="checklogin.php" method="post"-->

<?php
}else{
?>

<!-- Table to display welcome user, and logout link -->

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";

login_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>

一旦它完成了整个过程,一切都很好。但是,当它重定向到 index.php 时,$_SESSION['username'] 现在是 'root'。

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

谢谢大家。

【问题讨论】:

  • 不需要剥离密码和 mysql_real_escape 密码,因为您只需创建它的 md5-hash。使用您的解决方案,对 stripslash 或 mysql_real_escape 的任何更改都可能会破坏您的登录
  • 谢谢fender,我会改的。这是我第一次尝试 PHP ......永远不会猜到,是吧?
  • 它已被修复 - 没有代码错误。虽然如果我对 SO 有更多的代表,我会给你们每个人 +1 以获得肯定会使用的重要信息。谢谢大家!!
  • 实际上做stripslashes和mysql_real_escape_string没什么不好。你只需要了解在哪里使用它。 应该使用stripslashes。但有条件地,只有打开了magic_quotes_gpc 设置(但最好将其关闭)。 mysql_real_escape_string 也可以使用,但在它的位置。它是与数据库相关的函数,因此,它应该是最后 对进入查询的字符串变量所做的事情。请参阅我对主题的回答stackoverflow.com/questions/2993027/…

标签: php session


【解决方案1】:

答案很简单:

您的应用程序中有一些代码将 $_SESSION['username'] 值更改为 'root'。

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

【讨论】:

  • 我将所有包含“root”的查询更改为变量名 $dbusername 或将用户名直接插入 mysql_connect。在所有 4 个页面之间(包括 index.php,因为那是发生更改的地方),没有任何内容表示变量更改。
  • @Christopher 看,这只是简单的逻辑。没有 PHP 也没有 session 也没有 mysql 改变你的变量。这是您的代码,由您编写。你必须调试它并找到问题。没有其他人。
  • .....我将不得不为您提供正确方法的答案。我看到 header.php(包含在每个页面上)仍然有 $username 变量来连接 MySQL。我改变了它,瞧,它奏效了。但是,我在页面上搜索了 $_SESSION global,但什么也没有。但我一直在倾注我能找到任何东西的代码——即使使用搜索功能。一个简单的变量会导致这种情况发生吗?
  • @Christopher 啊,有可能的原因。 PHP 具有称为“注册全局变量”的过时设置。它已被弃用并关闭了很长时间(正确地说是十年)。它会导致这种行为。您的系统很可能打开了 register_globals 并且您的 $username 变量重写了 $_SESSION['username']。只需在 php.ini 中将其关闭
  • @Col。是的,它打开了。奇怪的是,这样一个旧功能仍然会抑制功能。以后,您会建议不要将变量 $username 用于会话以外的任何内容?
【解决方案2】:

这部分看起来很奇怪:

$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();

【讨论】:

  • 否,第二个参数表示行。 usernamepermissions 是列。
【解决方案3】:

你为什么要在 login_success.php 上再次设置 $_SESSION['username'] 变量 你是在 check_login.php 上设置变量,对吗?

这就是我要做的事情

在 login_success.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');

此外,在您的检查登录页面上更改 if 语句以查找 $_SESSION['username'] 中的实际变量,而不仅仅是设置了它,我尽量远离 isset()。

看在上帝的份上,不要存储纯文本密码,实施安全密码散列方案不需要任何成本。它超级容易利用 php 的 crypt() 函数,还可以查看这个开源安全方法。 http://www.openwall.com/phpass/

【讨论】:

  • 他不存储纯文本密码。他使用md5。它不再那么安全了,但它比明文更好^^
  • 错过了那行代码,但是未加盐的 md5 几乎不安全
  • 感谢您的安全建议。我在 login_success 中再次设置用户名作为另一个推送,以确保用户名设置正确。问题是在我实施之前。我做了 var_dump($_SESSION);在整个过程的每个页面上,它挂起的地方是 login_success 和 index.php 之间的转换。你也需要索引的PHP代码吗?
【解决方案4】:

嗯,

您的评论感觉可能是正确的,您在没有意识到的情况下将其设置为 root。经过 2 小时的故障排除后,我才意识到,这就是我正在做的事情!

无论我如何尝试,$_SESSION['username'] 都会从真实用户名更改为“root”。

我终于意识到 $_SESSION['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.';
    }
?>

最后我们在需要的文件connect_to_db.php中看到:

<?php
    $host="localhost"; // Host name
    $username="root"; // mysql username
    $password=""; // mysql password
    $db_name="BH_web_DB"; // Database name

    // Connect to server and select database.
    mysql_connect("$host", "$username", "$password")or die("cannot connect: ". mysql_error());
    mysql_select_db("$db_name")or die("cannot select DB");
?>

简单修复:

$db_username="root"; // mysql username

所以我实际上是把它设置得太根了 =) 希望这有助于另一个。

【讨论】:

    【解决方案5】:

    我遇到了同样的问题,结果我没有在显示“root”的页面上启动会话。

    if (!session_id()) session_start();
    

    这有帮助!

    【讨论】:

      猜你喜欢
      • 2012-07-17
      • 2018-12-04
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多