“安全地”允许用户使用SQL进行搜索

时间:2009-04-27 22:37:42

标签: sql security web-applications

例如,我经常想用

搜索stackoverflow
SELECT whatever FROM questions WHERE
   views * N + votes * M > answers AND NOT(answered) ORDER BY views;

或类似的东西。

有没有合理的方法允许用户使用SQL作为搜索/过滤语言?

我发现它有一些问题:

  • 访问/更改内容(精心设置的用户帐户应该修复)
  • SQL注入(考虑到之前他们应该做的最糟糕的事情就是找回垃圾并在那里崩溃)。
  • DOS病毒查询攻击
  • 你给他们什么索引?

编辑:我想允许加入,还有什么不合适。

4 个答案:

答案 0 :(得分:5)

访问/更改内容
没问题,只需使用残缺用户运行查询,只有权限选择

SQL注入
只需清理查询

DOS攻击
超时查询并通过IP限制访问。我想你也可以限制某些服务器的CPU使用率

答案 1 :(得分:2)

如果您SQLEncode用户输入{并确保同时删除所有;!),我认为没有任何巨大的安全漏洞(除此之外,我们仍然将核武器交给psychos ...)有三个输入框 - 一个用于表,一个用于列,一个用于条件。他们将无法在他们的条件中使用字符串,但像您的示例之类的查询应该有效。您将对SQL语句进行实际粘贴,这样您就可以控制实际执行的内容。如果您的设置足够好,那么您将是安全的。

但是,我不会让我的生命让我的用户像那样输入SQL。如果你想真正自定义搜索选项,可以为搜索字段提供一堆标志,或者可以随意组合一堆表单元素。

另一种选择是发明某种“标记语言”,有点像Markdown(用于格式化所有这些问题和答案的框架......),你可以将其翻译成SQL。然后,您可以确保只执行“无害”选择,并且可以保护用户数据等。

事实上,如果您实现了这一点,您应该看看是否可以从SQL服务器上的单独帐户运行命令,该帐户只能访问非常基本的需求,显然只能读取访问权限。

答案 2 :(得分:1)

Facebook使用FQL执行此操作。请参阅blog postpresentation

答案 3 :(得分:0)

我只是想到了一种强大的消毒方法,可以用来限制可以使用的方法。

  • 使用MySQL并获取它的lex / yacc文件
  • 按原样使用lex文件
  • 将yacc文件仅限于您要允许的内容
  • 使用行动规则,在成功时吐出输入。