OracleDatareader似乎在执行update语句

OracleDatareader似乎在执行update语句,oracle,ado.net,odp.net,Oracle,Ado.net,Odp.net,我正在使用oracle client 11.2.0 Dll版本4.112.3.0 我们的应用程序中有一个页面,人们可以在其中给出sql语句并检索结果。基本上是执行oracle命令。executereader 最近,我的一个团队成员给出了一个更新语句作为测试,它实际上对一条记录执行了更新 有人遇到过这种情况吗 问候 希德 这是一种正常(尽管有点令人不安)的行为。ExecuteReader将执行CommandText提供的sql命令,并构建一个DbDataReader,用于循环结果。 如果命令没有返

我正在使用oracle client 11.2.0 Dll版本4.112.3.0

我们的应用程序中有一个页面,人们可以在其中给出sql语句并检索结果。基本上是执行oracle命令。executereader

最近,我的一个团队成员给出了一个更新语句作为测试,它实际上对一条记录执行了更新

有人遇到过这种情况吗

问候 希德

这是一种正常(尽管有点令人不安)的行为。ExecuteReader将执行CommandText提供的sql命令,并构建一个DbDataReader,用于循环结果。
如果命令没有返回任何要读取的行,那么在任何情况下,读取器都不应该阻止它。因此,它不会检查您的命令是否真的是SELECT语句。
例如,假设您传递了一个存储过程名称,或者您有多个sql批处理要执行。(插入,然后选择)


我认为这里最大的问题是,您允许用户键入的任意sql命令访问数据库引擎。安全上有一个很大的漏洞。在将代码提交到数据库引擎之前,至少应该对查询文本执行一些分析

我同意史蒂夫的观点。您的阅读器将执行任何命令,如果它不是select且不返回结果集,可能会有点困惑

要防止用户修改任何内容,请创建一个新用户,将表上的select(无更新、无删除、无插入)授予该用户(
将表名上的select授予seconduser
)。然后,以seconduser身份登录,并为表创建同义词(
为realowner.tablename创建同义词tablename
)。让应用程序在连接到数据库时使用seconduser。这应该可以防止人们“入侵”你的网站。如果您想安全起见,请不要向第二个用户授予任何权限,但要
创建会话
,以防止他创建表、删除视图和类似内容(我猜您的executereader不允许DDL,但要测试它以确保)