2012-04-03 202 views
-5

我現在在我的智慧結束。這裏是我想知道的,我如何檢查用戶在我的登錄頁面(僅由用戶名和登錄名)提供的信息與我在數據庫中的信息?我已經可以做到這一點,但現在我的問題是我已經確定的兩件事情。 1)如果所提供的信息與存儲在我的數據庫中的信息相比較時是真的,那麼我想引導用戶到不同的頁面(我假設我的HTML中的ACTION方法會照顧到這一點)。但如果輸入是錯誤的,那麼我需要迭代登錄頁面,以便他們可以重新輸入他們的詳細信息。上述php登錄驗證

if ($p===$p1) 
{ 
    header("Location:success.php"); 
} 
else 
{ 
    header("Location:fail.php"); 
} 

是我的代碼以$ p是密碼字段的形式和$ P1是從數據庫中值的值。此代碼現在發生的情況是,即使密碼甚至用戶名不匹配,用戶仍然可以訪問成員頁面。我已經能夠確定問題在於「標題」方法。但即使我交換了兩個用戶仍然導向到success.php。如果你不明白我的問題的癥結所在,我懇請你不要忽視它只是問我,我會提供更多的信息。抱歉,但我不能似乎能夠得到

+0

什麼是輸出,當你''echo' $ p'和'$ p1'?他們真的是文字嗎?他們是平等的嗎?另外:我在你的問題中讀到,'$ p1'是數據庫開始的密碼,與用戶輸入的密碼相比 - 這是不好的!未加密存儲的密碼(在直接與用戶輸入進行比較時必須存在)是一個安全問題。爲什麼不重構它,以便根據用戶標識和密碼從數據庫獲取用戶記錄。如果您獲得記錄,則登錄成功。 – 2012-04-03 13:56:23

+0

如何處理一些示例代碼? – 2012-04-03 13:56:28

+0

是的,我做得到的記錄,我第一次使用SQL從數據庫中獲取數據之前,我在我正在比較變量結束這樣比較,我的問題是與「頭」和三聯「=」 – Riddle 2012-04-03 14:31:24

回答

2

你打算在這裏不會阻止用戶訪問「成員」的網頁是什麼 - 但是它應該確定用戶在提交密碼後發送到哪個頁面。如果後者不是這種情況,那麼代碼中的其他地方會出現問題。

但正如我所說,如果你想防止未經授權的用戶訪問某些網頁,那麼最簡單的解決辦法是設置一個標誌,在會議的認證,例如

session_start(); 

if ($_POST['password']===stored_password($_POST['username'])) { 
    $_SESSION['authenticated']=$_POST['username']; 
    header("Location:success.php"); 
    exit; 
} else { 
    header("Location:fail.php"); 
    exit; 
} 

然後在每一個頂部和每一個認證頁面:

session_start(); 
if (!$_SESSION['authenticated']) { 
    header("Location:fail.php"); 
    exit; 
} 

(注意頭(後明確退出 '位置:...');)

一旦你有這樣的舔,那麼你可以開始考慮重新認證會話ID以防止會話固定/劫持問題,並將用戶密碼存儲爲散列以防止泄露問題。

+0

謝謝,這個也可以,但是我遇到了一個錯誤,在我的瀏覽器上顯示**致命錯誤:打電話給undefined函數stored_pa​​ssword()在C:\網站\ MySite \ logincheck.php **當我將您的第二個代碼添加到我的身份驗證頁面,但沒有最後一點的代碼我確實進入下一頁 – Riddle 2012-04-03 14:37:39

+0

函數「stored_pa​​ssword() 「不是默認的php函數。我假設symcbean意味着你應該創建一個函數,通過引用用戶名來返回用戶密碼。 – alphanyx 2012-04-03 15:04:16

+0

好吧,如果我排除「stored_pa​​ssword()」函數,那麼它一切正常,但現在我的問題是,當我添加你的第二個代碼塊到頁面的頂部,如果登錄成功,然後用戶被髮送到fail.php。所以我要出去肢體,並假設'如果'條件有問題,因爲一切都沒有它的工作......有沒有辦法解決這個問題?請幫忙 – Riddle 2012-04-04 07:20:42

3

你用這個,如果以檢查的元素是相同的

if ($p===$p1) { 

你說的$ p是您的帖子變量和$ P1是數據從數據庫...

我不是很確定,因爲我沒有看到你的腳本很多,但我會期望,如果問題總是如此,因爲你使用三個=字符「===」與三個等號你檢查變量類型。

兩個變量是從類型「陣列」(據我期望的那樣)所以你的問題總是像這樣

if (array === array) { 

,這是總是如此。

你應該指定你的問題。

if ($p['password'] == $p['password']) { 

或任何你想檢查。

摘要:據我可以在你的短代碼見我希望,這個問題是特里普爾等號

編輯:

你應該改變你的登錄。 最好的方法是通過sql檢查用戶信息是否正確。

示例: $ sql =「選擇ID從用戶WHERE名稱='」。 $ p ['name']。 「'和密碼= MD5($ p ['password'])」

然後執行sql。您也可以使用計數(*)來檢查登錄信息是否正確。如果它不正確,那麼不應該從數據庫返回。

+1

的== =運算符也會比較變量的值,而不僅僅是類型。即1 === 2將返回錯誤 – 2012-04-03 13:55:35

+0

謝謝你的工作 – Riddle 2012-04-03 14:02:57

+0

是啊,剛剛發生我..只要它的工作,但Mr_Chimp是正確的。 ===運算符比較值和 – alphanyx 2012-04-03 14:04:29

0

試試這個:

var_dump($p); 
var_dump($p1); 

它不會解決你的問題,但它會告訴你什麼是存儲在變量,它們是什麼類型的變量。

你期待什麼樣的價值觀?