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

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']);

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

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

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