Создание функции PHP для поиска в .TXT указанного c имени пользователя и пароля - PullRequest
0 голосов
/ 09 июля 2020

Итак, я пытаюсь создать форму входа в качестве примера, чтобы не было шифрования или чего-то слишком запутанного, в ней 3 файла, форма входа. php, logindisplay. php и password.txt . Цель этого вопроса - рассказать мне, почему приведенная ниже функция не работает, и что я могу сделать, чтобы ее исправить.

Функция предназначена для открытия файла password.txt и найдите имя пользователя и пароль, которые будут в отдельных строках имя пользователя поверх пароль , и если в файле его нет, он должен сказать им добавить его используя специальную кнопку c (создание этих данных в password.txt уже отлично работает в коде), в противном случае разрешите успешный вход в систему. Любая помощь была бы замечательной, и, пожалуйста, имейте в виду, что я знаю очень мало о PHP, поэтому код, возможно, придется немного объяснить в зависимости от! Спасибо и извините, если это плохой вопрос!

Также $ isLogin должен быть глобальной переменной и уже присутствует в коде!

function searchPasswordFile($UserName, $PassWord){
   $search = $UserName. "\n" .$PassWord. "\n";
   $lines = file('password.txt');
   $found = false;
   foreach($lines as $line) {
     if(strpos($line, $search) !== false) {
       $isLogin = true;
       echo "Thank you for logging in!";
     }
   }
     if(!$found) {
       echo "No login found, please Create a new Login!<br />\n";
     }

   $islogin = false;
 }

Ответы [ 4 ]

1 голос
/ 09 июля 2020

пароль.txt

one
two
three
four
five
six

пароль. php

<?php
  
// set $isLogin to the return value from searchPasswordFile
$isLogin = searchPasswordFile('three','four');

function searchPasswordFile($UserName, $PassWord){
        // read password.txt into $lines as an array
        $lines = file('password.txt',FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);

        // get the number of lines in the array
        $lineCount = count($lines);

        // loop through the array, advancing the index by two each time
        for ($i = 0; $i < $lineCount; $i += 2) {
                // if there is a match
                if($lines[$i] === $UserName && $lines[$i+1] === $PassWord) {
                        // report success and return
                        echo "Thank you for logging in!".PHP_EOL;
                        return true;
                }
        }
        // report failure and return
        echo "No login found, please Create a new Login!".PHP_EOL;
        return false;
}
1 голос
/ 09 июля 2020

возможно, лучше всего иметь имя пользователя и пароль в одной строке и разделить их одним пробелом (например, password.txt ниже)

UserName1 PassWord1
UserName2 PassWord2
UserNameN PassWordN

это упростило бы сравнение введенной строки с имя пользователя и пароль

$search = $UserName." ".$PassWord;

в строках password.txt

Итак, предлагаемый обновленный код:

<?php
function searchPasswordFile($UserName, $PassWord){
  $search = $UserName." ".$PassWord;             # Proposed change here
  $lines = file('password.txt');
  $found = false;
  foreach($lines as $line) {
    if(strpos($line, $search) !== false) {
      $isLogin = true;
      echo "Thank you for logging in!";
    }
  }
    if(!$found) {
      echo "No login found, please Create a new Login!<br />\n";
    }

  $islogin = false;
}

echo searchPasswordFile("UserName2", "PassWord2");

Вывод:

Thank you for logging in!

'Надеюсь, это поможет.

1 голос
/ 09 июля 2020

Вы используете file() для чтения файла password.txt, но затем вы хотите искать многострочный контент. Это никогда не будет совпадать, потому что ваш $lines содержит каждую строку чтения отдельно. Вам нужно либо отказаться от использования \n в качестве разделителя (если ваше имя пользователя не может содержать, скажем, : или |, это был бы хороший кандидат), либо измените способ чтения этого файла.

0 голосов
/ 09 июля 2020

Когда вы читаете файл с file, вы получаете массив, где каждый элемент представляет собой отдельную строку . Вы ищете две строки, но только поперек строки за раз.

Есть много разных (и более эффективных) способов сделать это, но вот вариант, основанный на вашем существующем подходе.

$lineCount=count($lines);
for($l=0;$l<$lineCount;$l+=2){
    if(rtrim($lines[$l])==$UserName&&rtrim($lines[$l+1])==$PassWord){
        //Credentials matched
    }
}

В конечном итоге здесь много проблем. Во-первых, никогда не хранит пароли в виде открытого текста. Посмотрите на хеширование. PHP имеет встроенные функции, помогающие в этом. Во-вторых, сравнивая пароли, вы должны помнить о различных уязвимостях (например, о временных атаках, которые не смягчаются в моем примере). Ваш исходный пример (если бы он работал) также разрешил бы аутентификацию с использованием пароля одного пользователя в качестве имени пользователя и имени пользователя следующего пользователя в качестве пароля. Существует множество стандартных форматов файлов со встроенной поддержкой в ​​PHP, которые было бы проще и безопаснее анализировать (например, JSON или XML поддерживаются в ядре PHP). Вам действительно стоит пересмотреть этот подход, если вы создаете что-то отдаленно серьезное. Аутентификация - это не место для ярлыков.

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