2017-08-02 113 views
0

這是login.php。用戶在前一頁輸入用戶名和密碼。數據庫以「user | pass」格式存儲信息。使用爆炸函數分隔用戶並通過「|」傳遞。使用.txt不能正常工作的簡單PHP登錄

$ details [0]在同一行上找到匹配項。但即使輸入的數據與實際的.txt文件正確,也不能用於$ detail [1]。

$user = $_POST['user']; 
$pass = $_POST['pass']; 

$db = file("database.txt"); 

$valid = false; 
foreach ($db as $person) { 
    $details = explode('|', $person); 
    if ($details[0] == $user && $details[1] == $pass) { 
     // Found a math to the database. 
     $valid = true; 
     break; 
    } 
} 

爲什麼會出現這種情況?
謝謝

+3

嘗試'error_log(print_r($ details,TRUE))'並查看日誌文件以查看「$ details」數組中的實際內容。您很可能會發現您的「數據庫」記錄不符合您期望的格式。 – FKEinternet

回答

2

您需要使用file() standered參數分別是: -

FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES 

所以代碼必須: -

$user = $_POST['user']; 
$pass = $_POST['pass']; 

$db = file("database.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 

$valid = false; 
foreach ($db as $person) { 
    $details = explode('|', $person); 
    if (trim($details[0]) == $user && trim($details[1]) == $pass) { 
     $valid = true; 
     break; 
    } 
} 

注: -嘗試使用數據庫來管理用戶記錄以及用於安全目的的散列密碼。感謝

+1

從文件讀取時使用標誌是正確的解決方案。 +1 – fubar

+0

@farar謝謝。是的,這是最有效的方式(因爲它是默認提供的)。 –

+1

確實。我沒有考慮尋找標誌:) – fubar

3

問題是因爲每行的末尾有一個\n字符,這是防止密碼匹配。

如果您修剪換行符,它將匹配。

$details = explode('|', trim($person, "\n")); 

當然,你已經知道以純文本存儲密碼是非常糟糕的。

+0

你只是,顯示我的想法 – user10089632

+0

但投票修剪技巧 – user10089632

2

嘗試trim($details[1]) == $pass刪除從文本文件中讀取的密碼末尾的換行符。

更好的是,使用數據庫表,所以你沒有額外的字符附加到你的數據。

......正如@fubar指出的那樣,以純文本形式存儲密碼是一個重大的安全漏洞。