Форма входа разрешает доступ с пустым именем пользователя и паролем

#php #authentication

#php #аутентификация

Вопрос:

Я пытаюсь реализовать скрипт входа в PHP, который работает с 3 файлами PHP. Скрипты отлично работают при использовании правильных имен пользователей и паролей, и скрипт даже блокирует доступ, когда предоставляется неправильная информация. Моя проблема в том, что скрипт разрешает доступ, когда вы нажимаете кнопку отправки в форме и не вводите имя пользователя или пароль.

Первый сценарий выглядит следующим образом:

 <form action="login2.php" method="post">
Usuario:<br />
<input type="text" name="username" class="formtext" />
Contraseña:<br />
<input type="password" name="password" class="formtext" />
<input type="submit" value="Ingresar" class="formbutton" />
</form>
  

Как вы можете видеть, форма обращается к «login2.php » который звучит примерно так:

 <?php
$usernames = array("user1", "user2", "user3", "superman");
$passwords = array("test", "pass2", "password3", "supermans password");
$page = "noticias.php";

for($i=0;$i<count($usernames);$i  ){
  $logindata[$usernames[$i]]=$passwords[$i];
}
if($logindata[$_POST["username"]]==$_POST["password"]){
session_start();
$_SESSION["username"]=$_POST["username"];
header('Location: '.$page);
exit;
}else{
header('Location: login.php?wrong=1');
exit;
}
?> 
  

Наконец, на странице, к которой я пытаюсь ограничить доступ, вверху добавлен следующий код, чтобы убедиться, что пользователь вошел в систему:

 <?php require("login3.php"); ?> 
  

И «login3.php » имеет следующий код:

 <?php
session_start();
if(!isset($_SESSION['username'])){
header('Location: login.php');
exit;
}
?> 
  

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

Комментарии:

1. Cmon son if($logindata[$_POST["username"]]==$_POST["password"]){

2. Вам следует более тщательно выбирать онлайн-уроки, которые вы принимаете.

Ответ №1:

 if($logindata[$_POST["username"]]==$_POST["password"])
  

Если $logindata[$_POST["username"]] or в этом случае $logindata[''] не определено, то PHP выдает ошибку уведомления и возвращает NULL или что-то пустое, которое вы затем сравниваете с $_POST['password'] которым также '' (or empty) и (empty == empty) возвращает true , с ошибкой уведомления, конечно.

Вам просто нужно добавить проверку, чтобы убедиться, что имя пользователя также существует, например:

 if(isset($logindata[$_POST["username"]]) amp;amp; $logindata[$_POST["username"]]==$_POST["password"])
  

Комментарии:

1. Спасибо за прямой ответ!

Ответ №2:

Ваша проблема в том, что if $_POST['username'] пусто, и вы используете его в качестве ссылки на ключ массива, PHP будет обрабатывать это значение null как VALID undefined ссылку на массив, поэтому ваша проверка пароля сводится к:

 if ($loginData[null] == null)
  

который становится

 if (null == null)
  

и пользователь уходит.

Ответ №3:

Возможно, вы захотите попробовать что-то вроде

 if($username amp;amp; $password);
[
//info is provided
]
else
[
echo "You did not provide the proper information needed for login.";