【问题标题】:Username not stored in session across PHP用户名未跨 PHP 存储在会话中
【发布时间】:2013-06-01 11:50:43
【问题描述】:

所以我在存储输入到我的网站的用户名并让自己登录到该网站时遇到问题。我可以登录(我看到这是因为“您已登录”消息。但是第二次单击链接转到 members.php 页面时,它返回回显“您尚未登录。”。 为什么没有将 $username 值添加到 SESSION?

这是我的 4 个代码。我还有第五个我的所有 MySQL 信息,我不想分享,但是,我的用户名是通过 MySQL 确认的,因为我收到了第一次登录验证。是的,我按照 YouTube 上的教程进行操作。

index.php

<html>

    <form action='login.php' method='POST'>
    Username: <input type='username' name='username'><br>
    Password: <input type='password' name='password'><br>
    <input type='submit' name='button' value='Login'>
    </form>

 </html>

登录.php

<?php

    session_start();

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

    include ("connect.php");

if ($username && $password)
{
    // info is provided
    $queryget = mysql_query("SELECT * FROM login WHERE username='$username' AND password ='$password' ");
    $numrows = mysql_num_rows($queryget);
    if ($numrows != 0)
    {
        $_SESSION['username'] = $username;

        echo "You have been logged in. <a href='members.php'>Go to the members page</a>";
    }
    else echo "This password is wrong";
    include ("index.php");

}
else
{
    echo "Wrong password, try again!";
    include ("index.php");
}

?>

members.php

<?php

session_start();
$username = $_SESSION['username'];

if ($username)
    {
    echo "Welcome $username | <a href='logout.php>Logout</a>'";
    }
else
    {
    echo "You are not logged in.";
    include ("index.php");

    }

?>

注销.php

<?php

session_start();
$username = $_SESSION['username'];

session_destroy();

echo "You have been logged out.";

?>

【问题讨论】:

  • 有一天,有人会尝试以'; DROP TABLE login; -- 登录,而你会大声哭泣。
  • 这不可能吗?以为你必须进入服务器的 Mysql 才能绕过它......
  • @Denis PHP 的 MySQL 扩展不允许多个语句。但是你应该fix that SQL injection vulnerability,FriedBitz。输入密码' OR '1'='1 将绕过身份验证。
  • 我会去看看,但目前我没有什么可隐藏的,只是学习 MySQL 和 PHP 通信的基础知识 :) 感谢您的提示!
  • 除了可怕的安全漏洞和低效的 mysql 查询之外,它看起来应该可以工作。你试过更简单的测试吗? test1.php 你在哪里设置会话变量,test2.php 你在哪里读到它?

标签: php login passwords


【解决方案1】:

查看您的代码后,您的 SQL 查询可能有错误。 您正在执行以下操作来检查用户:

if($numrows!=0)...

但是,如果 mysql_query 或 mysql_num_rows 返回 false(如果有错误),那么这也会对用户进行身份验证。

在login.php 中尝试以下代码,看看会发生什么。

error_reporting(E_ALL);
ini_set('display_errors', '1');
session_start();

include ("connect.php");

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

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

if ($username!='' && $password!='')
{
    // info is provided
    $queryget = mysql_query("SELECT * FROM login WHERE username='$username' AND password ='$password' ") or die(mysql_error());
    if(!$queryget){ echo 'An error occured: ' . mysql_error(); exit; }

    $numrows = mysql_num_rows($queryget);

    if ($numrows > 0)
    {
        $_SESSION['username'] = $username;

        echo "You have been logged in. <a href='members.php'>Go to the members page</a>";
        exit;
    } else {
        echo "The username or password is wrong";
       include ("index.php");
       exit;
    }
} else if($username=='') {
    echo "You need to specify a username, try again!";
    include ("index.php");
    exit;
} else if($password=='') { 
    echo "You need to specify a password, try again!";
    include("index.php");
    exit;
}

【讨论】:

  • 另外,我建议你放弃mysql_* 函数,它已贬值,也许开始使用mysqli 或PDO。至少,转义你的mysql输入:)
  • 这使我的登录停止工作...我什至没有收到您已登录的消息...
  • 这种情况下,你可能会遇到mysql错误。我已经更新了我的答案,如果你可以运行这个,希望它应该输出错误消息
  • @FriedBitz,我再次更新了代码,(所有更新的应用程序,我正在尝试缩小错误的确切范围),如果您可以尝试新代码?跨度>
  • 哈哈,别着急,只是想弄清楚这个问题。收到消息:您需要指定用户名,再试一次!
【解决方案2】:
login.php:

<?php
 session_start();

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

    include ("connect.php");

if ($username && $password)
{
    // info is provided
    $queryget = mysql_query("SELECT * FROM login WHERE username='$username' AND password ='$password' ");
    $numrows = mysql_num_rows($queryget);
    $row=mysql_fetch_array($queryget);
    if ($numrows != 0)
    {
        $_SESSION['username'] = $row['username'];
        $_SESSION['logged']   = 1;

        echo "You have been logged in. <a href='members.php'>Go to the members page</a>";
    }
    else 
    {
    $_SESSION['logged']   = 0;
    echo "This password is wrong";
    include ("index.php");}

}
else
{
    echo "Wrong password, try again!";
    include ("index.php");
}

?>

member.php:
<?php 
session_start();
if($_SESSION['logged'])
{

 echo "Welcome $_SESSION['username'] | <a href='logout.php>Logout</a>'";
}

否则 { echo "您还没有登录。"; 包括(“index.php”);

}
?>

【讨论】:

  • 当我从登录中点击链接时,这使得整个事情只是给了我一个错误......
  • 尝试:if(isset($_SESSION['username'])){}
  • 不行,仍然不能给我 if 语句:echo "Welcome $username |
  • 确定您已登录?
  • 它在 login.php 中返回回显“您已登录”,这验证它已通过我的 MySQL 服务器进行检查。如果它保存是另一个问题,它似乎......
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 2011-08-09
  • 2017-04-30
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多