Rails:仍然对SQL注入感到困惑

时间:2016-10-31 13:04:01

标签: sql ruby-on-rails sql-server ruby sql-injection

我已经将some posts关于将用户输入从搜索框转换为ActiveRecord参数化语句,这可能容易受到SQL注入攻击,但我想我可能有一个解决方案。

以下是搜索的工作原理。用户在搜索框中输入这样的内容:

name="hello" AND NOT address.town="Villa"

在内部,我将其转换为:

query = ["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"]

有:

if search
  query = convert_search_to_query search
  begin
    includes(:address).where(query)
  # rescue Exception ...
...
...

这是我的想法:只需检查用户输入的属性("名称"," address.town"在这种情况下)以确保它的确定可接受的用户属性列表的完全匹配

如果我这样做,我认为不会有SQL注入,因为我使用参数化语句(使用'?')来处理用户的唯一部分'输入我无法检查 - 他为每个属性输入的值。

根据我在这里的其他帖子中读到的内容,我不知道这段代码如何比普通的参数化搜索更容易受到攻击,但我没有很多SQL注入经验。它容易受伤吗?

此外:

我知道有些插件可以提供帮助,但我想要做的事情非常简单,而且已经有效了,我宁愿让我的应用尽可能轻量级。

1 个答案:

答案 0 :(得分:1)

ActiveRecord将阻止任何SQL注入攻击, AS LONG AS 您正在使用参数化表单。根据经验,来自用户的所有信息应该是一个参数。

在您的示例中,您提到将用户查询转换为:

where(["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"])

在这种情况下,ActiveRecord会保护hellovilla免受SQL注入攻击,但保护name LIKE ? AND address.town NOT LIKE ?。 ActiveRecord假定name LIKE ? AND address.town NOT LIKE ?由开发人员(硬编码)或应用程序生成,无论采用哪种方式,它都可以安全地执行。

因此,如果name LIKE ? AND address.town NOT LIKE ?的任何部分来自用户,您的应用可能容易受到SQL注入攻击。

执行此操作的正确方法是使用语言解析器完全分解用户查询,然后将其重新生成为安全查询。使用正则表达式进行匹配和替换可能是一种天真的方法,除非您是正则表达式和安全性的主人。