Блог им. qq6ka → К чему может привести Sql-инъекция
Расскажу свою историю, которая станет в некоторой степени поучительной. Изначально дело происходило летом, примерно в июле-августе.
Представьте себе провинциальный городок с населением около 60000 человек. В городе этом два провайдера. Один действует уже около 8 лет и имеет около 5000 клиентов. Про него и сей рассказ.
Просматривая один из ресурсов (а точнее — сайт администрации того города), расположенный на сервере, принадлежащем провайдеру, изменил запрос /news.php?id=123 на /news.php?id=124-1. Результат не изменился — ошибок нет, отображается та же новость. Дальше — рутинная работа по подбору количества полей. В принципе, ничего интересного я не ждал, подобных ошибок полно, если бы всё это дело не работало из пользователя root. К тому же не фильтровались теги и яваскрипт в теле новостей. И тут Остапа понесло…
Представьте себе провинциальный городок с населением около 60000 человек. В городе этом два провайдера. Один действует уже около 8 лет и имеет около 5000 клиентов. Про него и сей рассказ.
Просматривая один из ресурсов (а точнее — сайт администрации того города), расположенный на сервере, принадлежащем провайдеру, изменил запрос /news.php?id=123 на /news.php?id=124-1. Результат не изменился — ошибок нет, отображается та же новость. Дальше — рутинная работа по подбору количества полей. В принципе, ничего интересного я не ждал, подобных ошибок полно, если бы всё это дело не работало из пользователя root. К тому же не фильтровались теги и яваскрипт в теле новостей. И тут Остапа понесло…
PostgreSQL → В ожидании 9.0: NOTIFY/LISTEN
Люди, внимательно следящие за новинками в мире PostgreSQL, не по наслышке знакомы с блогом Хуберта 'depesz' Любашевского. А циклы его постов «Waiting for X.X» — настоящий кладезь полезной информации.
Не забыл он и про предстоящий релиз. На его блоге уже присутствуют 34 поста из цикла «Waiting for 9.0». Казалось бы, что угнаться за братом-поляком не представляется возможным. Но в очередной раз просматривая заметки к релизу, я обнаружил ценное нововведение, обделенное вниманием. А именно новую реализацию LISTEN/NOTIFY механизма.
Не забыл он и про предстоящий релиз. На его блоге уже присутствуют 34 поста из цикла «Waiting for 9.0». Казалось бы, что угнаться за братом-поляком не представляется возможным. Но в очередной раз просматривая заметки к релизу, я обнаружил ценное нововведение, обделенное вниманием. А именно новую реализацию LISTEN/NOTIFY механизма.
Zend Framework → Zend_Db_Table_Select Dynamic Finder
Привет, Хабр! 
Написал класс, использующий Zend_Db_Table_Select и позволяющий использовать Dynamic Finder в моделях в проектах на Zend Framework. Статья о том, что этот класс умеет, а также ссылка на исходный код предлагаются вашему вниманию.
Dynamic Finder – способ, позволяющий получать данные из таблицы БД, записывая названия искомых полей в виде названия метода класса, а значения этих полей — в качестве аргумента метода. Например, может использоваться в экземпляре класса модели, связанной с какой-либо таблицей БД.
Dynamic Finder позволяет избежать написания ряда методов вида getById(…), getByLoginAndPassword(…), getAllByCountry(…) внутри модели в виде построения полноценных SQL-запросов и выборок. Вместо этого, в данной реализации достаточно подключить Dynamic Finder к модели должным образом, и, далее, программист может использовать эти методы модели непосредственно в контроллере или представлении. При этом реально эти методы в модели вообще не существуют.
Таким образом, экономится время работы программиста.
Dynamic Finder уже был реализован в том или ином виде в различных библиотеках и фреймворках, в частности, в Ruby on Rails.
В данной реализации Dynamic Finder является надстройкой, использующей Zend_Db_Select / Zend_Db_Table_Select, и предназначен для выборок из только одной таблицы.

Написал класс, использующий Zend_Db_Table_Select и позволяющий использовать Dynamic Finder в моделях в проектах на Zend Framework. Статья о том, что этот класс умеет, а также ссылка на исходный код предлагаются вашему вниманию.
Что это, зачем?
Dynamic Finder – способ, позволяющий получать данные из таблицы БД, записывая названия искомых полей в виде названия метода класса, а значения этих полей — в качестве аргумента метода. Например, может использоваться в экземпляре класса модели, связанной с какой-либо таблицей БД.
Dynamic Finder позволяет избежать написания ряда методов вида getById(…), getByLoginAndPassword(…), getAllByCountry(…) внутри модели в виде построения полноценных SQL-запросов и выборок. Вместо этого, в данной реализации достаточно подключить Dynamic Finder к модели должным образом, и, далее, программист может использовать эти методы модели непосредственно в контроллере или представлении. При этом реально эти методы в модели вообще не существуют.
Таким образом, экономится время работы программиста.
Dynamic Finder уже был реализован в том или ином виде в различных библиотеках и фреймворках, в частности, в Ruby on Rails.
В данной реализации Dynamic Finder является надстройкой, использующей Zend_Db_Select / Zend_Db_Table_Select, и предназначен для выборок из только одной таблицы.
PHP → Тесты для студентов и не только
Моя компания сотрудничает с несколькими ВУЗами города Харькова, благодаря чему студенты имеют возможность пройти производственную практику в IT компании, а не каком-нить заводе. А дабы не брать всех подряд – существуют тесты, с которыми можно ознакомится пройдя по ссылочке (PDF — 278kb) …
На уникальность вопросов не претендую, но пройти их будет полезно…
UPD: Документ под версией 1.0 — замечания и предложения принимаются…
На уникальность вопросов не претендую, но пройти их будет полезно…
UPD: Документ под версией 1.0 — замечания и предложения принимаются…
Django Framework → johnny-cache — кэширование SQL-запросов
johnny-cache — свежий модуль для кэширования SQL-запросов в Django. Он использует memcached для кэширования абсолютно всех SELECT-запросов, позволяя снизить нагрузку на базу данных до минимально возможных значений. Данные сохраняются в кэше до первого изменения в соответсвующей таблице.
SQL → LogParser — привычный взгляд на непривычные вещи
Когда я в очередной раз использовал LogParser, то чтобы проникнуться и чужим опытом, ввел его название в поиск на Хабре. Как результат — сообщение «Удивительно, но поиск не дал результатов». Вот уж воистину удивительно, когда столь интересный инструмент обойден вниманием. Пришла пора восполнить этот пробел. Итак, встречайте LogParser. Маленькая, но чертовски полезная утилита для любителей SQL.
Из названия инструмента, казалось бы, очень непросто понять, что он делает в разделе SQL. А правда заключается в том, что он такой же LogParser, как и ChartGenerator. В то смысле, что он справляется с обоими задачами с одинаковыми успехом. В целом я бы его охарактеризовал как SQL-процессор гетерогенных данных. Концепция работы в общем такова, что он берет данные из некоторого формата и преобразует их в табличный вид (собственно говоря, только на этом этапе и выполняется иногда парсинг). Затем, посредством выполнения над этими табличными данными некоторого SQL-запроса формирует таблицу с результатом и сохраняет ее опять же в некотором формате. Если коротко, то цепочка выглядит как подготовка входных данных->SQL-процессинг->генерация выходных данных.
Из названия инструмента, казалось бы, очень непросто понять, что он делает в разделе SQL. А правда заключается в том, что он такой же LogParser, как и ChartGenerator. В то смысле, что он справляется с обоими задачами с одинаковыми успехом. В целом я бы его охарактеризовал как SQL-процессор гетерогенных данных. Концепция работы в общем такова, что он берет данные из некоторого формата и преобразует их в табличный вид (собственно говоря, только на этом этапе и выполняется иногда парсинг). Затем, посредством выполнения над этими табличными данными некоторого SQL-запроса формирует таблицу с результатом и сохраняет ее опять же в некотором формате. Если коротко, то цепочка выглядит как подготовка входных данных->SQL-процессинг->генерация выходных данных.
SQL → Оптимизация хранимых процедур в SQL Server
Доброго дня, хабрачеловек. Сегодня я бы хотел обсудить с вами тему хранимых процедур в SQL Server 2000-2005. В последнее время их написание занимало львиную долю моего времени на работе и чего уж тут скрывать – по окончанию работы с этим делом осталось достаточно информации, которой с удовольствием поделюсь с тобой %пользовательимя%.
Знания, которыми я собираюсь поделиться, к сожалению,(или к счастью) не добыты мной эмперически, а являются, в большей степени, вольным переводом некоторых статей из буржуйских интернетов.
Итак, как можно понять из названия речь пойдет об оптимизации. Сразу оговорюсь, что все действия, которые я сейчас буду описывать, действительно дают существенный(некоторые больший, некоторые меньший) прирост производительности.
Данная статья не претендует на полное раскрытие темы оптимизации, скорее это собрание практик, которые я применяю в своей работе и могу ручаться за их эффективность. Поехали!
Знания, которыми я собираюсь поделиться, к сожалению,(или к счастью) не добыты мной эмперически, а являются, в большей степени, вольным переводом некоторых статей из буржуйских интернетов.
Итак, как можно понять из названия речь пойдет об оптимизации. Сразу оговорюсь, что все действия, которые я сейчас буду описывать, действительно дают существенный(некоторые больший, некоторые меньший) прирост производительности.
Данная статья не претендует на полное раскрытие темы оптимизации, скорее это собрание практик, которые я применяю в своей работе и могу ручаться за их эффективность. Поехали!
PostgreSQL → Указание Windows путей в выражениях PostgreSQL
Не так уж и много выражений существует в диалекте SQL от Postgres'а, требующих в качестве аргумента путь файловой системы. С ходу могу назвать пару:
- CREATE TABLESPACE…
- CREATE FUNCTION… (в случае динамической загрузки функций на языке C)
Блог им. Manticore → DDB поверх RDB на Питоне
Несколько месяцев назад мне понадобилась документная база данных для одного планируемого проекта на Python. Не знаю как это получилось, но при гуглении я умудрился не заметить ни одного существующего решения и пришел к выводу, что единственный выход — написать свою. Так как мне хотелось получить работающий вариант как можно быстрее, я решил отталкиваться от существующих реляционных баз данных, чтобы не мучаться над реализацией хранилища, поиска, транзакций и тому подобных вещей. В конце концов мое творение приобрело приличный вид, и я решил написать заметку о нем сюда — может, кому еще и пригодится.
PostgreSQL → Распараллеливание длительных операций
Мне часто приходится сталкиваться с задачами, требующими от базы данных очень большой производительности при обработке больших массивов данных. Сегодня я расскажу об очень простом, но действенном приеме, который может вас выручить, если база уже не поспевает за тем количеством данных, которые скапливаются и должны быть обработаны. Метод не зависит от базы данных, но по привычке публикую в блог PostgreSQL, и пример будет именно на ней. Давайте сразу перейдем к примеру.