用于在登录表单上验证用户的php会话

时间:2009-08-07 06:06:25

标签: php session

我有以下代码用于开始会话并存储用户名/密码数据,如果没有提交,或者没有存储会话数据,则重定向到失败页面。

session_start();
if(isset($_POST['username']) || isset($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $_SESSION['username'] = $username;
    $_SESSION['password'] = $password;
}

if(isset($_SESSION['username']) || isset($_SESSION['password'])){
    $navbar = "1";
    $logindisplay = "0";
    $username = $_SESSION['username'];
    $password = $_SESSION['password'];
} else {
    header('Location:http://website.com/fail.php');
}

$authed = auth($username, $password);
if( $authed == "0" ){
    header('Location:http://website.com/fail.php');
}

它不按预期方式工作,即使我提交了我的信息并将其存储在会话中,也会将我重定向到失败。难道我做错了什么?

注意在添加会话代码之前,authed功能正常工作。

7 个答案:

答案 0 :(得分:19)

如何使用它来设置会话

session_start();
if( isset($_POST['username']) && isset($_POST['password']) )
{
    if( auth($_POST['username'], $_POST['password']) )
    {
        // auth okay, setup session
        $_SESSION['user'] = $_POST['username'];
        // redirect to required page
        header( "Location: index.php" );
     } else {
        // didn't auth go back to loginform
        header( "Location: loginform.html" );
     }
 } else {
     // username and password not given so go back to login
     header( "Location: loginform.html" );
 }

并在每个“安全”页面的顶部使用以下代码:

session_start();
session_regenerate_id();
if(!isset($_SESSION['user']))      // if there is no valid session
{
    header("Location: loginform.html");
}

这会在每个页面的顶部保留非常少量的代码,而不是在每个页面的顶部运行完整的auth。要注销会话:

session_start();
unset($_SESSION['user']);
session_destroy();
header("Location: loginform.html");

答案 1 :(得分:9)

首先,不要将密码存储在会话中。这是一个坏事。其次,在经过身份验证之后,不要将用户名存储在会话中。

尝试以下方法:

<?php

session_start();

if (isset($_POST['username']) && isset($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $authed = auth($username, $password);

    if (! $authed) {
        header('Location: http://website.com/fail.php');
    } else {
        $_SESSION['username'] = $username;
    }
}

if (isset($_SESSION['username'])) {
    $navbar = 1;
    $logindisplay = 0;
} else {
    header ('Location: http://website.com/fail.php');
}

答案 2 :(得分:3)

只是一些随机点,即使它们实际上可能与问题无关:

  • 请勿在会话中以明文形式存储密码。只评估密码是否正常,然后在会话中存储loggedIn = true或类似的内容。

  • 检查用户名密码$_POSTed,而不是 || (或)。

  • 请勿在{{1​​}}和$password之间来回传递密码和用户名。决定一个地方保留数据并留在那里。

  • 您是否检查过会话中是否可以存储任何内容?饼干还可以等......?

为了大大简化您的代码,这不是您需要做的全部吗?

$_SESSION['password']

答案 3 :(得分:1)

顺便提一下,这里有一些其他的东西,可能会或可能不会帮助你:

  • 你有error_reporting吗? (see also
  • 您有display_errors吗?
  • session_start是您在页面中做的第一件事吗?
  • 之前必须有输出
  • 是否在客户端创建了Cookie?
  • 标题位置表示必须转到另一个页面的浏览器;它不会停止执行PHP脚本。您可能希望(几乎总是无论如何)在它之后添加“退出”。

答案 4 :(得分:1)

标题不是函数调用。他们将指令放入HTTP标头,最后一个要执行的是将要处理的指令。所以,如果你有这样的话,那么就说吧

if ($bAuthed)
{
     header("location: login.php");
}

// error case
header("location: error-login.php");

无论发生什么情况,您都将被重定向到error-login.php。标题不是函数调用!

答案 5 :(得分:0)

上面我具体问题的解决方案

session_start();
if(isset($_POST['username']) || isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
}

if(isset($_SESSION['username']) || isset($_SESSION['password'])){
$navbar = "1";
$logindisplay = "0";
$username = $_SESSION['username'];
$password = $_SESSION['password'];
$authed = auth($username, $password);
if( $authed == "0" ){
header('Location:http://website.com/fail.php');
}
} else {
header('Location:http://website.com/fail.php');
}

答案 6 :(得分:0)

请勿在第二个else声明中使用if部分。

session_start();

if(isset($_POST['username']) || isset($_POST['password'])) {

    $username = $_POST['username'];

    $password = $_POST['password'];

    $_SESSION['username'] = $username;

    $_SESSION['password'] = $password;

}

if(isset($_SESSION['username']) || isset($_SESSION['password'])){

    $navbar = "1";

    $logindisplay = "0";

    $username = $_SESSION['username'];

    $password = $_SESSION['password'];

}

$authed = auth($username, $password);

if( $authed == "0" ){

    header('Location:http://website.com/fail.php');

}