1

我正在使用 ActiveRecord::Base.connection.execute 将数据插入数据库。运行刹车报告后,我收到此警告:“可能的 SQL 注入”

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

并尝试了其他一些不起作用的东西,甚至不值得一提。有人知道如何解决这个问题吗?

4

1 回答 1

0

问题是您为创建语句所做的插值。

".. (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”、“created_at”、“updated_at”值,这些值不会以 RAW 形式传递给您的查询(如果添加了时间戳,则会自动生成时间戳)。

因此,对于插入:

Student.create(student_id: 1, level: Student.get_level_name(1))
于 2019-09-27T05:25:00.047 回答