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

Форум PHP

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

 

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

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

тема: Пример из статьи про "Безопасное программирование"
 
 автор: Veli   (21.08.2006 в 07:14)   письмо автору
 
 

У меня следующая проблема по блоку:

1. Не используйте проверку на возращение строки (mysql_num_rows()), а применяйте следующий подход:

<?php  
  $user 
$_POST['user'];  
  
$pass $_POST['pass'];  
  
$sql "SELECT user, pass FROM users WHERE user = '$user'";  
  list(
$m_user$m_pass) = mysql_fetch_rowmysql_query($sql) );  
  if ( 
$pass != $m_pass or  // даст TRUE, если пароли не равны  
     
$user != $m_user // данная проверка даст TRUE, если была sql инъекция  
  
)  
  {  
        die(
"die");  
  }  
?> 


Я так полагаю, переменные $m_user и $m_pass должны содержать имя пользователя и пароль из базы данных. В последствии их сравнивают с логином и паролем, переданным из предыдущей формы.
У меня же почему то $m_user и $m_pass пустые - не содержат ничего, и поэтому всегда выводится сообщение, что пароль указан неверно.

   
 
 автор: JIEXA   (21.08.2006 в 09:32)   письмо автору
 
   для: Veli   (21.08.2006 в 07:14)
 

Вы уверены, что вводите данные существующего юзера?
Можете показать структуру таблицы и данные?

P.S. Приведенный вами код содержит SQL-Injection.
Чтобы исправить это, вам следует переменную $user обработать функцией mysql_escape_string()
То есть получится:

  $sql = "SELECT user, pass FROM users WHERE user = '".mysql_escape_string($user)."'";  


to cheops: я думаю стоит исправить код в статье :) а то статья про безопасное программирование, содержит SQL-Injection :)

   
 
 автор: Veli   (21.08.2006 в 10:55)   письмо автору
 
   для: JIEXA   (21.08.2006 в 09:32)
 

Как показать структуру таблицы и данные?

   
 
 автор: Саша   (21.08.2006 в 11:07)   письмо автору
 
   для: Veli   (21.08.2006 в 10:55)
 

попробуйте вывести переменные

echo $user . " " . $pass;

   
 
 автор: JIEXA   (21.08.2006 в 11:21)   письмо автору
 
   для: Veli   (21.08.2006 в 10:55)
 

У вас phpMyAdmin есть? В нем есть ссылочка "экспорт"...

   
 
 автор: Trianon   (21.08.2006 в 11:15)   письмо автору
 
   для: JIEXA   (21.08.2006 в 09:32)
 

Она её не содержит. Она её предусматривает.
Метод защиты, конечно, ортопедический, но раз автору нравится...

   
 
 автор: JIEXA   (21.08.2006 в 11:20)   письмо автору
 
   для: Trianon   (21.08.2006 в 11:15)
 

Ну да, всмысле предусматривает :)

   
 
 автор: Veli   (22.08.2006 в 06:13)   письмо автору
 
   для: JIEXA   (21.08.2006 в 11:20)
 

Вот, пожалуйста.

-- Структура таблицы `logins`
--

CREATE TABLE `logins` (
`id` tinyint(11) NOT NULL default '0',
`login` tinytext NOT NULL,
`pass` tinytext NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--
-- Дамп данных таблицы `logins`
--

INSERT INTO `logins` VALUES (1, 'мой_логин', 'мой_пароль');

   
 
 автор: Trianon   (22.08.2006 в 09:39)   письмо автору
 
   для: Veli   (22.08.2006 в 06:13)
 

Очень советую сперва отработать латинские логины и пароли, а потом уже проверять русские.

   
 
 автор: Veli   (22.08.2006 в 10:39)   письмо автору
 
   для: Trianon   (22.08.2006 в 09:39)
 

Да здесь были латинские, это просто я вписал, как для примера!

   
 
 автор: Veli   (22.08.2006 в 12:54)   письмо автору
 
   для: Veli   (22.08.2006 в 10:39)
 

Вопрос завис в воздухе. Весь день просидел, не могу сообразить, в чем ошибка!

   
 
 автор: Veli   (23.08.2006 в 04:13)   письмо автору
 
   для: Veli   (22.08.2006 в 12:54)
 

Вопрос завис в воздухе. Весь день просидел, не могу сообразить, в чем ошибка!

   
 
 автор: Loki   (23.08.2006 в 10:18)   письмо автору
 
   для: Veli   (23.08.2006 в 04:13)
 

Вопрос завис в воздухе. Весь день просидел, не могу сообразить, в чем ошибка!

   
 
 автор: Veli   (24.08.2006 в 15:05)   письмо автору
 
   для: Loki   (23.08.2006 в 10:18)
 

Зачем повторять мою фразу?

   
 
 автор: JIEXA   (24.08.2006 в 20:01)   письмо автору
 
   для: Veli   (24.08.2006 в 15:05)
 

тип столбцов поменяйте на varchar для начала

   
 
 автор: komex   (21.08.2006 в 12:15)   письмо автору
 
   для: Veli   (21.08.2006 в 07:14)
 

Может я чего-то не знаю, но мне не понятно, почему нельзя использовать проверку на возращение строки mysql_num_rows?

   
 
 автор: XPraptor   (21.08.2006 в 16:40)   письмо автору
 
   для: komex   (21.08.2006 в 12:15)
 

Потому, чо при определенном запросе (атака по твоему коду) mysql_num_rows вернет результат, хотя такого пароля и логина не будет в БД.

   
Rambler's Top100
вверх

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