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

Форум MySQL

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

 

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

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

тема: mysql_escape_string()
 
 автор: sim5   (02.03.2007 в 12:41)   письмо автору
 
 

Вызывает ошибку если идет запись, такого содержания, например, "Shark's"

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's":....

Из мануала: mysql_escape_string() не мнемонизирует % и _. Тогда в чем ошибка?

   
 
 автор: cheops   (02.03.2007 в 12:49)   письмо автору
 
   для: sim5   (02.03.2007 в 12:41)
 

Откуда приходит строка "Shark's" в скрипт?

   
 
 автор: sim5   (02.03.2007 в 12:52)   письмо автору
 
   для: cheops   (02.03.2007 в 12:49)
 

Берется из таблицы (при этом magic_quotes_gpc() включен), затем помещается в другую таблицу. Пробовал при извлечении stripslashes() - всеравно ошибка.

   
 
 автор: Trianon   (02.03.2007 в 14:29)   письмо автору
 
   для: sim5   (02.03.2007 в 12:52)
 

Перед помещением в другую таблицу Вы забыли применить mysql_escape_string()
magic quotes тут не при чем - параметр-то не входящий.

   
 
 автор: DEM   (02.03.2007 в 12:52)   письмо автору
 
   для: sim5   (02.03.2007 в 12:41)
 

Хех... помню сталкивался с такой ошибкой сам )))

<?
$login 
str_replace("'""&quot;"$login);
?>


Просто MySQL не может обработать одинарные и двойные кавычки и поэтому пишет такую ошибку :(

   
 
 автор: sim5   (02.03.2007 в 12:54)   письмо автору
 
   для: DEM   (02.03.2007 в 12:52)
 

Тоесть, если в выражении есть комбинация одинарных и двойных кавычек, то mysql_escape_string() не работает?

   
 
 автор: sim5   (02.03.2007 в 14:25)   письмо автору
 
   для: sim5   (02.03.2007 в 12:54)
 

Ребята, так что делать - переписать все и выбросить mysql_escape_string()? Или проблема не в mysql_escape_string(), а в "способе" ее вызова?

   
 
 автор: Trianon   (02.03.2007 в 14:31)   письмо автору
 
   для: DEM   (02.03.2007 в 12:52)
 

>$login = str_replace("'", "&quot;", $login);
>Просто MySQL не может обработать одинарные и двойные кавычки и поэтому пишет такую ошибку :(
MySQL обрабатывет любые символы, которые ему корректно передают.

[поправлено модератором]

   
 
 автор: sim5   (02.03.2007 в 14:41)   письмо автору
 
   для: Trianon   (02.03.2007 в 14:31)
 

>Перед помещением в другую таблицу Вы забыли применить mysql_escape_string()

Да нет, я применяю это перед помещением в таблицу. При чем, когда этот товар добавлялся в базу, проблемы не возникало, теперь же при переносе имени с одной таблицы в другую вот такая ошибка.
Значит вместо mysql_escape_string() надо применить addslashes, str_replace... Ну не определять же мне, корректные или не корректные символы для mysql_escape_string() идут.

   
 
 автор: Trianon   (02.03.2007 в 15:01)   письмо автору
 
   для: sim5   (02.03.2007 в 14:41)
 

>Да нет, я применяю это перед помещением в таблицу.
Внимательно читайте текст.
Вы забыли (или не стали выполнять по незнанию) mysql_escape_string при помещении текстовых данных во вторую таблицу.

>При чем, когда этот товар добавлялся в базу, проблемы не возникало,
Тогда за Вас эту операцию сделал механизм магических кавычек.
>теперь же при переносе имени с одной таблицы в другую вот такая ошибка.
Вы выполняете не перенос (запрос INSERT-SELECT) , а получение данных из БД , и добавление в БД заново. Вы заново создаете текст SQL-запроса, заново формируете в этом тексте строковый литерал и обязаны заново экранировать спецсимволы.

>Значит вместо mysql_escape_string() надо применить addslashes, str_replace... Ну не определять же мне, корректные или не корректные символы для mysql_escape_string() идут.

Я бы посоветовал вообще отключить режим magic_quotes, который в большинстве случаев лишь корежит данные, и делать всё руками.
А символы корректны все. Некорректны лишь методы их обработки. Механизм магических кавычек - некорректный метод.

   
 
 автор: sim5   (02.03.2007 в 15:34)   письмо автору
 
   для: Trianon   (02.03.2007 в 15:01)
 

Да в том то и дело, что при помещении данных в другую таблицу я применяю mysql_escape_string. Ну если она не может вкупе обработать одинарные и двойные кавычки, то значит я в любом случае получил бы ошибку?

У хостера magic_quotes включен, значит надо его самому выключить, и все переписать.
На форуме об обработке данных много вопросов было и практически везде советовался mysql_escape_string. Я ведь не ДОКА как многие здесь, вот и последовал совету.

И вот что мне сейчас сделать (что лучше), чтобы исключить подобные ошибки, и чтобы это было надежно в части безопасности?

Тогда мне не понятно - что при INSERT (так был втавлен товар и ошибки не возникало) mysql_escape_string ведет себя так, а при UPDATE (так этот товар вставляется в другую таблицу) совсем по другому? Или я просто вообще ничего не понимаю.

   
 
 автор: Trianon   (02.03.2007 в 15:41)   письмо автору
 
   для: sim5   (02.03.2007 в 15:34)
 

>Ну если она не может вкупе обработать одинарные и двойные кавычки, то значит я в любом случае получил бы ошибку?
Еще раз. Текстовые данные MySQL могут содержать любые символы в любых сочетаниях. Люди в них двоичные объекты хранят вроде фотографий, и никаких искажений не происходит. Просто их нужно научиться правильно передавать в БД, извлекать и применять.

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

   
 
 автор: sim5   (02.03.2007 в 15:52)   письмо автору
 
   для: Trianon   (02.03.2007 в 15:41)
 

Ну собственно ничего не обычного нет вот буру имя товара из таблицы:

$q = db_query("SELECT name FROM ".PRODUCTS_TABLE." WHERE productID=".$prz[0].";") or die (db_error());
$row = db_fetch_row($q);

Далее перед помещением его в другую таблицу для $row[0] применяю mysql_escape_string($row[0]), причем перед этим хоть применяй хоть нет stripslashes, всеравно в итоге ошибка.

Затем помещаю в другую таблицу:

db_query("UPDATE ".PRIZES_TABLE." SET priz='$row[0]', ........

   
 
 автор: Trianon   (02.03.2007 в 16:09)   письмо автору
 
   для: sim5   (02.03.2007 в 15:52)
 

>применяю mysql_escape_string($row[0]),
Каким образом? Как точно выглядит оператор?

$row[0] = mysql_escape_string($row[0]); 
?
и еще один важный момент. У Вас данные, часом, не в utf-8?

   
 
 автор: sim5   (02.03.2007 в 16:17)   письмо автору
 
   для: Trianon   (02.03.2007 в 16:09)
 

Вот так и выглядет $row[0] = mysql_escape_string($row[0]);

cp1251_general_ci.

   
 
 автор: sim5   (02.03.2007 в 17:31)   письмо автору
 
   для: sim5   (02.03.2007 в 16:17)
 

Resume. Как говорится "Пора и чин знать" - спасибо и на этом. Будем что "нибудь думать".

P.S. Наверное беда мануалов - это изложение материала как об аксиоме, и не слова о возможных "исключениях", из-за которых можно набить "шишку"...

   
 
 автор: Trianon   (02.03.2007 в 17:39)   письмо автору
 
   для: sim5   (02.03.2007 в 17:31)
 

Напечатайте запрос непосредственно перед db_query. Чудес на свете не бывает.
$sql = "UPDATE......";
echo htmlspecialchars($sql);
db_query($sql);

   
 
 автор: sim5   (02.03.2007 в 17:42)   письмо автору
 
   для: Trianon   (02.03.2007 в 17:39)
 

Спасибо - попробуем.

   
 
 автор: DEM   (02.03.2007 в 14:59)   письмо автору
 
   для: Trianon   (02.03.2007 в 14:31)
 

Ну просто у меня тоже на Денвере писало такую ошибку, я использовал $login = str_replace("'", "&quot;", $login); и всё стало выводиться нормально.. (а точнее заносится в таблицу)

   
 
 автор: Trianon   (02.03.2007 в 15:04)   письмо автору
 
   для: DEM   (02.03.2007 в 14:59)
 

>Ну просто у меня тоже на Денвере писало такую ошибку, я использовал $login = str_replace("'", "&quot;", $login); и всё стало выводиться нормально.. (а точнее заносится в таблицу)

Да, конечно. Но Вы не исправили ошибку, и даже не нашли её. Вы лишь загнали симптомы болезни внутрь, добавив, если уж переходить на язык медиков, путем применения кривого антибиотика(htmlspecialchars) латентный побочный эффект (превращение текстового контента в html-ный ). В самый неподходящий момент она (болезнь) выползет, и Вы получите массу сюрпризов.

   
 
 автор: DEM   (02.03.2007 в 15:12)   письмо автору
 
   для: Trianon   (02.03.2007 в 15:04)
 

Хс... теперь буду знать, паиб...

   
Rambler's Top100
вверх

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