使用 Brakeman 扫描时如何修复原始 SQL 中的 'Possible SQL injection'

How to fix 'Possible SQL injection' in raw SQL when scanning with Brakeman

我正在使用 ActiveRecord::Base.connection.execute 将数据插入数据库。 运行 brakeman 报告后我收到此警告:"Possible SQL injection"

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

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

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

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

尽管 Brakeman 不知道如果您在那里传递任何值,该值来自哪里,您很容易受到 SQLi 的攻击。

这就是您应该使用 ActiveRecord 来处理数据库插入的原因。它允许您传递记录的值并处理绑定和清理:

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

在那里您可以看到 (, , ) 对应地作为 "student_id"、"created_at"、"updated_at" 值,这些值未以 RAW 形式传递给您的查询(时间戳是如果您添加它们,将自动生成)。

因此,对于插入:

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