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

Rails: Still confused about 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 ...
...
...

这是我的想法:只需检查用户输入的属性(在本例中为 "name"、"address.town")以确保它 完全匹配 可接受的用户属性列表。

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

根据我从其他帖子中读到的内容,我看不出这段代码比普通参数化搜索更容易受到攻击,但我对 [=38= 没有太多经验】 注射。它易受攻击吗?

还有:

我知道有些插件可能会有所帮助,但我想做的事情真的很简单,而且已经在工作了,我宁愿让我的应用程序尽可能轻量。

ActiveRecord 将防止任何 SQL 注入攻击,只要 您正在使用参数化形式。根据经验,来自用户的 ALL 信息应该是一个参数。

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

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 注入攻击。

正确的做法是使用语言解析器完全分解用户查询,然后将其重新生成为安全查询。使用 Regex 来匹配和替换可能是一种幼稚的方法,除非您精通 Regex 和安全。