d1pro Опубликовано 1 Августа 2003 Жалоба Поделиться Опубликовано 1 Августа 2003 Я в 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 (смотри тему про восстановление базы на другом хосте).Будут очень благодарен за инфу. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 2 Августа 2003 Жалоба Поделиться Опубликовано 2 Августа 2003 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']);Без всяких там лишних условий. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.