问题是您为创建语句所做的插值。
".. (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))