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

Тема в разделе "DLE", создана пользователем danneo, 31 дек 2013.

Информация :
Актуальная версия DataLife Engine 11.1
( Final Release v.11.1 | Скачать DataLife Engine | Скачать 11.1 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 10.0 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Модераторы: killoff
  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    Вопрос относительно ДЛЕ, его классов (парсер)
    При отправке формы в поле "название" можно указывать кавычки. Нужно сначала очистить параметр $_POST['name'], затем провести пару мероприятий по проверке, а потом, если ошибка, то вывести в снова форме это название. Если все ок, то сохранить в БД.
    Дошел до использования в названии кавычек... оказалось, что кавычки экранирует при выводе формы, причем сразу три слеша.
    В общем, запарился с этими кавычками...
    Было:
    PHP:
    $_name $db->safesql$parse->processtrimstrip_tags ($_POST['name']) ) ) );
    Я решил сделать так (заменить все кавычки на ёлочки, а затем делать все задуманное:(
    PHP:
    $name $_POST['name'];
            
    $name preg_replace('/\"([^\"]+)\"/''&laquo;$1&raquo;'$name);
            
    $_name $parse->processtrimstrip_tags ($name) ) ) ;
    А когда все проверилось, все хорошо, и пришло время делать вставку в БД, то я делаю экранирование:
    PHP:
    $_name $db->safesql$_name );
    Но опять же, если ввести название в двух кавычках, то проблема остается... при выводе формы в поле выводит так:
    Т.е. двойные кавычки в html выводиться неправильно, все срезает.
    И теперь вопрос:
    насколько я правильно все это дело сделал?
    может есть решение правильнее для безопасности?
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.036
    Симпатии:
    2.037
    htmlspecialchars и будет Вам счастье... Зачем юзать всё подряд? Ну и $db->safesql традиционно перед запросом...

    А по хорошему, одного $db->safesql может быть достаточно..
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    Т.е., делая только:
    PHP:
    $_name htmlspecialchars$_POST['name'] , ENT_QUOTES );
    будет полная защита?
     
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.036
    Симпатии:
    2.037
    Для файловой работы (т.е. для вывода текста на 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.
     
    danneo нравится это.