Rails 提交表单是否需要保护免受 SQL 注入或 XSS 攻击?
Does Rails submit form need protection from SQL injections or XSS attacks?
我正在安全的内部服务器上开发一个安全的 Rails 应用程序,但我仍然想保护它免受任何类型的 SQL 注入或 XSS 攻击。我知道如果我有一个搜索框,我可以在我的模型中使用这样的东西来保护应用程序免受 SQL 注入:
def self.search(search)
Project.where("project_title LIKE ?"
"%#{search.strip}%"
end
如果有一个直接操作数据库的提交表单怎么样,比如说 projects/new
上的一个表单,我是否也需要保护该输入免受 SQL 注入,如果是这样,如何才能我做到了吗?
每当您使用字符串连接与任何类型的用户输入来构造 SQL 片段时,您都必须关心 SQL 注入。如果你使用参数,你没问题。
例如,这不容易受到 SQL 注入:
Project.where("project_title LIKE ?", "%#{search.strip}%")
但是这个是易受攻击的,因为请求参数被直接写入SQL查询并且数据库无法知道预期查询的结束位置,所以用户可以通过 search
参数向该查询中插入其他部分:
Project.where("project_title LIKE %#{search.strip}%")
同样,如果您 post 表单,问题是您如何在生成的查询中使用请求中的值。如果你总是像上面第一个例子那样使用参数(使用 ?
或带符号的命名参数)并且任何请求参数总是通过参数分配,你的应用程序就不容易受到攻击。如果您像第二个示例那样将请求参数与 SQL 查询混合为字符串,您的应用程序将容易受到 SQL 注入的攻击。
所以澄清一下:如果您使用的是 ActiveRecord,任何 Rails 方法调用都是安全的,可以防止 SQL 注入。只有当您自己将 SQL 语句的一部分编写为字符串并将请求参数合并到该字符串中时,您才需要担心。上面使用 LIKE 的例子有些特殊,您通常不需要使用像 ActiveRecord 这样的 ORM 自己创建 SQL 字符串。
我正在安全的内部服务器上开发一个安全的 Rails 应用程序,但我仍然想保护它免受任何类型的 SQL 注入或 XSS 攻击。我知道如果我有一个搜索框,我可以在我的模型中使用这样的东西来保护应用程序免受 SQL 注入:
def self.search(search)
Project.where("project_title LIKE ?"
"%#{search.strip}%"
end
如果有一个直接操作数据库的提交表单怎么样,比如说 projects/new
上的一个表单,我是否也需要保护该输入免受 SQL 注入,如果是这样,如何才能我做到了吗?
每当您使用字符串连接与任何类型的用户输入来构造 SQL 片段时,您都必须关心 SQL 注入。如果你使用参数,你没问题。
例如,这不容易受到 SQL 注入:
Project.where("project_title LIKE ?", "%#{search.strip}%")
但是这个是易受攻击的,因为请求参数被直接写入SQL查询并且数据库无法知道预期查询的结束位置,所以用户可以通过 search
参数向该查询中插入其他部分:
Project.where("project_title LIKE %#{search.strip}%")
同样,如果您 post 表单,问题是您如何在生成的查询中使用请求中的值。如果你总是像上面第一个例子那样使用参数(使用 ?
或带符号的命名参数)并且任何请求参数总是通过参数分配,你的应用程序就不容易受到攻击。如果您像第二个示例那样将请求参数与 SQL 查询混合为字符串,您的应用程序将容易受到 SQL 注入的攻击。
所以澄清一下:如果您使用的是 ActiveRecord,任何 Rails 方法调用都是安全的,可以防止 SQL 注入。只有当您自己将 SQL 语句的一部分编写为字符串并将请求参数合并到该字符串中时,您才需要担心。上面使用 LIKE 的例子有些特殊,您通常不需要使用像 ActiveRecord 这样的 ORM 自己创建 SQL 字符串。