РУС | EN

14 июня(пятница) 2013 Москва

Телефон: +7 (499) 403-10-11 (многокан)
E-mail: 2013@devconf.ru

Архив 2013 года - актуальная информация тут

Окончательное решение проблемы SQL-инъекций в РНР

Роман Шевченко
Разработчик в компании "Сотмаркет".
В качестве хобби много лет занимаюсь помощью новичкам на различных форумах, что позволило составить уникальную коллекцию типичных заблуждений пользователей РНР.

Доклад(45 мин)    Презентация (pdf, 665 Kb)

Объяснение природы SQL инъекций.
Описание стратегии полной защиты.
Разоблачение очередного мифа "prepared statements защищают на 100%"
Реабилитация несчастной функции *_real_escape_string
Объяснение того, какими на самом деле должны быть prepared statements.

Доклад будет не слишком интересен тем, чей код работы с SQL на 100% покрывается ORM, ActiveRecord или QueryBuilder; полезен тем, кому время от времени приходится писать в коде чистый SQL; и обязателен для тех, кто до сих пор в коде приложения работает с SQL через вызов функций голого API - будь то mysql, mysqli или PDO.

Подробно:
В последнее время меня сильно занимает проблема "виртуальных знаний". Существует как бы две параллельных реальности - реальная, извините за тавтологию, и виртуальная. При этом последняя напоминает анекдот про Вовочку и Советский Союз: в ней все идеально устроено, применяются прекрасные практики и современные шаблоны проектирования. На каком форуме ни спроси - тебе распишут, как сделать идеально. Всякие новомодные изобретения наперебой рекламируют себя, рассказывая, как они сделают жизнь разработчика сладкой, как компот.

При этом в реальности, почему-то, какой файл какого проекта ни возьми - картина сразу оказывается не такой радужной. Если, к примеру, шаблоны на чистом РНР - то обязательно прямо из них лезут в БД. Если наоборот, теплый Twig-овый шаблон - то куча HTML шарашится прямо в контроллере. И так везде.

Самое интересное, что такая вот раздвоенная реальность прекрасно уживается в головах у посетителей форумов и всяких прочих хабов виртуального общения. Стремясь поделиться с ближним знаниями, такой добрый самаритянин будет рекомендовать другим технологию, даже если сам сто раз наступал на её грабли. А часто бывает ещё смешнее - сам шарашит по-старинке, скажем, mysql_* прямо в коде приложения - но на форуме будет всем окружающим рекомендовать prepared statements как панацею. Не зная при этом ни ограничений технологии, ни сложностей, связанных её реальным применением. И вот так, копируя ответы друг друга, такие советчики поддерживают свод виртуальных знаний, не имеющий ничего общего с реальностью.

В своем докладе я попытаюсь примирить эти две реальности, представив решение, которое реализует good practice но при этом не превращает код в навоз при столкновении с первым же нестандартным случаем.


Программа конференции