Как исправить «Возможное внедрение SQL» в сыром SQL при сканировании с помощью Brakeman - PullRequest
1 голос
/ 27 сентября 2019

Я использую ActiveRecord :: Base.connection.execute для вставки данных в базу данных.После запуска отчета тормозов я получаю это предупреждение: «Возможное внедрение SQL»

sql = "INSERT INTO `students` (`student_id`,`level') VALUES (1, #{Student.get_level_name(1)});"
ActiveRecord::Base.connection.execute sql

И пробовал несколько других вещей, которые не работали, даже не стоит упоминать.У кого-нибудь есть идеи, как это исправить?

1 Ответ

0 голосов
/ 27 сентября 2019

Проблема заключается в интерполяции, которую вы делаете для создания оператора.

".. (1, #{Student.get_level_name(1)});"

Несмотря на то, что Brakeman не знает, откуда берется это значение, если вы передадите какое-либо значение, вы уязвимы дляSQLi.

Вот почему вы должны использовать ActiveRecord для обработки вставок базы данных.Он позволяет передавать значения для записей и имеет дело с привязками и очисткой:

INSERT INTO "students" ("student_id", "created_at", "updated_at")
VALUES ($1, $2, $3)
RETURNING "id"
[["student_id", "1"], ["created_at", "2019-09-27 07:06:57.198752"], ["updated_at", "2019-09-27 07:06:57.198752"]]

Там вы можете видеть ($1, $2, $3) соответственно как значения "student_id", "creation_at", "updated_at", которые не передаются в форме RAW на ваш запрос (временные метки генерируются автоматически, если вы их добавили).

Итак, для вставки:

Student.create(student_id: 1, level: Student.get_level_name(1))
...