簡體   English   中英

用於在登錄表單上驗證用戶的php會話

[英]php sessions to authenticate user on login form

我有以下代碼用於開始會話並存儲用戶名/密碼數據,如果沒有提交任何內容,或者沒有存儲會話數據,則重定向到失敗頁面。

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功能正常工作。

怎么用這個來設置會話

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

首先,不要將密碼存儲在會話中。 這是件壞事 其次,在經過身份驗證之后 ,不要將用戶名存儲在會話中。

請嘗試以下方法:

<?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');
}

只是一些隨機點,即使它們實際上可能與問題無關:

  • 不要在會話中以明文形式存儲密碼。 只評估密碼是否正常,然后在會話中存儲loggedIn = true或類似的東西。

  • 檢查密碼用戶名是否$_POSTed ,而不是|| (要么)。

  • 不要在$password$_SESSION['password']之間來回傳遞密碼和用戶名。 確定一個地方保留數據並留在那里。

  • 您是否檢查過會議中是否可以存儲任何內容? 餅干好嗎等......?

為了大大簡化您的代碼,這不是您需要做的全部嗎?

if (isset($_POST['username'] && isset($_POST['password'])) {
    if (auth($_POST['username'], $_POST['password'])) {
        $_SESSION['user'] = /* userid or name or token or something */;
        header(/* to next page */);
    } else {
        // display "User credentials incorrect", stay on login form
    }
} else {
    // optionally: display "please fill out all fields"
}

以下是其他一些事情,可能會或可能不會對您有所幫助:

  • 你有error_reporting嗎? 另見
  • 你有display_errors嗎?
  • session_start是你在頁面中做的第一件事嗎? 以前一定沒有輸出
  • 是否在客戶端創建了cookie?
  • header位置表示必須轉到另一個頁面的瀏覽器; 它不會停止執行PHP腳本。 您可能希望(幾乎總是無論如何)在其后添加“退出”。

標頭不是函數調用。 他們將指令放入HTTP標頭,最后一個要執行的是將要處理的指令。 所以,如果你有這樣的話,那就說吧

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

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

無論發生什么情況,您都將被重定向到error-login.php。 標題不是函數調用!

解決我上面的具體問題

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');
}

不要在第二個if語句中使用else部分。

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');

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM