Regex для обнаружения базовых SQL-инъекций, но не как средство предотвращения SQL-инъекций

Позвольте мне вначале сказать, что я уверен в мерах, которые я предпринял, чтобы убедиться, что атаки SQL-инъекций провалились. Все значения SQL-запроса выполняются с помощью операторов, подготовленных активной записью, а все операторы, если они не заданы жестко, выполняются с помощью системы числовых белых списков. Это означает, что если кто-то хочет искать через "ILIKE", он пропускает 6, а если он хочет искать через "=", он пропускает 1 и т. Д.

Я также регулярно использую Brakeman и руководство по SQL-инъекциям Rails для проверки кода.

Таким образом, есть три оставшиеся причины, по которым я хотел бы заблокировать попытки использования инжекторов SQL.

  1. Мы получаем много сценаристов, пытающихся нас взломать. Большинство из них уже заблокированы хотя бы один раз, потому что у нас есть система белых списков расширений файлов, которая блокирует большинство из них, когда они пытаются запросить файл php. Однажды, хотя они попадают в черный список в первый раз, во втором раунде они обычно пытаются бросить в нас книгу о SQL-инъекциях. Поэтому я бы хотел пометить этих детишек заранее, чтобы сэкономить пропускную способность, и если бы настоящий актер нас атаковал, было бы легко отделить их от всех детишек-сценаристов.
  2. Замедлите любые попытки исследовать нашу оборону. На самом деле это не повлияет на сложные распределенные атаки, но может замедлить действия актера, находящегося где-то между сценаристом и супер-хакером.
  3. Отметьте все заблокированные запросы и создайте уведомления журнала, о которых мы тогда будем уведомлять нашей службой регистрации, чтобы повысить нашу осведомленность о безопасности.

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

injection_regex = /SOMEREGEXHERE/

Rack::Attack.blacklist('sql injection blacklist') do |req|
  Rack::Attack::Fail2Ban.filter(req.ip, :maxretry => 5, :findtime => 10.minutes, :bantime => 24.hours) do
    CGI.unescape(req.query_string).match(injection_regex) || req.path.match(injection_regex)
  end
end

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

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

Итак, есть ли возможность для такого регулярного выражения работать только как средство обнаружения с минимальными ложными срабатываниями, или это такое целое кроличье, что оно не стоило бы усилий?

1 ответ

Решение

Эта ссылка должна дать вам шаблоны для начала.

http://larrysteinle.com/2011/02/20/use-regular-expressions-to-detect-sql-code-injection/

Текстовые блоки

'(''|[^'])*'

Заявления SQL

\b(ALTER|CREATE|DELETE|DROP|EXEC(UTE){0,1}|INSERT( +INTO){0,1}|MERGE|SELECT|UPDATE|UNION( +ALL){0,1})\b
Другие вопросы по тегам