我已经将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注入经验。它容易受伤吗?
此外:
我知道有些插件可以提供帮助,但我想要做的事情非常简单,而且已经有效了,我宁愿让我的应用尽可能轻量级。
答案 0 :(得分:1)
ActiveRecord将阻止任何SQL注入攻击, AS LONG AS 您正在使用参数化表单。根据经验,来自用户的所有信息应该是一个参数。
在您的示例中,您提到将用户查询转换为:
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注入攻击。
执行此操作的正确方法是使用语言解析器完全分解用户查询,然后将其重新生成为安全查询。使用正则表达式进行匹配和替换可能是一种天真的方法,除非您是正则表达式和安全性的主人。