Обновить
128K+

PHP *

Скриптовый язык общего назначения

97,22
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Защита от SQL-инъекций в PHP и MySQL

Время на прочтение26 мин
Охват и читатели267K
К своему удивлению, я не нашёл на Хабре исчерпывающей статьи на тему защиты от инъекций. Поэтому решил написать свою.

Несколько пространный дисклеймер, не имеющий прямого отношения к вопросу
Давайте признаем факт: количество статей (и комментариев) на тему защиты от SQL-инъекций, появившихся на Хабре в последнее время, говорит нам о том, что поляна далеко не так хорошо истоптана, как полагают некоторые. Причём повторение одних и тех же ошибок наводит на мысль, что некоторые заблуждения слишком устойчивы, и требуется не просто перечисление стандартных техник, а подробное объяснение — как они работают и в каких случаях должны применяться (а в каких — нет).

Статья получилась довольно длинной — в ней собраны результаты исследований за несколько лет — но самую важную информацию я постараюсь компактно изложить в самом начале, а более подробные рассуждения и иллюстрации, а так же различные курьёзы и любопытные факты привести в конце. Также я постараюсь окончательно развеять множественные заблуждения и суеверия, связанные с темой защиты от инъекций.

Я не буду пытаться изображать полиглота и писать рекомендации для всех БД и языков разом. Достаточное количество опыта у меня есть только в веб-разработке, на связке PHP/MySQL. Поэтому все практические примеры и рекомендации будут даваться для этих технологий. Тем не менее, изложенные ниже теоретические принципы применимы, разумеется, для любых других языков и СУБД.

Сразу отвечу на стандартное замечание про ORM, Active record и прочие query builders: во-первых, все эти прекрасные инструменты рождаются не по мановению волшебной палочки из пены морской, а пишутся программистами, используя всё тот же грешный SQL. Во-вторых, будем реалистами: перечисленные технологии — хорошо, но на практике сырой SQL постоянно встречается нам в работе — будь то legacy code или развесистый JOIN, который транслировать в ORM — себе дороже. Так что не будем прятать голову в песок и делать вид, что проблемы нет.

Хоть я и постарался подробно осветить все нюансы, но, вполне возможно, некоторые из моих выводов могут показаться неочевидными. Я вполне допускаю, что мой контекст и контексты читателей могут различаться. И вещи, которые кажутся мне сами собой разумеющимися, не являются таковыми для некоторых читателей. В этом случае буду рад вопросам и уточнениям, которые помогут мне исправить статью, сделав её более понятной и информативной.

Ещё только начав интересоваться темой защиты от инъекций, я всегда хотел сформулировать набор правил, который был бы одновременно исчерпывающим и компактным. Со временем мне это удалось:

Правила, соблюдение которых гарантирует нас от инъекций


  1. данные подставляем в запрос только через плейсхолдеры
  2. идентификаторы и ключевые слова подставляем только из белого списка, прописанного в нашем коде.

Всего два пункта.
Разумеется, практическая реализация этих правил нуждается в более подробном освещении.
Но у этого списка есть большое достоинство — он точный и исчерпывающий. В отличие от укоренившихся в массовом сознании правил «прогонять пользовательский ввод через mysql_real_escape_string» или «всегда использовать подготовленные выражения», мой набор правил не является катастрофическим заблуждением (как первое) или неполным (как второе).

Но вперёд, читатель — перейдём уже к подробному разбору.
Читать дальше →

Ваш сайт тоже позволяет заливать всё подряд?

Время на прочтение4 мин
Охват и читатели53K
Один французский «исследователь безопасности» этим летом опубликовал невиданно много найденных им уязвимостей типа arbitrary file upload в разных «написанных на коленке», но популярных CMS и плагинах к ним. Удивительно, как беспечны бывают создатели и администраторы небольших форумов, блогов и интернет-магазинчиков. Как правило, в каталоге, куда загружаются аватары, резюме, смайлики и прочие ресурсы, которые пользователь может загружать на сайт — разрешено выполнение кода PHP; а значит, загрузка PHP-скрипта под видом картинки позволит злоумышленнику выполнять на сервере произвольный код.

Выполнение кода с правами apache — это, конечно, не полный контроль над сервером, но не стоит недооценивать открывающиеся злоумышленнику возможности: он получает полный доступ ко всем скриптам и конфигурационным файлам сайта и через них — к используемым БД; он может рассылать от вашего имени спам, захостить у вас какой-нибудь незаконный контент, тем подставив вас под абузы; может, найдя параметры привязки к платёжной системе, отрефандить все заказы и оставить вас без дохода за весь последний месяц. Обидно, правда?

Как ему это удастся?

Реализация REST API на Symfony2: правильный путь

Время на прочтение18 мин
Охват и читатели58K
REST
Создание REST API это нелегкая задача. Нет, серьезно! Если вы хотите написать API правильно, вам придется о многом подумать, решить, быть прагматиком, или API маньяком. REST это не только GET, POST, PUT и Delete. На практике, у вас могут быть взаимодействия между ресурсами, нужно перемещать ресурсы куда-то еще (к примеру внутри дерева), или вы захотите получить конкретное значение ресурса.

В данной статье собрано все, чему я научился реализуя различные API сервисы, используя для этих целей Symfony2, FOSRestBundle, NelmioApiDocBundle и Propel. К примеру сделаем API для работы с пользователями.
Читать дальше →

Хабрастатс

Время на прочтение3 мин
Охват и читатели1.3K

Хабрастатистика


Собственно после появления довольно интересного и популярного топика Хабракамп товарищ opium создал вопрос, где предложил создать скрипт статистики.

Несмотря на работу, личную жизни и другие факторы, которые затянули создание скрипта, я все-таки его допилил до какой-то кондиции.

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

Объектно-ориентированное функциональное метапрограммирование

Время на прочтение2 мин
Охват и читатели3K
Искусство каррирования
Вдохновившись статьей Еще раз о каррировании и частичном применении в PHP, в голову пришла реализация частичного применения метода, именно метода, а не функции.
Каррируем!

Переменные переменных. Свойства свойств. Инициализация данных из суперглобальных массивов легко и просто

Время на прочтение3 мин
Охват и читатели4.1K

Есть интересная идея реализации некоторого обработчика суперглобальных массивов, на примере суперглобального массива $_REQUEST.
Простой способ получить, обработать, обезопаситься за полученные данных с формы и тп. выглядит
Читать дальше →

Миграция базы данных в Zend Framework: Akrabat_Db_Schema_Manager

Время на прочтение3 мин
Охват и читатели8.2K
В процессе работы над одним огромным проектом на Zend Framework, возникла необходимость миграции баз данных и перемещение между версиями, т.е. кроме update, был необходим так называемый downdate. Немного погуглив натолкнулся на интересную статью Роба Алана (в дальнейшем Автор) «Akrabat_Db_Schema_Manager: Zend Framework database migrations». Данная статья не является переводом оригинала, а скорее синтезом его и возникшей проблемы. Об этом и пойдет разговор.
Читать дальше →

Работаем в дороге на телефоне

Время на прочтение2 мин
Охват и читатели3.8K
image
Мы столько времени проводим в дороге. Пробки, дальние путешествия отнимают столько времени, хотя это потраченное время можно было потратить на работу. Бывают моменты, когда в общественном транспорте неудобно достать нетбук или планшет, а разложиться с комфортом даже и речи не идет. На помощь прейдет наш верный друг – сотовый телефон.

В этом посте я хочу представить подборку программ для телефонов, работающих под S60v5.
Читать дальше →

Профилирование PHP скриптов на живом сервере

Время на прочтение5 мин
Охват и читатели17K
Добрый день, сообщество!

Наверняка кто-то из вас сталкивался с такой проблемой: медленно работает сайт на реальном сервере.
Важно оперативно выяснить в каких местах возникли сложности. Использовать для этого xdebug нельзя, так как он создает большую нагрузку на сервер и сам вносит погрешность в измерения. Для решения этой задачи мы выбрали систему, которая позволяет очень быстро собирать древовидную статистику по работе сайта — pinba.
Читать дальше →

Самоисполняемый phar как способ распространения веб-приложений

Время на прочтение3 мин
Охват и читатели8.4K
Как уже, наверное, всем известно, в PHP 5.3 появилась поддержка специального типа архивов с расширением .phar. Те, кто не в курсе — могут почитать отличную статью .phar — исполняемые PHP-архивы
Область применения, которая сразу приходит на ум — это библиотеки/фреймворки в виде подключаемых *.phar архивов и установщики веб-приложений, например, CMS. О последних я и собираюсь рассказать подробнее и с примерами.

Постановка задачи


Цель — получить на выходе один файл, который будет сам по себе исполняемым, и будет содержать в себе все нужные файлы. Если провести аналогию c обычными приложениями — это приложение, которое запаковано в SFX (self-extracting archive).
Читать дальше →

Поддержка пространства имен в PHP 5.3. Примеры работы на ImageCMS

Время на прочтение4 мин
Охват и читатели8.7K
Последние пять лет в истории PHP отличаются впечатляющими изменениями. Этот язык программирования развивается гораздо быстрее в области веб-программирования — релиз РНР 5.4 имеет большинство функций, необходимых в работе с современным веб-языком. Обеспечение поддержки пространства имен — одна из них. Возможность не из новых (php 5.3), но мы использовали ее в своей работе впервые. Собственным практическим опытом и жаждем поделиться.
Читать дальше

Возвращаясь к многозадачности на PHP

Время на прочтение4 мин
Охват и читатели3.6K
Написать эту статью меня побудила совершенно удручающая, на мой взгляд, ситуация с решением многозадачности на языке PHP.
Большая часть программистов заявляют что многозадачности в PHP нет, поэтому не надо и пытаться, а менее зашоренные все же пытаются как нибудь извратиться через запуск множества скриптов или, в лучшем случае, придумывают какие то очень частные решения для распараллеливания скачивания, например.

Статья предназначена для демонстрации самой идеи как вообще реализовать многозадачность практически на любом языке программирования.
Так сказать Proof of concept.
Как говорится всё новое это хорошо забытое старое.
Читать дальше →

Написание программ на PHP с использованием fork()

Время на прочтение5 мин
Охват и читатели39K

Параллельные программы на PHP


Раньше заголовок темы был «Написание многопоточных программ на PHP». В PHP есть ровно один «нормальный» способ писать приложения, которые используют несколько ядер/процессоров — это fork(). О прикладном использовании системного вызова fork() в языке PHP и расширения pcntl я и расскажу. В качестве примера мы напишем достаточно быструю параллельную реализацию grep (со скоростью работы, аналогичной find . -type f -print0 | xargs -0 -P $NUM_PROCS grep $EXPR).
Читать дальше →

Ближайшие события

PHP process manager

Время на прочтение8 мин
Охват и читатели21K
image

Всем привет!

На Хабре было много статей, о том как писать демоны на PHP и другие fork-нутые вещи. Хочу поделится с вами своими наработками на схожую, но все-таки несколько другую тему — управление несколькими PHP процессами.
Читать дальше →

Конвертирование Zend конфига из ini в yaml. Подводные камни

Время на прочтение3 мин
Охват и читатели1.3K
В качестве предисловия скажу что мне всегда нравился yaml. Так сложилось что я по большей части работаю с Zend Framework Но к сожалению ZF долго не поддерживал yaml. Тогда я добавил простой класс который был оберткой для Symfony компонента sfYaml и начал по-тихоньку использовать yaml в своих проектах.

Наконец-то в ZF 1.11.12 добавил Zend_Config_Writer_Yaml и я решил переконвертировать конфиги из ini в yaml

Читать дальше →

Боремся с race condition в PHP

Время на прочтение4 мин
Охват и читатели10K
Ошибки типа «Состояние гонки» (race condition) редко встречаются на малонагруженных проектах, а с ростом нагрузки ситуация медленно, но верно меняется. И однажды обычное кеширование данных в файле, например, вот такое:

function getFlagFromFile($filename) {
    if (file_exists($filename)) {
        if (!$this->validate()) { // а не устарел ли файл?
            unlink($filename);
            return false;
        }
        else {
            return file_get_contents($filename);
        }
    }
    return false;
}

выдаёт ошибку в строке unlink(): файл $filename не существует!
Читать дальше →

Создание графиков с помощью pChart. Данные из MySQL

Время на прочтение3 мин
Охват и читатели42K
Здравствуйте Хабрачитатели! В этом посте я хотел рассказать вам о построении графиков с помощью pChart. Сложного в нем ничего нет, но стандартно(позже, на сайте девелопера нашел и MySQL инфу) он берет данные из файла. Мне это никак не подходило под свои нужны, и я начал ковыряться в скрипте. Результат ниже.

Итак, что нам понадобится:
1. php-модуль GD(для апаче естественно).
2. Скачать библиотеку pChart 1.27.

Чтобы долго все это дело не описывать, я сразу дам готовый скрипт для построения графиков, данные берутся из БД.
Читать дальше →

HyperActive Record – недо-ORM на CodeIgniter

Время на прочтение4 мин
Охват и читатели5K

Общее описание


HyperActive Record – это надстройка над классом DB для фреймворка CodeIgniter 2.0 и выше, позволяющая получать значения полей связанных с записью объектов по внешним ключам (foreign keys) без дополнительного описания связей и данных. Такая недо-ORM
На гитхабе
Страница библиотеки
Зачем это надо и что оно умеет?

Запуск внешних приложений из Notepad++. NppExec: ускоряем поиск в Интернете и не только…

Время на прочтение4 мин
Охват и читатели42K
Поскольку я не очень опытный разработчик — так вышло, что в веб я пришел недавно — по ходу написания кода мне часто приходится обращаться к официальной документации PHP и MySQL, а также искать во время работы с текстами определенную информацию еще на паре сайтов, не связанных с IT, но связанных с другой моей работой.

Notepad++ и поиск в Интернете


Раньше в случае возникновения вопроса мне нужно было выполнить следующие действия:

  1. Выделить фрагмент текста (или кода);
  2. Скопировать его в буфер обмена;
  3. Перейти в браузер;
  4. Вставить текст из буфера обмена в строку поиска (где предварительно должно уже было быть введено site: адрес сайта или открыт требуемый сайт);
  5. Нажать кнопку «искать» (ввод).

С помощью дополнения NppExec это можно сделать в несколько раз быстрее.
Читать дальше →

Весь PHP в двух строчках

Время на прочтение1 мин
Охват и читатели6.9K
Я с гордостью хочу представить вам способ описать весь опыт программирования на PHP двумя строчками.

Двумя объявлениями функций из стандартной библиотеки PHP:

array_filter($input, $callback);
array_map($callback, $input);

Угумс.