7

我有一个包含有效SQL表达式的字符串列表。
我只需要执行那些不修改数据库的。
最好的方法是什么?只是做类似的事情:

if(sqlQuery.contains("DELETE")){  
  //don't execute this
}

似乎是一个糟糕的黑客

更新:
我会让这个更具体。
我已经有一个SQL允许的查询列表。我想确保只执行这些。
与这些匹配的最佳方法是什么?

4

3 回答 3

5

执行此操作的最简单和最好(最全面)的方法是创建一个只读用户并仅使用该用户连接到数据库。在 SQLServer 中,最简单的方法是创建用户并将其添加到内置的“db_datareader”角色中。这将只允许选择。

And you have to worry about more than just DELETEs, INSERTs or UPDATEs. You also have to be careful about calling any stored procedures, so to be safe you'd also want to remove execute rights, ALTER rights, GRANT rights, etc...

EDIT: Just execute this...

CREATE LOGIN [user] WITH PASSWORD='password', DEFAULT_DATABASE=[your_db], CHECK_POLICY=OFF
GO
CREATE USER [user] FOR LOGIN [user]
EXEC sp_addrolemember N'db_datareader', N'your_db'
GO
于 2012-11-02T13:42:58.303 回答
2

DELETE不是唯一可能修改数据库的 SQL 指令;INSERT肯定会这样做,并且UPDATE可能(取决于您的确切查询)。因此,仅分析字符串可能很难做到这一点。

只要性能不是真正的问题,您就可以启动一个事务,一条一条地运行您的指令,检查每条指令的受影响行数,最后回滚您的事务。之后,您只运行那些影响 0 行的语句。

此外,请检查您的数据库文档:一些 RDBMS-es(如 Oracle)不支持回滚 DDL 语句,如ALTER TABLEDROP TABLE等等......

于 2012-11-02T13:19:40.773 回答
2

我不认为通过简单地检查给定 SQL 的内容来防止更改记录的防弹方法。例如,您可能有一个字段,其值为“update”,并且某个用户试图查询包含该值的所有行,但 SQL 不会被执行,因为它包含一个“黑名单”字符串。我想唯一安全的方法是与根本无权更改记录的用户一起执行 SQL。

于 2012-11-02T13:33:52.917 回答