Параметры SQL — где использовать

#mysql #sql #database #parameters

#mysql #sql #База данных #параметры

Вопрос:

Я нахожусь в процессе применения параметров SQL к своему проекту, чтобы предотвратить внедрение SQL.

Должен ли я добавлять параметры к каждому запросу в моем приложении, включая запросы, которые не требуют какого-либо взаимодействия с пользователем?

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

Это то, что меня смущает, я тоже добавляю метод параметра в этот запрос, даже если идентификатор ключевого слова был не от пользователя?

Большое спасибо

Комментарии:

1. Пожалуйста, используйте заполнители последовательно (читай: везде). Спасибо! 🙂

Ответ №1:

Да, используйте параметризованные запросы в любом месте, где у вас есть параметры.

Тот факт, что сегодня пользовательский ввод не используется для конкретного запроса, не означает, что завтра будет то же самое. Изменения кода. Возможно, злоумышленник выяснит, как скомпрометировать первый запрос, а затем второй.

Вы должны подумать о глубокой защите.

Комментарии:

1. 1 «используйте параметризованные запросы в любом месте, где у вас есть параметры». Не может быть проще

2. Вот Джефф Этвуд по этому вопросу: codinghorror.com/blog/2005/04 /…

Ответ №2:

Да, это тоже должно быть параметром. В противном случае вам нужно отслеживать, какие значения, которые вы вставили в базу данных, поступили от пользователя — ничто не мешает использовать имя «‘; DROP DATABASE». Если вы слепо доверяете обработке данных из базы данных, вы обязательно ошибетесь в какой-то момент.

Что-то вроде:

 SELECT Rows FROM TABLE2 WHERE KeywordId = (
   SELECT KeywordId FROM TABLE1 WHERE UserInput = @u
)
  

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

 var keywordId = sql_exec("SELECT KeywordId FROM Table1 WHERE UserInput = @u", userInput);
var rows = sql_exec("SELECT Rows FROM Table2 WHERE KeywordId = '"   keywordId   "'");
  

это было бы неверно, поскольку приложение не использует параметры для внешнего и переменного ввода.