• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь Как правильно обработать кавычки в DLE?

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.526
Реакции
121
Вопрос относительно ДЛЕ, его классов (парсер)
При отправке формы в поле "название" можно указывать кавычки. Нужно сначала очистить параметр $_POST['name'], затем провести пару мероприятий по проверке, а потом, если ошибка, то вывести в снова форме это название. Если все ок, то сохранить в БД.
Дошел до использования в названии кавычек... оказалось, что кавычки экранирует при выводе формы, причем сразу три слеша.
В общем, запарился с этими кавычками...
Было:
PHP:
$_name = $db->safesql( $parse->process( trim( strip_tags ($_POST['name']) ) ) );
Я решил сделать так (заменить все кавычки на ёлочки, а затем делать все задуманное:(
PHP:
$name = $_POST['name'];
        $name = preg_replace('/\"([^\"]+)\"/', '«$1»', $name);
        $_name = $parse->process( trim( strip_tags ($name) ) ) ;
А когда все проверилось, все хорошо, и пришло время делать вставку в БД, то я делаю экранирование:
PHP:
$_name = $db->safesql( $_name );
Но опять же, если ввести название в двух кавычках, то проблема остается... при выводе формы в поле выводит так:
Т.е. двойные кавычки в html выводиться неправильно, все срезает.
И теперь вопрос:
насколько я правильно все это дело сделал?
может есть решение правильнее для безопасности?
 
htmlspecialchars и будет Вам счастье... Зачем юзать всё подряд? Ну и $db->safesql традиционно перед запросом...

А по хорошему, одного $db->safesql может быть достаточно..
 
Т.е., делая только:
PHP:
$_name = htmlspecialchars( $_POST['name'] , ENT_QUOTES );
будет полная защита?
 
Для файловой работы (т.е. для вывода текста на HTML-страницу) этой защиты достаточно, т.к. любой специальный символ будет переведён в его сущность.
Для защиты БазыДанных необходимо:
1) Все цифровые поля (INT, BIT, FLOAT и т.д.) обрабатываем через intval(); При этом в SQL-Запросе кавычки НЕ ИСПОЛЬЗУЮТСЯ! Пример:
PHP:
$i = intval($_POST['num']);
$db->query("INSERT INTO `tpl1` (num) VALUE ({$i})");
2) Вся текстовая информация (VARCHAR, TEXT и т.д.) проходит через mysql_real_escape_string(), в случае с ДЛЕ - это $db->safesql(); При этом переменная обрамляется кавычками! Пример:
PHP:
$t = intval($_POST['text']);
$db->query("INSERT INTO `tpl1` (text) VALUE ('{$t}')");
3) Для полей списка (SET, ENUM) лично я рекомендую выбирать значение через case/if-else конструкции - так мы 100% обезопасим себя от левых данных в мускуле и защиту от выбора пункта, которого нет в БД.
На выходе получаем контроль данных, которые попадают в БД.

Почему так? Функция mysql_real_escape_string() не спачёт от SQL-инъекция для цифровых полей (не обрамлённых кавычками), поэтому там используем intval.
 
Назад
Сверху