SQL

Трюки для работы с базами данных. Малоизвестные факты, рекомендации, мой опыт.

Error-Based SQL injection в MySQL

3 комментария

SQL injectionЧто такое SQL инъекцию сегодня наверное знает каждый второй ребенок. Error-Based — уже менее знакомый термин, но все же так же прост для понимания.

На всякий случай попробую объяснить. В некоторых ситуациях инъекция происходит в запросе который непосредственно не выводит никаких данных на страницу, либо же вообще никак не влияет на вывод. И если в первом случае данные из базы можно извлечь относительно просто, используя IF, косвенно влияя на вывод страницы, и тем самым прибегнув к бинарному поиску. То вот во втором случае — все очень грустно, бинарный поиск, как правило, основывался на конструкции SLEEP и замере времени ответа, что давало огромные задержки на вывод данных через эту инъекцию.

Следующей вехой в развитии этой атаки стал вектор Error-Based. Он основывается на выводе информации в тексте ошибки выполнения запроса. Как вы понимаете, для этого нужен прямой вывод текста ошибки на саму страницу. Да я согласен, это бывает не часто, и вообще за вывод ошибок на продакшене нужно жестоко карать. Но если вам повезло, то это поможет существенно сократить время атаки.
Читать далее →

Неявная проблема ON DUPLICATE KEY и AUTO INCREMENT

14 комментариев

Сейчас хочу вам предложить обсудить один интересный факт. Возьмем обычную таблицу:

CREATE TABLE `test_table` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`date` DATE NOT NULL ,
`value` INT UNSIGNED NOT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE ( `date` )
) ENGINE = INNODB ;

В ней три поля:

  1. id — первичный ключ с автоинкриментом
  2. date — уникальный ключ
  3. value — некие данные

Не так давно я писал насколько круто использовать конструкцию ON DUPLICATE KEY. Но как оказалось, данная конструкция имеет один подводный камень.
Читать далее →

Удобная обертка PDO

13 комментариев

Выкладываю на ваш суд свой класс-надстройку над стандартным PDO. Писался и совершенствовался он с каждым проектом, и содержит все мои изменения суммарно.

Ссылка на GitHub (обновлено 26.06.2016)

Данное расширение добавляет следующий функционал:

  • Цепочки вызовов
  • Аналоги функций из pear::db
  • Показать сформированный запрос
  • Функции для подсчета статистики запросов
  • Дополнительные функции
  • Дополнительные опции
  • Другие изменения

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

Как хранить IPv4 в БД

10 комментариев

Как ни странно, но многие разработчики до сих пор хранят ip адрес в базе плейн текстом, что вобщем то совсем непрактично.

На самом деле адрес IPv4 удобно хранить в виде беззнакового int 32. И в этой кратенькой статье я вам расскажу о том, как это делать и какие неоспоримые преимущества это дает. Я думаю, этот материал будет полезен многим.

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

Уроки SQL. Сжимаем три запроса в один.

18 комментариев

Очень часто любому разработчику приходится сталкиваться с такой ситуацией:

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

Начинающий программист решит эту задачу в три запроса, приблизительно так:

$result=mysql_query("SELECT * FROM `logs` WHERE `ip`='".$ip."'");

if(mysql_num_rows($result)==0){
	mysql_query("INSERT INTO `logs` (`ip`, `data`) VALUES ('".$ip."', '".$data."')");
}else{
	mysql_query("UPDATE `logs` SET `data`='".$data."' WHERE `ip`='".$ip."'");
}

Ну а не начинающий знает о конструкции

INSERT ... ON DUPLICATE KEY UPDATE ...

Что дает такая конструкция помимо краткости записи? Она дает выйгрыш в скорости! Тесты под катом.
Читать далее →