Перейти к контенту

SQL запросы


Рекомендуемые сообщения

Я в PHP новичек и поэтому у меня возник такой вопрос - как автоматически корректировать sql запрос. Ситуация такая - в запросе передается какой-то html текст, причем в нем могут быть символы ' и " (кавычки). Однако они могут вызвать ошибку парсинга строки запроса. Что в этом случае можно сделать? Если менять эти символы на аббривиатуры, то я полагаю целостность html будут под вопросом. Я придумал только вот такой тупой способ.

 

	
if (strstr($row['message'], "'")) {
$DB->query('UPDATE ibf_messages SET message = "'.$row['message'].'" WHERE msg_id = '.$row['msg_id']);
} else {
$DB->query("UPDATE ibf_messages SET message = '".$row['message']."' WHERE msg_id = ".$row['msg_id']);
}

 

Нужно это мне как для образования, так и для того чтобы доделать Smile Auto-fix (смотри тему про восстановление базы на другом хосте).

Будут очень благодарен за инфу.

Ссылка на комментарий
Поделиться на других сайтах

d1pro

Зачем же так, есть стандартные функции преобразования текста:

htmlspecialchars и addslashes

В твоем случае тебе поможет addslashes, она будет экранировать спецсимволы ' и " и не даст нарушить SQL запрос.

Кстати помимо ошибки в парсинге запроса, можно еще получить и хорошую дырку. Вот пример:

DELETE FROM topic_table WHERE topic_id = '$topic_id';

И предположим что начинающий программист получает этот $topic_id из формы (частый случай на практике).

Пусть он даже методом POST приходит из какого нибудь поля hidden. Злоумышленник меняет форму так что бы поле возвращяло не число 5 или 6, а строку 5' OR 2!='1

В итоге у нас получится такой запрос:

DELETE FROM topic_table WHERE topic_id = '5' OR 2!='1';

2 не равно 1 всегда, значит второе условие бует всегда истинно, а значит вместо темы с ид 5, нам очистят всю базу тем.

От сюда вывод:

1. либо проверять правильность ид, какая нибудь функция verifyid

2. либо использовать такой запрос:

DELETE FROM topic_table WHERE topic_id = '".addslashes($topic_id)".';

3. использовать и то и другое и спать спокойно =)

 

В твоем случае будет так:

$DB->query('UPDATE ibf_messages SET message = "'.addslashes($row['message']).'" WHERE msg_id = '.$row['msg_id']);

Без всяких там лишних условий.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.