Tom*_*omU 10 sql sql-injection sql-parametrized-query
我想允许用户使用一些相当灵活的标准查询数据库.我可以使用以下内容:
String slqCmdTxt = "SELECT * FROM TheTable WHERE " + userExpression;
Run Code Online (Sandbox Code Playgroud)
但是,我知道这对SQL注入是开放的.使用参数是好的,但我没有看到允许非常灵活的查询的方法.
如何在不打开SQL注入的情况下允许灵活的数据库查询?
更多细节:
实际上有两个表,一个主表和一个具有属性的辅助表.一个主记录可能具有许多属性.我们想查询两个表中的值.结果将被处理成一个报告,该报告比简单的表格视图更具可读性.数据由C#程序编写,但当前的方向是从用Java编写的组件查询表.
所以我需要一种方法来提供用户输入然后安全地构建查询.对于一组有限的输入,我编写了代码来构建一个带有给定输入和参数值的查询字符串.然后我查看并添加输入值作为参数.这导致复杂的字符串捕捉,难以改变/扩展.
现在我正在使用Java,一些搜索已经发现了像jOOQ这样的SQL语句构建库......
您可能应该创建一个 UI,用户可以在其中从下拉列表中选择一个表,然后添加过滤器。如果您曾经使用过 TOAD 或 DBVisualizer 甚至 SQLDeveloper,它们都在 UI 中有部分,您可以在其中选择表,然后用户无需实际编写 SQL,即可从 UI 控件添加过滤器和排序。
当然,在 UI 后面的代码中,您将验证过滤器输入并将它们用作准备好的语句中的参数(取决于您使用的语言)。
例如,当您浏览数据库对象并单击表时,这就是 DBVisualizer(用 Java 编写)在其 UI 中的内容。请注意,您可以从下拉列表中选择任何列,然后从另一个下拉列表中选择一个运算符(即 =、>、>=、<、<=、LIKE、IN 等),然后您可以输入用户定义的值为过滤器值。

你可以在你的 UI 中做一些非常相似的事情。
顺便说一句,如果您包含要使用哪种语言编写应用程序,这会有所帮助。如果我不得不猜测,我会根据您的字符串声明说 Java 或 C#,但最好能确定一下。
假设使用现代 DBMS(例如 Sql Server 或 Oracle;我不熟悉 MySQL),那么您可以允许用户编写原始 SQL,只要您确保他们登录的帐户具有适当的限制。
在 SQL Server 中,您可以限制用户可以对任何 db 对象(SELECT、DELETE、UPDATE、EXECUTE)采取的操作。我相信这在 Oracle 中是正确的。我认为它甚至可能扩展到列级别,但我不确定。