Помощь Фильтрация данных при GET запросе для модуля DLE

Тема в разделе "DLE", создана пользователем Attyla, 24 апр 2014.

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

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

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

    Attyla

    Регистр.:
    21 ноя 2012
    Сообщения:
    157
    Симпатии:
    42
    Есть сторонний модуль для DLE, у меня есть некоторые подозрения на безопасность, так как в нем нет (насколько я понял) никаких проверок для входящих данных. Возможно, я ошибаюсь, но решил спросить тут.
    Как надо фильтровать параметры GET запроса для того чтобы не нарушить безопасность? Автор моего модуля сказал, что нехорошие символы сканируются в functions.php. Там есть конструкция, которая не пропускает url если в нем есть кавычки и другие небезопасные символы (выдает Hacking attempt!). Этого достаточно или надо дополнительно их проверять?

    Вот что я нашел и есть ли нужда в таких проверках?

    Код:
    $number = intval($_GET['input_number']);

    Код:
    function strip_data($text)
    
    {
        $quotes = array ("\x27", "\x22", "\x60", "\t", "\n", "\r", "*", "%", "<", ">", "?", "!" );
        $goodquotes = array ("-", "+", "#" );
        $repquotes = array ("\-", "\+", "\#" );
        $text = trim( strip_tags( $text ) );
        $text = str_replace( $quotes, '', $text );
        $text = str_replace( $goodquotes, $repquotes, $text );
        $text = ereg_replace(" +", " ", $text);
               
        return $text;
    }
    $input_text = strip_data($_GET['input_text']);
    $input_text = htmlspecialchars($input_text);
    $input_text = mysql_escape_string($input_text);

    Какие общие рекомендации для фильтрации GET в Datalife Engine если данные пойдут в SQL запрос? Как это должно выглядеть? Кто может, поделитесь заготовками для фильтрации данных. Спасибо.

    Версия DLE: >=10.0
     
  2. Горбушка

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

    Регистр.:
    2 май 2008
    Сообщения:
    3.035
    Симпатии:
    2.034
    Не могу сказать, что я спец по безопасности, поэтому текст ниже - это моё ИМХО и основано на моих знаниях PHP и MySQL, а так же на основе кодов DataLife Engine и модулей к нему.

    $number = intval($_GET['input_number']); - 99,99999% безопасная строка. На выходе в $number может попасть только целое число. Дальше проблемы могут быть только если в скрипте кривая обработка нуля и отрицательных чисел, которые вполне могут быть на выходе функции intval.

    А вот вторая запись уже очень сомнительна... Дело в том, что функцию mysql_escape_string надо вызывать только после коннекта к БД (если память не изменяет). Но в DLE уже есть готовая конструкция на этот счёт: $db->safesql();

    Но с точки зрения SQL-инъекции защита правильная. А вот с точки зрения других уязвимостей - не факт.
     
    Attyla нравится это.
  3. Attyla

    Attyla

    Регистр.:
    21 ноя 2012
    Сообщения:
    157
    Симпатии:
    42
    Хотел бы уточнить:

    Вот нашел такой код в functions.php
    Код:
     
       if( $url ) {
           
            if( (strpos( $url, '<' ) !== false) || (strpos( $url, '>' ) !== false) || (strpos( $url, './' ) !== false) || (strpos( $url, '../' ) !== false) || (strpos( $url, '\'' ) !== false) || (strpos( $url, '.php' ) !== false) ) {
                if( $_GET['do'] != "search" OR $_GET['subaction'] != "search" ) die( "Hacking attempt!" );
            }
       
        }
       
        $url = html_entity_decode( urldecode( $_SERVER['REQUEST_URI'] ), ENT_QUOTES, 'ISO-8859-1' );
        $url = str_replace( "\\", "/", $url );
       
        if( $url ) {
           
            if( (strpos( $url, '<' ) !== false) || (strpos( $url, '>' ) !== false) || (strpos( $url, '\'' ) !== false) ) {
                if( $_GET['do'] != "search" OR $_GET['subaction'] != "search" ) die( "Hacking attempt!" );
           
            }
       
        }
    Я так понимаю он уже не пропускает запрос с разными нехорошими символами, а в модуле для переменной которая будет частью sql-запроса нужно еще $somevar = $db->safesql($somevar);? Этого достаточно?!
     
  4. Горбушка

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

    Регистр.:
    2 май 2008
    Сообщения:
    3.035
    Симпатии:
    2.034
    В SQL есть 2 типа данных: те, что заключены в кавчки, и те, что в них не заключены.

    Для защиты от SQL-инъекций достаточно для данных без кавычек (цифры, списки и т.д.) использовать функцию intval. Для данных, которые требуют кавычек, достаточно mysql_real_escape_string(), в DLE эту функцию вызывает $db->safesql($somevar);

    Но не стоит забывать, что получение неожиданных данных из БД тоже может стать уязвимостью, но выше указанного достаточно, чтобы в БД не выполнили произвольный запрос.
     
    Attyla нравится это.
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.401
    Симпатии:
    1.182
    Ха-ха-ха :-], этот интересный код сначала проверяет $url на 6 запретных вхождений, а потом заново получает $url из $_SERVER['REQUEST_URI'] и проверяет уже только на 3 вхождения, что выглядит по меньшей мере странно.
    Ни первая ни вторая проверка не фильтрует на символы ` (обратная кавычка) и " (двойная кавычка), которые активно используют в SQL-иньекциях. Это не означает, что есть скуля, но вызывает подозрение.

    Конечно этот $url может проходить дополнительную очистку, так же может где-то реализована функция проверки всех параметров $_GET, $_POST, $_REQUEST, etc.
    Но конкретно этот код имеет довольно небольшую степень защиты и сам по себе безопасности не гарантирует.
     
    Attyla и Горбушка нравится это.
  6. Горбушка

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

    Регистр.:
    2 май 2008
    Сообщения:
    3.035
    Симпатии:
    2.034
    Как более опытный, подскажи, мой ответ верен был? Или я заблуждаюсь в безопасности функции?
     
  7. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.401
    Симпатии:
    1.182
    В функции safesql используется mysql_real_escape_string - это правильный подход для того чтобы заслешивать "вредные" символы в строках.
    И про использование intval - тоже хороший совет.
     
    Attyla и Горбушка нравится это.