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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: В каких случаях бессильна mysql_escape_string?

Сообщения:  [1-10]   [11-11] 

 
 автор: Shorr Kan   (22.02.2007 в 21:36)   письмо автору
 
   для: Trianon   (22.02.2007 в 19:51)
 

Ну да... а не в литерале кавычек не бывает (не считая тех самых кавычек, которые обрамляют строку). Теперь я понял, спасибо.

   
 
 автор: Trianon   (22.02.2007 в 19:51)   письмо автору
 
   для: Shorr Kan   (22.02.2007 в 18:41)
 

Экранирование - это, как, к сожалению, многие понимают, трактуют, рассказывают, вовсе не процедура приготовления из опасной строки его безопасного варианта.
Это лишь способ сделать из текста(или даже двоичного объекта) эквивалентное нутро "строкового литерала".
И потому экранирование:
1. - не изменяет опасность -- не бывает опасных или безопасных строк, или даже опасных данных вообще.
Бывают лишь корректные или ошибочные методы обработки этих данных.
2. без последующего обрамления кавычками - действие совершенно бессмысленное. Поскольку литерал без кавычек не бывает.

   
 
 автор: Shorr Kan   (22.02.2007 в 18:41)   письмо автору
 
   для: Unkind   (22.02.2007 в 18:30)
 

"при помощи UNION SELECT."

Приведите примерчик.


"Во всех будет ошибка. Синтаксическая."

Почему? Лишь потому, что mysql_query не позволяет выполнять два запроса? Или есть другая причина?


"Не придумывайте проблем..."

Я интересуюсь лишь в целях обучения.

   
 
 автор: Unkind   (22.02.2007 в 18:30)   письмо автору
 
   для: JIEXA   (22.02.2007 в 18:27)
 

Плохое отношение. Это не придумывание проблем. Учатся на ошибках.

   
 
 автор: JIEXA   (22.02.2007 в 18:27)   письмо автору
 
   для: Shorr Kan   (22.02.2007 в 17:33)
 

Не придумывайте проблем себе - берите числы в одинарные ковычки

   
 
 автор: Unkind   (22.02.2007 в 18:21)   письмо автору
 
   для: Shorr Kan   (22.02.2007 в 17:33)
 

Во всех будет ошибка. Синтаксическая.

Да и вообще, mysql_query() не позволяет выполнять несколько запросов сразу.

Если уж Вы не берете число в кавычки, то убедитесь, что это правда число, иначе есть угроза SQL Injection с помощью UNION SELECT.

   
 
 автор: Shorr Kan   (22.02.2007 в 17:33)   письмо автору
 
   для: Unkind   (22.02.2007 в 13:17)
 

Видимо, я не так выразился...

<?
$where
="a='15'"// нормальный код, который должен был бы быть

$where.=';DELETE FROM tbl'// подсунутый, дополняется переменная

$where=mysql_escape_string($where); // экранируем

mysql_query("SELECT * FROM tbl WHERE $where"); // и что будет?
?>



Вот один из вариантов, который меня смущает. DELETE выполнится?

Вот еще два варианта:

<?
$a
=mysql_escape_string("';DELETE FROM tbl");// допустим, из $_GET такое пришло, но мы отэкранировали...

$where="a='".$a."'"// нормальный код, который должен был бы быть

mysql_query("SELECT * FROM tbl WHERE $where"); // что произойдет здесь?
?>




<?
$where
=mysql_escape_string("WHERE id='15';DELETE FROM tbl");
mysql_query("SELECT * FROM tbl $where"); // что произойдет здесь?
?>


Насколько я понимаю:
В первом случае получается запрос - "SELECT * FROM tbl WHERE a=\'15\';DELETE FROM tbl'"
Во втором - "SELECT * FROM tbl WHERE a='\';DELETE FROM tbl"
В третьем - "SELECT * FROM tbl WHERE id=\'15\';DELETE FROM tbl"

Итог (по-моему) - delete произойдет в первом и в третьем вариантах. Во-втором же просто будет ошибка.

   
 
 автор: Trianon   (22.02.2007 в 13:22)   письмо автору
 
   для: cheops   (22.02.2007 в 12:58)
 

Судя по синтаксису, можно предположить лишь что в хвост SQL-запроса что-то дописывается.
Число это, имя столбца, или вредноносный код - не угадаешь.

   
 
 автор: Unkind   (22.02.2007 в 13:17)   письмо автору
 
   для: Shorr Kan   (22.02.2007 в 05:24)
 

mysql_escape_string() ВСЕГДА одинаково действует. Просто надо понимать что она делает. Ради разнообразия можно вывести на экран запрос и посмотреть, что вы там посылаете СУБД.

   
 
 автор: cheops   (22.02.2007 в 12:58)   письмо автору
 
   для: Shorr Kan   (22.02.2007 в 05:24)
 

Функция mysql_escape_string() предназначена для экранирования спец-символов в строке. Во втором запросе, судя по синтаксису используется числовой параметр и применение к нему функции mysql_escape_string() не имеет смысла, хотя возможно.

   

Сообщения:  [1-10]   [11-11] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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