我有一个包含有效SQL
表达式的字符串列表
我只需执行那些不修改数据库的文件
最好的方法是什么?做一些像:
if(sqlQuery.contains("DELETE")){
//don't execute this
}
似乎是一个糟糕的黑客
更新
我会更具体地说明这一点
我已经有一个允许的SQL
个查询列表。我想确保只执行这些。
什么是匹配这些的最佳方式?
答案 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 TABLE
,DROP TABLE
等...
答案 2 :(得分:1)
我认为通过简单地检查给定SQL的内容,有一种防止记录更改的防弹方法。例如,您可能有一个字段,其值为“update”,而某些用户正在尝试查询包含此值的所有行,但SQL不会被执行,因为它包含“列入黑名单”的字符串。 我想唯一安全的方法是与用户一起执行SQL,而用户根本无权更改记录。