HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2957.html
Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.
Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.
4. Intro
Совместная работа PT Application Firewall Research Team
Принимали участие:
• Брославский Олег
• Гречнев Сергей
• Колегов Денис
• Кочуркин Иван
• Олексов Никита
• Решетников Сергей
• Худяшов Иван
10. WAF + DBFW
Client WAF Web Server DBFW Database
SELECT * FROM users
WHERE email = 'xxx'
AND password = md5('xxx') OR 1=1; -- 1');
?name=xxx&password=xxx')+OR+1=1;+--+1
11. SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1');
Advanced SQL Analysis
select and
* password
from =
users md5
where (
email “HI”
= )
“xxx“ ;
select md5
* (
from “xxx”
users )
where OR
email 1
= =
“xxx” 1
and ;
password <COMMENT>
16 ≠ 20
SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1');
SELECT * FROM users WHERE email = 'xxx' AND password = md5(‘HI');
Подсчёт токенов
[expression]
[expression]
or
[expression]
email = xxx
[expression]
password =
and
[expression]
1 = 1
email password whereusers
[expression]
md5 xxx
[where][fields] [from]select
[select]
Анализ синтаксического дерева
12. Advanced SQL Analysis
Кроме того, анализ синтаксического дерева позволяет:
Анализ
синтаксиса
Анализ
семантики
построение
«узкоспециализированной»
грамматики веб-приложения
построение «профиля»
SQL-запросов веб-приложения
управление доступом для
пользователей веб-приложения
16. Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
17. Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
• Официальная YACC-грамматика MySQL
(https://github.com/twitter/mysql)
18. Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
• Официальная YACC-грамматика MySQL
(https://github.com/twitter/mysql)
• ANTLR3-грамматика для MySQL Workbench
(https://github.com/mysql/mysql-workbench)
30. Release Fail!
• У нас нет свободных С++
разработчиков
• С++11 не поддерживается у нас в
стеке
31. Release Fail!
• У нас нет свободных С++
разработчиков
• С++11 не поддерживается у нас в
стеке
• Кажется, C++11 не получится
втянуть на Debian Wheezy
32. Test Them All
Python 3.5
Возраст рантайма ~ 2 года
Количество разработчиков 12 человек
Количество коммитов 77
33. Test Them All
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Python 3.5
• Возраст рантайма
~ 2 года
¯_(ツ)_/¯
476,33
11052,3
449,95
0
2000
4000
6000
8000
10000
12000
Q/Sec
Python 2.7 C++11 Python 3.5
34. Test Them All
PyPy
Возраст рантайма Официально не поддерживается
Количество разработчиков -
Количество коммитов -
73. As a Conclusion
• ANTLR может выдавать достаточную производительность
74. As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
75. As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
• Парсер – ничто, инфраструктура – всё
76. As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
• Парсер – ничто, инфраструктура – всё
• ANTLR4-грамматика для MySQL – open source (MIT)
https://github.com/antlr/grammars-v4/tree/master/mysql
77. As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
• Парсер – ничто, инфраструктура – всё
• ANTLR4-грамматика для MySQL – open source (MIT)
https://github.com/antlr/grammars-v4/tree/master/mysql
• Aule – open source (GPL)
https://github.com/PositiveTechnologies/aule
78. As a Conclusion
• ANTLR может выдавать достаточную производительность
• Производительность конкретного рантайма не всегда очевидна
• Парсер – ничто, инфраструктура – всё
• ANTLR4-грамматика для MySQL – open source (MIT)
https://github.com/antlr/grammars-v4/tree/master/mysql
• Aule – open source (GPL)
https://github.com/PositiveTechnologies/aule