1

嗨,我正在创建一个简单的登录系统。我知道我做的方式是完全不安全的,但它只是为了学习目的,因为我是 php 新手。我在验证时遇到问题,现在它不报告用户名或密码是否存在于 txt 文件中。我还将使用会话(未完全实现)来跟踪用户是否登录。

         <?php 
      session_start(); // session


       if(isset($_POST['register'])) //  Register USER
    {
      $user  = $_POST['username'];
      $password=$_POST['password'].PHP_EOL;
      $fh = fopen("file.txt","a+");
      fwrite($fh,$user." ".$password); //write to txtfile
      fclose($fh);
    }

txt 文件中的输出如下所示:

      user1 password1
      user2 password2

这是我需要帮助的地方

      if(isset($_POST['Login']))
      {
      $_SESSION['username']=$user; 
  $_SESSION['password']=$password;

  $file = file_get_contents("file.txt");



 if (strpos($file, "$user $password".PHP_EOL) !== false) 
  {
     // go to login page
  }
  else 
{ 
     //ERROR
}

    ?>
4

4 回答 4

4

file_get_contents()接受文件名,而不是文件指针,因此您应该使用file_get_contents('file.txt')并摆脱fopen调用。

http://php.net/manual/en/function.file-get-contents.php

然后, 的值$file是一个字符串,其中包含文件的所有内容作为单个字符串。所以你可以使用普通的字符串操作,不需要任何feof东西。

但是,您可能想查看file(),它可能对您有用:

http://php.net/manual/en/function.file.php

编辑:

你的逻辑也有问题。

您首先检查用户名,然后检查密码作为单独的操作。这将匹配具有任何用户密码的任何用户。假设我们有用户 alice 的密码为“foo”,bob 的密码为“bar”,按照当前的逻辑,alice 将能够使用“foo”或“bar”作为密码登录。

所以你真正要找的是一个字符串,它是用户名和密码的连接,它在文件中找到(例如"alice foo".PHP_EOL):

if (strpos($file, "$user $password".PHP_EOL) !== false) {
    // go to login page
} else {
    // error
}

您需要PHP_EOL在其中的原因是这是您用来标记记录结尾的内容。如果您不将它放在搜索字符串中,那么您将匹配真实密码的任何子字符串,包括空密码。(文件包含文本"alice foo".PHP_EOL,它包含文本"alice ",但不包含文本"alice ".PHP_EOL)。

于 2013-03-01T09:06:21.227 回答
1

问题在这里:

$fp = fopen ("file.txt", "r"); // read from file
$file = file_get_contents($fp);

使用fopen您可以逐行读取文件,并file_get_contents通过将文件名指定为参数而不是文件句柄来获取整个文件内容作为字符串。

你把两者混为一谈了。

于 2013-03-01T09:06:52.207 回答
1

引号内的 php 变量的行为就像字符串 $_SESSION['username']="$user"; 像这样使用它 $_SESSION['username']=$user;

于 2013-03-01T09:52:35.410 回答
0

由于您正在学习,我不会给您代码,但可以通过“\n”给您逻辑爆炸然后通过空格爆炸结果数组值

检查数组值 0 和 1 是否等于用户名和密码,如果相同则成功

仍有任何疑问随时提问

于 2013-03-01T09:19:18.843 回答