Перейти к основному содержимому

Управление черным списком

В некоторых случаях администраторам необходимо отключить определенные шаблоны SQL, чтобы избежать SQL-запросов, которые могут вызвать сбои кластера или неожиданные высоконагруженные запросы.

Selena позволяет пользователям добавлять, просматривать и удалять SQL черные списки.

Синтаксис

Включите блокировку SQL через enable_sql_blacklist. По умолчанию значение False (выключено).

admin set frontend config ("enable_sql_blacklist" = "true")

Пользователь admin, имеющий привилегии ADMIN_PRIV, может управлять черными списками, выполняя следующие команды:

ADD SQLBLACKLIST "<sql>"
DELETE SQLBLACKLIST <sql_index_number>
SHOW SQLBLACKLIST
  • Когда enable_sql_blacklist установлен в true, каждый SQL-запрос должен быть отфильтрован через sqlblacklist. Если он совпадает, пользователь будет уведомлен о том, что SQL находится в черном списке. В противном случае SQL будет выполнен нормально. Сообщение может выглядеть следующим образом, когда SQL заблокирован:

ERROR 1064 (HY000): Access denied; sql 'select count (*) from test_all_type_select_2556' is in blacklist

Добавление в черный список

ADD SQLBLACKLIST "<sql>"

sql - это регулярное выражение для определенного типа SQL.

подсказка

В настоящее время Selena поддерживает добавление операторов SELECT в SQL Blacklist.

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

  • Запретить count(\*):
ADD SQLBLACKLIST "select count(\\*) from .+"
  • Запретить count(distinct):
ADD SQLBLACKLIST "select count(distinct .+) from .+"
  • Запретить order by limit x, y, 1 <= x <=7, 5 <=y <=7:
ADD SQLBLACKLIST "select id_int from test_all_type_select1 order by id_int limit [1-7], [5-7]"
  • Запретить сложный SQL:
ADD SQLBLACKLIST "select id_int \\* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select (id_int \\* 9 \\- 8) \\/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable"

Просмотр черного списка

SHOW SQLBLACKLIST

Формат результата: Index | Forbidden SQL

Например:

mysql> show sqlblacklist;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Index | Forbidden SQL |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | select count\(\*\) from .+ |
| 2 | select id_int \* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select \(id_int \* 9 \- 8\) \/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable |
| 3 | select id_int from test_all_type_select1 order by id_int limit [1-7], [5-7] |
| 4 | select count\(distinct .+\) from .+ |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SQL, показанный в Forbidden SQL, экранирован для всех семантических символов SQL.

Удаление из черного списка

DELETE SQLBLACKLIST <sql_index_number>

<sql_index_number> - это список идентификаторов SQL, разделенных запятой (,).

Например, удалить SQL №3 и №4 из приведенного выше черного списка:

delete sqlblacklist  3, 4;

Тогда оставшийся sqlblacklist будет следующим:

mysql> show sqlblacklist;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Index | Forbidden SQL |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | select count\(\*\) from .+ |
| 2 | select id_int \* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select \(id_int \* 9 \- 8\) \/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+