2017-08-02 116 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指出的那样,以纯文本形式存储密码是一个重大的安全漏洞。