Безопасность в PHP (Обработка даных полученных от пользователей)

    Хочу рассказать о простых приемах, которые помогут обезопасить ваш скрипт.

    Общие положения


    Всегда проверяйте полученные данные от пользователя ($_POST, $_GET, $_REQUEST, $_COOKIE, $_FILES), причем не только от разных инъекций, XSS и прочего, но и на корректность вводимых данных, например, если у вас интернет магазин, то проверяйте, чтобы количество товаров было не отрицательным и целым.

    Представьте себя на месте хакера, подумайте чтобы вы сделали с сайтом.

    SQL-инъекции


    Инъекция SQL (англ. SQL injection — «SQL-вторжение») — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода. Читать дальше на wikipedia
    Чтобы от нее защиться, достаточно использовать:
    • mysql_escape_string() — для защиты строк и двоичных данных
    • mysql_real_escape_string() — для защиты строк и двоичных данных в соответствии с кодировкой, установленной на сервере (требуется соединение с сервером, иначе возвращает пустой результат)
    • intval() — для защиты целочисленных цифровых значений, intval() возвращает 0 в случае если строка не число.
    • floatval() — для защиты дробных значений, аналогичное поведение как и у intval()

    Примеры:
    $sql = "SELECT string FROM test WHERE string='".mysql_escape_string($_POST['str'])."'";

    $sql = "SELECT string FROM test WHERE id='".intval($_POST['id'])."'";



    XSS


    XSS (англ. Сross Site Sсriрting — «межсайтовый скриптинг») — тип уязвимости компьютерной системы, используется при хакерской атаке. Специфика подобных атак заключается в том, что вместо непосредственной атаки сервера, они используют уязвимый сервер в качестве средства атаки на клиента. XSS-атака обычно проводится путём конструирования специального URL, который атакующий предъявляет своей жертве.Читать дальше на wikipedia
    От него достаточно просто защититься с помощью двух функций:


    PHP-инъекция


    PHP-инъекция (англ. PHP injection) — один из способов взлома веб-сайтов, работающих на PHP, заключающийся в выполнении постороннего кода на серверной стороне. Читать дальше на wikipedia

    Это способ взлома, когда можно исполнить любой php-код на стороне сервера, Очень наспространен благодаря функции include(), в которую новички передают перерменную, полученную от пользователя. Ошибочно думают, что код include($_GET['file'].".php"); спасает от такой инекции. НО ЭТО ОШИБКА!!! Потому что злоумышленник может передать в переменную file «ya.ru/%00»(без ковычек) что отбросит расширение .php

    От него существует простой способ защиты:
    • addslashes() — она экранирует NULL-символ(в html он обозначется как %00), слеш и ковычки, что позволяет избавиться от нежелательных инъекций, но лучше пользоваться оператором switch, например:

    switch ($_GET['file']) {
    case '1':
    include("hello.php");
    break;
    case '2':
    include("bye.php");
    break;
    default:
    break;
    }

    Заключение


    Здесь я описал общие принципы, которыми пользуюсь я. Буду рад, если вы поможите дополнить эту статью.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 29

      +1
      для защиты от SQL-инъекции надёжней и удобней использовать
      parameterized statements/placeholders/bind variables
      пример:
      $sql = prepare_sql("SELECT user_id FROM users WHERE user_login = %s AND user_pass = %s", $user_login, $user_pass);

      а в prepare_sql уже mysql_real_escape_string, intval и кавычки
        0
        а PDO уже отменили?
          –1
          у меня производительность после удобности
            +1
            в смысле производительность важней, чем удобность
          0
          для защиты от sql инъекций юзай библиотеку mqsqli и будет тебе счастье
            0
            Расскажите, чем принципиально в этом плане php_mysqli (надеюсь вы её имели в виду) отличается от php_mysql.
              0
                0
                И? Там какой-то другой query()? Или вы про подготовленные выражения? Но в PHP-задачах пример который привел Roxis куда удобнее.
            0
            ... мое мнение:
            клас для таблиц, где прописано типы переменных (полей). при вставке и выборке фильтровать в нужные форматы... может когда-то напишу статю..
            0
            вместо switch использовать in_array и/или isset
            пример:

            $includes = array('hello.php', 'bye.php');

            if (isset($includes[$_GET['file']]))
            include $includes[$_GET['file']];
              0
              спасибо.
              –3
              Вообще мне кажется надо делать всё на процедурах, хотя я хз как в мускуле с этим делом всё обстоит, но под MS SQL Server реализуется.
              ИМХО - Процедуры пожалуй самый лучший метод против SQL Injection.
                0
                А не подскажите статью где прочитать об этом методе?
                0
                Да в инете полно по этому поводу инфы, т.е сравнение что лучше тупо запросы либо выполнение через процедуры есть свои за и против. Простейший пример:
                http://www.aspnetmania.com/Forums/ForumMessage/278187.html
                А так посерфи инет там обезательно найдёш
                  –1
                  Процедуры - это разнесение логики между PHP и СУБД, что нежелательно, т.к. повышает связность компонент проекта.
                    0
                    Это нежелательно, если такой подход будет применяться только для защиты от sql-инъекций. А вообще, вынесение логики в СУБД в множестве случаев очень оправдано, правда это случаи в большенстве своем связаны с повышенными требованиями к безопасности и надежности хранения данных.
                    0
                    по данной ссылке нет ни примера sql-инъекции, ни аргументации в пользу использования хранимых процедур, никаких "за и против".
                    Ссылка к данному топику не имеет никакого отношения
                      0
                      А "'" недостаточно????Там спрашивали как можно защитится от sql-injection. И если внимательно читали и хотя бы представляете что такое процедуры и с чем их едят, то думаю Вы поймёте о чём там речь.
                        0
                        опять же, смотря как в коде вызывается эта процедура. Если sqlstr = "CALL MyProcName tra-ta-ta, bla-bla-bla", то это не метод. Тут ессно лучше использовать препаредстейтмент вместе с процедурой. Хотя в случае MySQl использование хранимки на безопасности почти никак не сказывается (рабоаю с аспнет и родным провайдером MySqlData.dll).
                    +1
                    Поясню автору, почему (скорее всего) минусуют тему. Дело в том, что все это уже все давно знают. Не знать про инъекции могут только чайники. Кроме того, это уже сто миллионов раз обсуждалось повсюду. Лучше конечно пользоваться поиском до публикации поста. Потому народ не считает тему полезной и минусует.
                      0
                      Простите, пользовался. Но к сожалению не нашел. В следющий раз буду пользоваться яндексом, т.к. на хабрапоиск не чувствителен к окончаниям.
                      А про чайников, я часто встречаю по работе такие ошибки, причем, вроде уже не чайники их делуют...
                      Еще раз прошу прощения, что не внимательно искал.
                      0
                      >Потому что злоумышленник может передать в переменную file "http://ya.ru/%00"(без ковычек) что отбросит расширение .php
                      Уязвимость с нулевым символом для PHP уже в прошлом.
                        0
                        Да, если хостинги обновляют php, но есть где стоит старый php и ничего с этим не поделаешь, а клиент уприрается и хочет именно на этом хостинге, потому что на нем дешевле/знакомые порекомендава/просто хочется.
                        0
                        Пишите в index.php:
                        include(addslashes($_GET['file']).".php");

                        Плохой дядя раз сто вызывает index.php?file=index.
                        addslashes нас спасет?
                          0
                          Для базового набора я бы добавил про Session Fixation и CSRF.
                            0
                            Объясните пожалуйста, а зачем Вы написали эту статью? Без иронии и сарказма, просто интересно.
                              0
                              Хотелось бы видеть побольше таких статей на сайте. Спасибо автору.
                                +1
                                ... есть такая прекрасная книга: М. Фленов - "РНР глазами хакера". как то дал друг на досуге почитать. основы очень хорошо приведены...
                                так же рекомендую (сам купил уже себе через е-магазин) М. Кузнецов, И. Симдянов "Головоломки на РНР для хакера". нужно сначала уметь взломать чтоб потом защитить... для етой цели есть даже спец. ПО для обнаружения уязвимостей в сайтах...
                                  0
                                  В общем, советы по защиет одни и те же, только теперь вам стоит немного потратиться на человека, который за деньги проверит ваш сайт на наличие уязвимостей и сообщит вам результаты.

                                  Хочу предложить Вам в помощь сайт hackmysite.ru для проверки защиты вашего ресурса — по сути фриланс биржа для людей обладающих умением взлома. От вас требуется разместить проект, указать тип уязвимости и бюджет. Дальше просто — ждать предложения выполнить проект от экспертов взлома. Проект молодой и ждёт своих клиентов!

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

                                  Самое читаемое