我使用的是oracle客户端11.2.0 Dll版本4.112.3.0
我们的应用程序中有一个页面,人们可以在其中提供sql语句和retreive结果。基本上做一个oracle command.executereader
最近我的一个团队成员发布了一个更新声明作为测试,它实际上对记录执行了更新!!!!
遇到过这种情况的人?
此致 希德。
答案 0 :(得分:1)
这是正常的(虽然有点令人不安)行为。 ExecuteReader应该执行作为CommandText提供的sql命令,并构建一个用于循环结果的DbDataReader。
如果命令没有返回任何要读取的行,那么读者在任何情况下都不应该阻止它。因此,不期望它检查您的命令是否真的是SELECT语句
例如,如果传递存储过程名称或者要执行多个sql批处理,请考虑。 (INSERT后跟SELECT)
我认为这里最大的问题是您允许用户键入的任意sql命令到达数据库引擎。安全方面的一个很大的漏洞。在将代码提交到数据库引擎之前,您至少应该对查询文本执行一些分析。
答案 1 :(得分:0)
我同意史蒂夫。您的读者将执行任何命令,如果它不是选择并且不返回结果集,可能会有点混淆。
要阻止人们修改任何内容,请创建一个新用户,在表上向该用户授予select select(无更新,不删除,不插入)(grant select on tablename to seconduser
)。然后,以seconduser身份登录,并为您的表创建同义词(create synonym tablename for realowner.tablename
)。连接到DB时,您的应用程序是否使用了seconduser。这可以防止人们“黑客”你的网站。如果你想成为安全的一方,除了create session
之外,不向第二个用户授予权限,以防止他创建表,丢弃你的观点和类似的东西(我猜你的executereader不允许DDL,但是测试它以确保)。