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

Форум PHP

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

 

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

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

тема: Развейте сомнения
 
 автор: Desh   (06.02.2010 в 20:17)   письмо автору
 
 

Здравствуйте,

В статье Безопасное программирование на PHP (http://www.softtime.ru/info/articlephp.php?id_article=35) имеется следующая запись:
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"); 
  } 
?> 


Вопрос мой заключается в следующем: действительно ли здесь не требуется проверять входные данные функцией mysql_real_escape_string()? Собираюсь воспользоваться этим приёмом для проверки данных логина и пароля, поэтому важно знать: точно ли здесь можно не использовать данную функцию или нет.
Заранее большое спасибо ;))

  Ответить  
 
 автор: neadekvat   (06.02.2010 в 20:19)   письмо автору
 
   для: Desh   (06.02.2010 в 20:17)
 

mysql_real_escape_string() использовать нужно обязательно, в случаи отключенных magic quotes, и с mysql_num_rows() это никак не связано

  Ответить  
 
 автор: Desh   (06.02.2010 в 20:24)   письмо автору
 
   для: neadekvat   (06.02.2010 в 20:19)
 

Спасибо

  Ответить  
 
 автор: Тень&   (06.02.2010 в 22:26)
 
   для: Desh   (06.02.2010 в 20:17)
 

mysql_real_escape_string() не проверяет данные.

Лучше, естественно, использовать mysql_num_rows(), необходимо лишь добавить атрибут BINARY на столбец pass, либо использовать оператор с таким же названием. Автор статьи, видимо, не подозревал о таких вещах.

  Ответить  
 
 автор: Desh   (06.02.2010 в 22:56)   письмо автору
 
   для: Тень&   (06.02.2010 в 22:26)
 

>mysql_real_escape_string() не проверяет данные.
Конечно не проверяет, это я не так выразился.

А чем лучше?

  Ответить  
 
 автор: Тень&   (06.02.2010 в 23:02)
 
   для: Desh   (06.02.2010 в 22:56)
 

> Конечно не проверяет, это я не так выразился
Попробуйте сформулировать правильно. Что делает эта функция?

> А чем лучше?
Тем, что меньше кода.

Хотя, я тут вчитался в комментарий автора этого кода:
> данная проверка даст TRUE, если была sql инъекция
Полнейшая, как говорится, чушь. Но статью, очевидно, не поправят.

  Ответить  
 
 автор: Тень&   (06.02.2010 в 23:03)
 
   для: Тень&   (06.02.2010 в 23:02)
 

> А чем лучше?

Вернее даже так: меньше бессмыленного кода.

  Ответить  
 
 автор: Desh   (06.02.2010 в 23:06)   письмо автору
 
   для: Тень&   (06.02.2010 в 23:03)
 

Ясно.
А функция занимается тем, что экранирует спец. символы)

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 12:53)   письмо автору
 
   для: Desh   (06.02.2010 в 23:06)
 

<?php  
  $user 
= @$_POST['user'];  
  
$pass = @$_POST['pass'];  
  
$res mysql_query("SELECT COUNT(*) AS login 
                     FROM users 
                     WHERE user = '"
mysql_real_escape_string($user) ."'
                     AND pass = '"
mysql_real_escape_string($pass) ."'"
                     
);
                        
  if (
mysql_result($res,0) < 1)  
  {  
        die(
"die");  
  } 

так еще меньше бессмысленного кода. Только пароли в явном виде хранить - ооочень зря.

  Ответить  
 
 автор: t3ma   (07.02.2010 в 13:05)   письмо автору
 
   для: Николай2357   (07.02.2010 в 12:53)
 

Зачем символ собаки ? его использовать не нужно
что за условие if (mysql_result($res,0) < 1) ? для этого есть функция mysql_num_rows()

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 13:19)   письмо автору
 
   для: t3ma   (07.02.2010 в 13:05)
 

Символ собаки - вещь вредная. Лучше инициализировать переменные явно
<?php  
  $user 
= isset($_POST['user'])?$_POST['user']:null;

но без собаки, как в первом варианте, еще хуже. Хотя если собака, то должна быть и потом, в запросе. А что касаемо mysql_num_rows(), то единственное значение лучше вытаскивать mysql_result(), для того она и.

  Ответить  
 
 автор: Trianon   (07.02.2010 в 13:49)   письмо автору
 
   для: Николай2357   (07.02.2010 в 13:19)
 

Никоим образом не желая навязывать свою точку зрения, скажу лишь, что по-моему вред от собаки сильно зависит от того насколько велик контекст, ею блокируемый.
И сравнивая
 $user = isset($_POST['user'])?$_POST['user']:null;
 $user = @$_POST['user'];

я выберу второе. Потому что
1) вторую запись легче прочесть и понять. А контекст блокирования диагностики - минимален.
2) первая запись не поможет, если я ошибусь в написании лексем _POST и user.
3) первая запись помешает, если я напишу в первой записи 1-е упоминание _POST/user с ошибкой , а 2-е - правильно .
4) если сравнить скорость, можно схватиться за голову. Хотя это и меньшая боль.

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 14:15)   письмо автору
 
   для: Trianon   (07.02.2010 в 13:49)
 

Не мерял, если чесно... Я инициализацию делаю совершенно иначе, еще медленнее, но намного симпотичнее. А вот на счет удобнее прочесть и понять - у каждого свое видение удобства. Меня пугают собаки. С детства.)))
Потому что если предполагается возможность ошибки - знач что то не так, как задумано.
А если
>я ошибусь в написании лексем _POST и user.
или
если я напишу в первой записи 1-е упоминание _POST/user с ошибкой , а 2-е - правильно .
то какой смысл продолжать работу скрипта?

  Ответить  
Rambler's Top100
вверх

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