Это хороший вопрос, основанный на некоторых чрезвычайно распространенных заблуждениях .
Есть две вещи: возможная инъекция и фактический эксплойт , и очень важно не перепутать их.
- SQL-инъекция - это возможность изменять программный код SQL на основе пользовательского ввода. Просто возможность.
- фактический эксплойт, ну ... фактический эксплойт, полезная нагрузка, которая выполняет какое-то действие, которое может изменить данные в базе данных или извлечь некоторые данные, к которым атакеру не нужен доступ.
Если вы не можете придумать полезного эксплойта, это не значит, что инъекция не существует. Оно делает. И как только это произойдет, эксплойт будет найден, так или иначе. Относительно того, является ли ваш запрос многострочным, разрешен ли комментарий, запрещены ли какие-либо символы или какие-либо другие ограничения, абсолютно не имеет значения число эксплойтов бесконечно , и если тысяча эксплойтов не сработает, то будет работать первая тысяча.
Итак, теперь вы можете сказать, что (не) известный ' DROP TABLE USERS;
эксплойт не является синонимом SQL-инъекции. Это только один из бесконечного числа возможных эксплойтов.
Более того, хотя не каждый API позволяет выполнять несколько запросов, поэтому наличие разделителя в запросе всегда приводит к синтаксической ошибке, это не означает, что ваш запрос является надежным и безопасным . Даже если невозможно выполнить запрос на изменение данных с помощью SQL-инъекции, это не означает, что никакого вреда нет. Эксплойт, который получает ваши данные, на которые вы не авторизованы, может быть более вредным, чем удаление таблицы.
Итак, что за вынос из этой напыщенной речи?
Да, этот запрос можно разрушить с помощью SQL-инъекции, с фатальными последствиями.
А с точки зрения разработчика, вам все равно, какие именно эксплойты возможны. Вы должны всегда исправлять инъекцию, всю возможность, а не какой-то конкретный эксплойт, о котором вы знаете. Для этого вы просто никогда не впустите какие-либо внешние данные в ваш запрос, так просто.