2014-01-07 36 views
0

我使用Oracle客户端11.2.0 DLL版本4.112.3.0OracleDatareader似乎执行更新语句

我们在我们的应用程序的网页,人们可以给一个SQL语句,retreive结果。基本上做一个oracle command.executereader

最近我的一个团队成员给了一个更新声明作为一个测试,它实际上执行了一个记录更新!

有谁遇到过这个?

Regards Sid。

回答

1

这是一个正常的(虽然有点不安)行为。预期ExecuteReader将执行作为CommandText提供的sql命令并构建一个用于循环结果的DbDataReader。
如果该命令没有返回任何行读取不是读者应该防止在任何情况下。所以它不会检查你的命令是否真的是SELECT语句。
例如,如果您传递存储过程名称,或者如果您有多个要执行的sql批处理。 (INSERT后面跟一个SELECT)

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

0

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

若要防止人们修改任何内容,请创建一个新用户,在该表上向该用户授予“仅选择”(不更新,不删除,不插入)(grant select on tablename to seconduser)。然后,以seconduser身份登录,然后为表创建同义词(create synonym tablename for realowner.tablename)。在连接到数据库时,让您的应用程序使用seconduser。这应该防止人们“黑客”您的网站。如果你想成为安全的一方,不要授予第二个用户的权限,但是不允许他创建表,删除你的视图和类似的东西(我猜你的executereader不允许DDL,但测试它使当然)。