我如何安全地允许用户定义的SQL查询?

我想让用户用一些相当灵活的标准来查询数据库。 我只能使用以下内容:

String slqCmdTxt = "SELECT * FROM TheTable WHERE " + userExpression;

不过,我知道这是对SQL注入敞开的。 使用参数很好,但我没有看到允许非常灵活的查询的方法。

我怎样才能允许灵活的数据库查询,而不需要打开SQL注入?


更多细节:

实际上有两个表,一个主人和一个具有属性的辅助人物。 一个主记录可能有很多属性。 我们想要查询两个表中的值。 结果被处理成报告,比简单的表格视图更具可读性。 数据由C#程序编写,但当前的方向是从用Java编写的组件查询表。

所以我需要一种方法来提供用户输入,然后安全地建立一个查询。 对于一组有限的输入,我编写了代码来构建一个查询字符串,其中包含给定的输入和参数值。 然后我通过并添加输入值作为参数。 这导致了复杂的字符串提取,这将难以改变/扩大。

现在我正在使用Java,一些搜索已经打开了SQL语句结构库,例如jOOQ ...


您应该创建一个用户界面,用户可以从下拉列表中选择一个表格,然后添加过滤器。 如果您曾经使用过TOAD或DBVisualizer甚至SQLDeveloper,那么它们都可以在用户界面中选择一个表格,然后在没有实际编写SQL的情况下,用户可以添加过滤器并从UI控件中进行排序。

那么当然,在UI背后的代码中,您将验证过滤器输入并将它们用作预准备语句中的参数(取决于您使用的语言)。

例如,当您浏览数据库对象并单击某个表时,这就是DBVisualizer(用Java编写)在其UI中具有的内容。 注意,您可以从下拉列表中选择任何列,然后从另一个下拉列表中选择一个运算符(即=,>,> =,<,<=,LIKE,IN等),然后可以输入用户定义的值为过滤器值。

DBVisualizer UI

你可以在UI中做一些非常类似的事情。

如果包含你的应用程序将要写入的语言,那么它会有所帮助。如果我不得不猜测,我会根据你的字符串声明来说Java或C#,但是很确定。


假设一个现代化的DBMS(例如Sql Server或Oracle;我不熟悉MySQL),那么只要确保登录的帐户有适当的限制,就可以允许用户编写原始SQL。

在SQL Server中,您可以限制用户可以针对任何数据库对象执行哪些操作(SELECT,DELETE,UPDATE,EXECUTE)。 我相信甲骨文这是真的......我认为它甚至可能延伸到专栏级别,但我不确定。

链接地址: http://www.djcxy.com/p/10995.html

上一篇: How can I securely allow user defined SQL queries?

下一篇: .NET equivalent of Java FileChannel?