Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с авторизацией
 
 автор: Hatred   (09.09.2006 в 19:41)   письмо автору
 
 

Приведённый ниже код страницы авторизации с очень незначительными изменениями работает некорректно, а именно: при вводе любого логина можно даже не указывать пароль, авторизация пройдёт успешно. Может быть, я где-то ошибся в коде, но мне кажется, что проблема здесь:


$result=mysql_query($query,$db_connect);
  if($result)
  {
    $HTTP_SESSION_VARS['valid_user']=$userid;
  }


То есть проверяется, произошло ли соединение с БД или нет, а не то, вернул ли запрос что-тот или нет. Даже в случае, если логин или пароль будут указаны и будут возвращены пустые значения, $result не будет принимать значение false, так как возврящает названия полей таблицы auth, пусть даже с пустыми значениями.

Полный код:




<?
$dblocation
="localhost";
$dbname="auth";
$dbuser="root";
$dbpassword="";

session_start();

if(isset(
$HTTP_POST_VARS['userid'])&&
   isset(
$HTTP_POST_VARS['password']))
{
  
$userid=$HTTP_POST_VARS['userid'];
  
$password=$HTTP_POST_VARS['password'];
  
$db_connect=mysql_connect($dblocation,$dbuser,$dbpassword);
  
mysql_select_db($dbname,$db_connect);
  
$query="SELECT*FROM $dbname WHERE name='$userid' AND pass='$password'";
  
$result=mysql_query($query,$db_connect);
  
//$totalRes=mysql_fetch_assoc($result);      Для корректной работы скрипта авторизации
  
if($result)     //Значение $result нужно заменить на $totalRes
  
{
    
$HTTP_SESSION_VARS['valid_user']=$userid;
  }
}
?>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  <title>Страница регистрации</title>
</head>
<body>
<h2 align="center">Страница регистрации</h2>
<?
if(isset($HTTP_SESSION_VARS['valid_user']))
{
  echo (
"Вы зарегистрированы как "$HTTP_SESSION_VARS['valid_user']." <br />");
  echo 
"<a href='destroy.php'>Выход</a><br />";
}
else
{
  if(isset(
$userid))
  {
    echo(
"Регистрация невозможна");
  }
?>
<form method="post" action="auth.php">
<table>
  <tr>
    <td>Имя:</td>
    <td><input type="text" name="userid" size="16"></td>
  </tr>
  <tr>
    <td>Пароль:</td>
    <td><input type="password" name="password" size="16"></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="Зарегистрировать"></td>
  </tr>
</table>
</form>
<?
}
?>
<br>
<a href="members_only.php">Только для зарегистрированных пользователей</a>
</body>
</html>


Если я не ошибся, то мои исправления корректны и не являются потенциальной уязвимостью?

   
 
 автор: kasmanaft   (09.09.2006 в 20:41)   письмо автору
 
   для: Hatred   (09.09.2006 в 19:41)
 

Исправления это то что закомментировано?
Если раскомментировать, должно работать .. потому как

Возвращает ассоциативный массив с названиями индексов, 
соответсвующими названиям колонок или FALSE если рядов больше нет.

то есть, если рядов нет, $totalRes примет значение false

аналогично можно сделать

if (mysql_num_rows($result) > 0)

   
 
 автор: programmer_2006   (09.09.2006 в 23:09)   письмо автору
 
   для: kasmanaft   (09.09.2006 в 20:41)
 

Проверяй как тебе посоветовали в последнем варианте если количество строк больше 0 то создавай переменную сеанса.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования