#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. спасибо службе поддержки, но ваш ответ был бы намного лучше, если бы вы опубликовали его в качестве комментария 🙂