Почему параметризованные запросы позволяют перемещать пользовательские данные из строки для интерпретации? - PullRequest
0 голосов
/ 08 июня 2018

С https://en.wikipedia.org/wiki/Code_injection#Preventing_problems

Чтобы предотвратить проблемы с внедрением кода, используйте безопасную обработку ввода и вывода, например:

  • Использование API, которые при правильном использовании являютсябезопасный от всех вводимых символов. Параметризованные запросы (также известные как «скомпилированные запросы», «подготовленные операторы», «связанные переменные») позволяют перемещать пользовательские данные из строки для интерпретации. Кроме того, API-интерфейс Criteria [7] и аналогичные API-интерфейсы удаленыиз концепции командных строк, которые будут создаваться и интерпретироваться.

Мне было интересно, как и почему «параметризованные запросы (также известные как« скомпилированные запросы »,« подготовленные операторы »,« связанные переменные »).") позволяет перемещать пользовательские данные из строки для интерпретации" и предотвращать или смягчать проблемы с внедрением кода?

Можете ли вы также привести некоторые примеры с пояснениями?

Спасибо.

1 Ответ

0 голосов
/ 08 июня 2018

Скомпилированные запросы используют специальный синтаксис, понятный базе данных.Они обычно добавляют заполнители для параметров, таких как:

select * from applicant where name = ?

select * from applicant where name = :name

Точный синтаксис зависит от конкретной технологии: JDBC, ODBC и т. Д.

Теперь, когда эти запросы отправляются в базу данных(без конкретных значений параметров) база данных «сохраняет» их.Позже (обычно в одном сеансе базы данных) вы можете запускать их много раз, просто каждый раз предоставляя значения параметров.

Безопасность SQL-инъекций

Онитакже безопасен от SQL-инъекций.Например, если в предыдущем запросе вместо простого значения, такого как Mary, вы использовали значение x'; delete from applicant; --, база данных будет работать безопасно.Он будет работать примерно так:

select * from applicant where name = 'x; delete from applicant; --'

Этот запрос, вероятно, ничего не найдет и будет безопасным.

Если вместо этого вы не используете скомпилированный запрос, а просто решили объединитьSQL в виде строки вы бы сделали что-то вроде:

String sql = "select * from applicant where name = '" + param1 + "'";

И в конечном итоге с запросом UNSAFE:

select * from applicant where name = 'x'; delete from applicant; --

Этот будет выполнять два запроса.Второй удалит всю информацию из вашей таблицы.Наверное, не то, что вы хотите.

...