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 将保护 hello
和 villa
免受 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 和安全。
我已经 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 将保护 hello
和 villa
免受 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 和安全。