кусок авторизации

Spike_Manana

Новичок
кусок авторизации

Приветсвую!!!
Написал я авторизацию, всё работало, потом решил немного усложнить проверку пользователя, и теперь авторизация не работает, вот скрипт , помогите!!!
PHP:
if (isset($_POST['username']) && isset($_POST['password'])) {
 $_POST['password'] = md5($_POST['password']);
 // Открывает соединение с БД
 require("../db/opendb.php");
 // Сверяет введенную информацию с данными БД
 $query = mysql_query("SELECT * FROM users WHERE username='".$_POST['username']."'");
 $user = mysql_num_rows($query);
 if (!$user) {
  $err_mess = 'Неверный логин';
 }
 else {
  $user_data = mysql_fetch_array($query);
  if ($_POST['password'] == $user['password']) {
  // Закрывает соединение с БД
  require("../db/closedb.php");
  // Если данные совпадают, устанавливает сессию
  $_SESSION['authorized'] = true;
  // Запоминает данные о пользователе
  session_register("username");
  // Устанавливает куку
  setcookie('auth', $_POST['password'], mktime(0,0,0,1,1,2010));
  // Перебрасывает на индекс
  header('Location: ../index.php');
  }
  else {
   $err_mess = 'Неверный пароль'; 
  }
 }
}
 

Spike_Manana

Новичок
ну первая часть работает, там где он проверяет Логин, а вот 2 часть нет, он выдает сообщение 2 - Неверный пароль
 

sunchess

Новичок
Странный способ
// Если данные совпадают, устанавливает сессию
$_SESSION['authorized'] = true;
// Запоминает данные о пользователе
session_register("username");
// Устанавливает куку
setcookie('auth', $_POST['password'], mktime(0,0,0,1,1,2010));
Использовать три разных метода для одноа авторизации :)

-~{}~ 19.03.06 13:56:

Spike_Manana
ну так может
$_POST['password'] = md5($_POST['password']);


$_POST['password'] заменить на другую перменную в этой части
 

Spike_Manana

Новичок
ну на сессии и куки внимания не обращайте :) я только начал понимать как они работают, и это всё только тест!
sunchess
ок, щас попробую! только вот вопрос один, я тоже думал что проблема именно в этом, но вот не могу понять почему? какая разница использовать $_POST['password'] или $password?

-~{}~ 19.03.06 13:04:

нет! проблема не в $_POST['password'] :| результат тот же!
 

_RVK_

Новичок
Spike_Manana
var_dump($user_data)
var_dump($_POST)

Это назывется отладка.
 

Selecter

Новичок
Кстати, лучше вместо
PHP:
$query = mysql_query("SELECT * FROM users WHERE username='".$_POST['username']."'");
$user = mysql_num_rows($query);
написать так
PHP:
$query = mysql_query("SELECT count(*) FROM users WHERE username='".mysql_real_escape_string($_POST['username'])."'");
$user = mysql_fetch_row($query);
 

SelenIT

IT-лунатик :)
Selecter
Если это вставить в оригинальный код, он точно работать перестанет. Лучше объясни словами, в чем ты видишь ошибку.
 

Selecter

Новичок
Автор оригинала: SelenIT
Selecter
Если это вставить в оригинальный код, он точно работать перестанет. Лучше объясни словами, в чем ты видишь ошибку.
mysql_real_escape_string нужно, чтобы предотвратить атаку MYSQL injection Все пользовательские данные надо обрабатывать этой функцией, прежде чем делать запрос.

А count(*) вместо * будет быстрее работать. Нам нужно лишь знать верный ли логин, а не извлекать всю строчку со всеми другими данными этой строки.
 

Spike_Manana

Новичок
Selecter
ну mysql_real_escape_string не обязательно я думаю, так как я потом регулярное выражение сделаю на проверку опасных символов
 

SelenIT

IT-лунатик :)
> а не извлекать всю строчку

А как тогда автор темы сможет сравнить $_POST['password'] и $user['password']? Может, нужно проверять не логин, а сразу пару логин-пароль/хеш пароля?

Насчет mysql_real_escape_string - замечание верное. Но не полное.

Spike_Manana
Не путай фильтрацию ввода и составление запроса - это разные задачи.
 

Spike_Manana

Новичок
ну у меня по началу было так что он и логин и пароль сверяет, но это менее безопасно чем сначала проверить наличие пользователя а уж потом пароль сверять ИМХО!

-~{}~ 19.03.06 14:20:

SelenIT

ну не важно, я щас о проверке на символы не думаю, и не в запросах и не в форме
 

SelenIT

IT-лунатик :)
Spike_Manana
и в чем же опасность одновременной проверки? имхо, наоборот - с ней злоумышленнику труднее узнать существующие логины...
 

SiMM

Новичок
> ну mysql_real_escape_string не обязательно я думаю, так как я потом регулярное выражение сделаю на проверку опасных символов
Никаких опасных символов в природе не существует. Есть синтаксические ошибки при составлении SQL-запросов. Благодаря которым возможны SQL-injection
 

Spike_Manana

Новичок
может быть и так, я далеко не спец, просто мне показалось что так безопаснее! но раз нет, то тогда так будет достаточно?
PHP:
$query = "SELECT * FROM users WHERE username='".$_POST['username']."'
 AND password='".$_POST['password']."'";
$result = mysql_query($query) or die('Query failed. ' . mysql_error()); 
   
 if (mysql_num_rows($result) == 1) {
 // Если данные совпадают, ставит сессию
 $_SESSION['authorized'] = true;
 

Selecter

Новичок
:)
Синтаксические ошибки? :) Вот пример из справочника:
PHP:
Example 2. An example SQL Injection Attack
<?php
// Query database to check if there are any matching users
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// We didn't check $_POST['password'], it could be anything the user wanted! For example:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// This means the query sent to MySQL would be:
echo $query;
?>
 

SelenIT

IT-лунатик :)
Selecter

в этом примере именно синтакическая ошибка приводит к тому, что вместо безобидной строки "' OR ''='" в запрос попадет SQL-команда.
 

Mozart

Новичок
Re: кусок авторизации

Автор оригинала: Spike_Manana
Приветсвую!!!
Написал я авторизацию, всё работало, потом решил немного усложнить проверку пользователя, и теперь авторизация не работает, вот скрипт , помогите!!!
PHP:
else { 
  $user_data = mysql_fetch_array($query); 
  if ($_POST['password'] == $user['password']) {
Смотри что у тебя в $user['password']...
 

Spike_Manana

Новичок
Спасибо Mozart! Помогло, надо было $user_data['password'] написать вместо $user['password']!
 
Сверху