确定sql查询是否修改数据库

时间:2012-11-02 13:14:06

标签: java sql sql-server regex

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

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

似乎是一个糟糕的黑客

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

3 个答案:

答案 0 :(得分:4)

最简单,最好(最全面)的方法是创建一个只读用户,并且只与该用户连接到数据库。在SQLServer中,最简单的方法是创建用户并将其添加到内置的“db_datareader”角色。这只会允许SELECT。

你不仅要担心DELETE,INSERT或UPDATE。您还必须小心调用任何存储过程,所以为了安全起见,您还要删除执行权限,ALTER权限,GRANT权限等...

编辑: 只需执行此操作......

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

答案 1 :(得分:2)

DELETE不是唯一可能修改数据库的SQL指令; INSERT肯定会这样做,UPDATE可能(取决于您的确切查询)。所以只是分析字符串可能是一个很难的方法。

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

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

答案 2 :(得分:1)

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