Простой скрипт аутентификации на PHP не работает

#php

#php

Вопрос:

Начиная с php, я написал базовый скрипт аутентификации, который выводит список баз данных на сервере mysql, если идентификатор пользователя (предоставленный пользователем) существует в пользовательской таблице «тестовой» базы данных.

Проблема в том, что этот скрипт выводит список базы данных, даже если идентификатор пользователя не существует в базе данных. Я не уверен, что не так со скриптом. пожалуйста, просмотрите скрипт и помогите мне понять, почему выводится список БД, даже если идентификатор пользователя не существует в БД. Вот скрипт:

 <?php

if(isset($_POST['submitted']))
{
  $userid=$_POST['userid'];
  $userpassword=$_POST['userpassword'];
  $link_id=mysql_connect("localhost","root","pass");
  $result_db_list=mysql_list_dbs($link_id);
  mysql_select_db("test",$link_id);
  if(!($result_ptr=mysql_query("Select userid from user where Userid='$userid'",$link_id))) die ("Please enter correct userid");
     while($test=mysql_fetch_row($result_db_list))
      {
       echo $test[0]."<br>";
      } 

}
else
{
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Authentication Script</title>
<style type="text/css" >
  #header{
  padding-top:0px;
  margin:0px;
  background-color:#CCCCCC;
  }
  .container{
  width:950px;
  margin:0 auto;
  border:1px solid red;
  }
 .authbox {
 padding-top:100px;
 margin:0 auto;
 }
  #footer{
  background-color:#666666;
  color:white;
}
</style>
</head>

<body>
<div id="header">

<div class="container">

<form action="authentication script.php" method="post">
<div class="authbox">UserName: <input type="text" name="userid" /><br/>
Password: <input type="password" name="userpassword" /><br/>
<input type="hidden" name="submitted" value="true" />
<input type="submit" value="Submit" />
</div>
</form>


</div>

</div>

<div id="footer">
Copywright 2010 NT Technologies. 
</div>

</body>
</html>

<?php
}
?>
  

Спасибо
rseni.

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

1. перепроверьте свой sql-запрос, почему вы не проверяете идентификатор пользователя и пароль?

2. Ваш скрипт уязвим для SQL-инъекции: en.wikipedia.org/wiki/SQL_injection

3. Не обязательно связано с вашей проблемой, но вы не должны использовать переменные в своих SQL-операторах. Если возможно, используйте MySQLi ( us3.php.net/manual/en/book.mysqli.php ) и инструкции. Если это недоступно, обязательно используйте такие функции, как mysql_real_escape_string ( us3.php.net/manual/en/function.mysql-real-escape-string.php ). Приведенный выше скрипт уязвим для внедрения SQL. Я понимаю, что это, возможно, тестовый скрипт, но лучше всего привыкнуть использовать эти методы.

4. Чудак с кодированием. Что ж, в следующий раз я буду иметь это в виду, однако скрипт не должен выводить список БД, даже если в скрипте есть только проверка идентификатора пользователя.

Ответ №1:

Ваш скрипт полон ошибок. (Я надеюсь, что, по крайней мере, у вас есть magic_quotes on , иначе у вас очень большая проблема. Обратите внимание, что вам в любом случае следует избегать magic_quotes и использовать подготовленную инструкцию)

Это происходит из-за

   if(!($result_ptr=mysql_query("Select userid from user where Userid='$userid'",$link_id))) 
     die ("Please enter correct userid");
  

Этот запрос не возвращает FALSE, если он ничего не выбирает.

Вы должны изменить его на:

 $result = mysql_query("SELECT COUNT(*) as countUser [etc]");
$r = mysql_fetch_assoc($result);
if ($r['countUser']==0) 
  die('Denied');
  

Ответ №2:

Appu — yes123 верен. Взгляните на документацию по php.net для функции mysql_query — Вы увидите, что она возвращает идентификатор ресурса при успешном выполнении и FALSE при ошибке. Ошибка здесь не означает, что строки не возвращены, а скорее ошибка, например, при попытке выполнить этот запрос к таблице, которая не существует.

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

1. спасибо службе поддержки, но ваш ответ был бы намного лучше, если бы вы опубликовали его в качестве комментария 🙂