我应该如何清理/提高我的PHP“比较此字符串”部分的效率?
<?php
session_start();
$_SESSION['name'] = $_POST['name'];
$_SESSION['pass'] = $_POST['password'];
//read the contents of our password file.
$myFile = "password.txt";
$fh = fopen($myFile, 'r');
$data = fgets($fh);
fclose($fh);
//echo the data from the text file - I've edited this out so it doesn't display the data
//echo $data;
//print out an HTML line break
//print "<br>";
//now we need to split our line of data from the text
//file so that we can do the comparison.
//split the text into an array
$text = explode(":",$data);
//echo the split user name - I've edited this out so it doesn't display the data
//echo $text[3];
//print out an HTML line break
print "<br>";
//echo the split password - I've edited this out so it doesn't display the data
//echo $text[1];
//assign the data to variables
$good_name = $text[0].$text[2];
$good_pass = $text[1].$text[3];
//print out an HTML line break
//print "<br>";
//compare the strings
if( $_SESSION['name'] === $text[0] && $_SESSION['pass'] === $text[1] or $_SESSION['name'] === $text[2] && $_SESSION['pass'] === $text[3] or $_SESSION['name'] === $text[4] && $_SESSION['pass'] === $text[5]){
//echo "That is the correct log-in information";
header("Location: home.php");
}else{
echo "That is not the correct log-in information.";
}
?>
我不希望每次添加新用户时都要添加一个全新的 OR 实例,就像在当前代码中完成一样。有没有办法让它更有效率?
答案 0 :(得分:1)
对于初学者:不要存储明文密码。不在任何数据库中,当然也不在文本文件中。
因此,我从您的评论中收集到的是,您的文件中有一行文本,其中包含用冒号分隔的用户名和密码的交替字段。
在那种情况下:
$data = file_get_contents("password.txt");
$data = explode(":", $data);
if (count($data) % 2 != 0) // Error, no even number of fields in password file
return;
$loggedIn = false;
for ($i = 0; $i < count($data) / 2; $i += 2)
{
$user = $data[$i];
$pass = $data[$i + 1];
if ($user == $_SESSION['name'] && $pass == $_SESSION['pass'])
{
$loggedIn = true;
break;
}
}
if ($loggedIn)
{
// Do stuff
}
我真的建议不要使用文本文件密码方法并阅读一些MySQL / PDO教程。
您还必须确保没有用户名/密码包含冒号。
答案 1 :(得分:0)
可能Regular Expressions正是你要找的。 p>
根据您对问题的评论,以下是我正在考虑的一些示例代码:
$file = 'user:password:admin:password:Me:MyPass';
$name = preg_quote($_SESSION['name']);
$pass = preg_quote($_SESSION['pass']);
preg_match("/" . $name . ":" . $pass . "/", $file);
您必须立即解析文件的全部内容。 file_get_contents()也应该在此提供帮助。
但总的来说:从不存储纯文本密码。您总是应该使用加密强哈希算法对它们进行哈希处理。不要使用MD5,不要使用SHA。考虑使用bcrypt,scrypt或PBDKF2,成本高,最好是盐。
无论如何:使用数据库,它们可以让您的生活更轻松;)
答案 2 :(得分:-1)
最好重新安排password.txt
,将用户分为;
,用户名和密码按:
分隔,例如:user1:pass1;user2:pass2
。然后你可以使用这段代码:
<?php
session_start();
//read the contents of our password file.
$myFile = "password.txt";
$fh = fopen($myFile, 'r');
$data = fgets($fh);
fclose($fh);
$temp = explode(';',$data); // split the file into user:pass
$users = array();
foreach( $temp as $userdata) {
$user = explode(':', $userdata); // split username and pass
$users[ $user[0] ] = $user[1]; // put it in an array
}
if( isset( $users[ $_POST['name'] ] ) and $users[ $_POST['name'] ] == $_POST['password'] ) {
$_SESSION['name'] = $_POST['name'];
$_SESSION['pass'] = $_POST['password'];
header("Location: home.php");
}
else {
echo "That is not the correct log-in information.";
}
?>
首先,从文件中加载内容。内容将在每;
分开。然后我们循环到该数组的每一行,将其拆分为用户和密码。
用户名和密码放在新数组$users
中。
唯一剩下的就是检查数组中是否存在用户名,以及密码是否与之对应。
登录后,您最好将数据放入会话中。