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

&引用;“安全地”;允许用户使用SQL进行搜索,sql,security,web-applications,Sql,Security,Web Applications,例如,我经常想搜索stackoverflow SELECT whatever FROM questions WHERE views * N + votes * M > answers AND NOT(answered) ORDER BY views; 或者类似的 是否有任何合理的方法允许用户使用SQL作为搜索/过滤语言 我发现它有一些问题: 访问/更改内容(一个精心设置的用户帐户应该可以解决这一问题) SQL注入(考虑到之前的情况,他们应该能够做的最糟糕的事情是找回垃圾并在那里崩

例如,我经常想搜索stackoverflow

SELECT whatever FROM questions WHERE
   views * N + votes * M > answers AND NOT(answered) ORDER BY views;
或者类似的

是否有任何合理的方法允许用户使用SQL作为搜索/过滤语言

我发现它有一些问题:

  • 访问/更改内容(一个精心设置的用户帐户应该可以解决这一问题)
  • SQL注入(考虑到之前的情况,他们应该能够做的最糟糕的事情是找回垃圾并在那里崩溃会话)
  • 带有病态查询的DOS攻击
  • 你给他们什么索引

编辑:我想允许连接,还有什么不允许的。

如果你做了
SQLEncode
你的用户输入(并确保删除所有
),我看不到有三个输入框存在巨大的安全缺陷(除了我们仍在将核武器交给Psycho…),一个用于表格,一个用于列,一个用于条件。它们的条件中不能包含字符串,但是像您的示例这样的查询应该可以工作。您将实际粘贴SQL语句,因此您将控制实际执行的内容。如果你的设置足够好,你就安全了

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

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


事实上,如果您实现了这一点,您应该看看是否可以从SQL server上的单独帐户运行这些命令,该帐户只能访问最基本的需求,显然只能进行读取访问。

访问/更改内容
没问题,只要用一个残废的用户运行查询,权限仅限于选择

SQL注入
只需清理查询

拒绝服务攻击

超时查询并通过IP限制访问。我想你也可以限制某些服务器的CPU使用量,Facebook就是这样做的。参见or。

我刚刚想到了一种强大的消毒方法,可以用来限制可以使用的内容

  • 使用MySQL并获取它的lex/yacc文件
  • 按原样使用lex文件
  • 将yacc文件绑定到您希望允许的内容
  • 使用在成功时吐出输入的操作规则

是的,我确实知道给一个精神病患者使用核武器可能会更安全,但我并不打算这样做。我知道你问了很久,在你的例子中,你看到了吗?您可以使用SQL查询所有内容!我正在查看他们的源代码,看看他们是否做了什么special@MikeMurko:我不是专门寻找ES/SO解决方案,而是寻找一种从不受信任的最终用户处接受(部分?)SQL查询的通用方法。是的,我知道,但您使用了该示例,我认为您可能会发现它很有趣。至于你的问题。。。如果您使用的是SQL Server,我会创建一个新用户,没有权限,创建数据视图,只允许用户对这些视图执行选择。这样,您就可以隐藏表结构、字段名,并为它们提供更有意义的关联数据集。显然,我们需要这些视图的文档。希望有帮助<代码>从问题、问题、问题、问题、问题、问题中选择*按兰德排序()--我只是用SELECT权限崩溃了你的服务器。如果输入被正确清理,就不会崩溃。@Bill Karwin:CPU/RAM/时间限制可以防止该查询崩溃任何东西。在我看来,该查询就像是DOS,不应该导致实际崩溃(即BSOD/内核死机),所以Eduardo已经解决了这个问题:限制CPU使用并设置查询超时。我同意。只需说,没有任何保证,您的查询可以在我们选择的时间超时。+1我完全同意。用户应该输入数据值,也许还应该输入逻辑选项(比如所有关键字与任何关键字),但用户不应该能够输入逐字运行的代码。问题是,在我创建一个系统时,为了避免用户像我希望的那样安静,我会重新实现SQL的大部分只读部分,我不相信你。没有哪个应用程序需要这么大的灵活性。@比尔:我希望对堆栈溢出数据库有只读SQL访问权限。我承认我不会使用所有的SQL,但我不认为有太多的查询系统是我永远都不想使用的。我完全不同意比尔的观点。对于许多企业中的数据分析来说,能够充分利用查询语言的强大功能比UI开发人员组合起来的任何摇摇欲坠的表单项都要好得多。限制对视图而不是表的访问,我认为这个解决方案工作得非常好Yahoo API查询语言类似,但链接对实现部分没有帮助,只是对用法有帮助。阅读David的链接,看起来这可能正是FQL的功能(或者可能直接在被黑客攻击的MySQL中完成,以避免返回文本)