[英]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
是你在頁面中做的第一件事嗎? 以前一定沒有輸出 標頭不是函數調用。 他們將指令放入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.