【问题标题】:"Safely" allow users to search with SQL“安全”允许用户使用 SQL 进行搜索
【发布时间】:2009-04-27 22:37:42
【问题描述】:

例如,我经常想用 stackoverflow 搜索

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

或类似的东西。

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

我发现它有一些问题:

  • 访问/更改内容(仔细设置的用户帐户应该可以解决该问题)
  • SQL 注入(考虑到以前的最坏情况,他们应该能够做的就是找回垃圾并在会话中崩溃)。
  • 带有病态查询的 DOS 攻击
  • 你给他们什么索引?

编辑:我想允许加入,什么也不允许。

【问题讨论】:

  • 是的,我确实看到给精神病人一颗核弹可能更安全,但我实际上并不打算这样做。
  • 我知道你问了很长时间,在你的例子中——你见过data.stackexchange.com吗?您可以使用 SQL 查询所有内容!我现在正在查看他们的源代码,看看他们是否做了什么特别的事情
  • @MikeMurko:我并不是专门寻找 ES/SO 解决方案,而是一种接受(部分?)来自不受信任的最终用户的 SQL 查询的通用方式。
  • 是的,我知道,但你使用了那个例子,我想你可能会觉得它很有趣。至于您的问题...如果您使用的是 SQL Server - 我会创建一个新用户,没有权限,创建您的数据的视图,并且只允许用户对这些视图执行选择。这样,您可以隐藏您的表结构、字段名称,并可以为它们提供更有意义的连接数据集。显然然后需要有关这些视图的文档。希望有帮助!

标签: sql security web-applications


【解决方案1】:

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

SQL 注入
只需清理查询

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

【讨论】:

  • SELECT * FROM questions, questions, questions, questions, questions, questions ORDER BY RAND() -- 我刚刚让你的服务器崩溃了,只有选择权限。
  • 如果输入被正确清理,则不会。
  • @Bill Karwin:CPU/RAM/时间限制可以防止查询崩溃。
  • 那个查询在我看来就像一个 DOS,而不是应该导致实际崩溃的东西(即 BSOD/内核恐慌),所以 Eduardo 已经解决了这个问题:限制 CPU 使用并设置查询超时。
  • 我同意。只是说,没有任何保证,您的查询可能会在我们选择的时间超时。
【解决方案2】:

如果您执行SQLEncode 用户的输入(并确保同时删除所有;!),我认为没有巨大的安全漏洞(除了我们仍在向精神病患者分发核武器...... ) 具有三个输入框 - 一个用于表格,一个用于列,一个用于条件。他们将无法在其条件中包含字符串,但像您的示例这样的查询应该可以工作。您将实际粘贴 SQL 语句,因此您将控制实际执行的内容。如果您的设置足够好,您将是安全的。

但是,我不会让我的用户这样输入 SQL。如果你想真正自定义搜索选项,要么给搜索字段一堆标志,要么给一堆可以随意组合的表单元素。

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

事实上,如果你曾经实现过这个,你应该看看是否可以从 SQL 服务器上的单独帐户运行命令,该帐户只能访问非常基本的需求,并且显然只有读取访问权限。

【讨论】:

  • +1 我完全同意。用户应该输入数据值,也许还有关于逻辑的选择(比如所有关键字与任何关键字),但用户不应该能够输入逐字运行的代码。
  • 问题是,当我创建一个系统时,我希望他们能够避免用户查询,我会重新实现大部分/大部分 SQL 的只读部分跨度>
  • 我不相信你。没有应用程序需要这么大的灵活性。
  • @Bill:我希望拥有对堆栈溢出数据库的只读 SQL 访问权限。我承认我不会使用所有的 SQL,但我认为没有多少查询系统可以排除为我永远不想使用的东西。
  • 完全不同意比尔。对于许多企业中的数据分析 - 能够使用查询语言的全部功能比 UI 开发人员放在一起的任何摇摇欲坠的表单项要好得多。限制对视图而不是表格的访问,我认为这个解决方案效果很好
【解决方案3】:

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

【讨论】:

  • Yahoo API 查询语言类似,但链接对实现部分没有帮助,只是用法。
【解决方案4】:

我只是想到了一种强大的清理方法,可以用来限制可以使用的内容。

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

【讨论】:

  • 阅读 David 的链接,看起来这可能正是 FQL 的内容(或者可能直接在被黑的 MySQL 中完成以避免反弹回文本)
猜你喜欢
  • 2018-10-16
  • 2011-07-08
  • 1970-01-01
  • 2022-01-14
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多