Создание логина с использованием текстового файла - PullRequest
0 голосов
/ 07 января 2010

Я пытаюсь создать очень простой логин только для одного или двух пользователей, имя пользователя и пароль хранятся в «admin.txt», текстовый файл отформатирован так: имя пользователя пароль __ У меня не получается зарегистрировать имя пользователя и пароль ... Спасибо за помощь !!

        // username and password sent from form 
       $myusername=$_POST['username']; 
       $mypassword=$_POST['password'];



        $sql = fopen("../admin8183/users/admin.txt", "r");

                    while (!feof($sql)) {
                      $myusername = fgets($sql);
                      $mypassword = fgets($sql);
                      $line = fgets($sql);



         $myusername = trim($myusername);
         $mypassword = trim($mypassword);

                }
            //  counting  rows
         $admin=count(file("../admin8183/users/admin.txt"));

           if($admin==1){
        // Register $myusername, $mypassword and redirect to file "sendmessage.php"
         session_register("myusername");
         session_register("mypassword"); 
          header("location:sendmessage.php");
             }
              else {
            echo "Wrong Username or Password";
              }

p.s. Я уверен, что в моем коде есть несколько ошибок, и что есть более эффективные способы достижения моей цели, это мой первый шаг при создании логина в php ... Спасибо за вашу помощь!

Ответы [ 3 ]

2 голосов
/ 07 января 2010

С этим скриптом связано несколько проблем:

  • $ myusername, $ mypassword - сначала эти переменные инициализируются из данных $ _POST, а затем перезаписываются содержимым файла. Я не вижу никакой проверки введенного пользователем пароля по отношению к паролю в файле.
  • Файл пароля загружается дважды - один раз через fopen / fgets и снова через файл. Это расточительно - загружать файл только один раз через file ()
  • Следующие строки: $admin=count(file("../admin8183/users/admin.txt")); ... if($admin==1) разрешит любому доступ, если файл пароля содержит только одну строку. Что никогда не произойдет, если имя пользователя / пароль находятся в отдельных строках. Хуже того, эта проверка не зависит от ввода пользователя.
  • Пароль сохраняется в сеансе. По крайней мере, если имя пользователя и пароль верны, переменная сеанса с именем $_SESSION['logged_in'] должна быть установлена ​​в true.
  • Пароль хранится в зашифрованном формате? Как минимум, пароль должен храниться как хэш SHA1 / MD5.
  • session_register устарела.

Создать безопасную схему аутентификации пользователя сложно. Как уже отмечали другие, попробуйте использовать базовую аутентификацию Apache. Вот хороший учебник:

http://www.nexcess.net/support/tutorials/misc-tools/htaccess-authentication/

1 голос
/ 07 января 2010

Во-первых, я должен сказать, что это неправильный способ выполнить вашу задачу. Предложение об использовании комментария htpasswd очень правильно.

Что касается вашего кода:

  1. Вы используете одну и ту же переменную $myusername при чтении из $_POST и из файла. Вам нужно использовать отдельные переменные и сравнить потом.
  2. Вы ожидаете, что файл будет иметь 3 строки (3 получает), но вы регистрируетесь, только если он имеет 1 строку)

Обновление

Поскольку вы не можете использовать htpasswd, я настоятельно рекомендую хешировать ваш пароль. Либо, если вы сохраните его в файле или в жестком коде, это хорошая практика. Как указал @silky, sha1 / md5 ничем не лучше простого текста, поэтому здесь есть реализация sha256 для PHP .

Кроме того, не сохраняйте свой пароль / имя пользователя в сеансе, как указал @ pygorex1, используйте другую переменную для пометки пользователя как вошедшего в систему.

0 голосов
/ 07 января 2010

Ну, может показаться, что fgets () получает целую строку: http://php.net/manual/en/function.fgets.php

поэтому вы помещаете всю строку username password в $mysuername, а затем следующую строку в $mypassword и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...