Oracle 限制dbms_sql选择查询

Oracle 限制dbms_sql选择查询,oracle,security,plsql,sql-injection,Oracle,Security,Plsql,Sql Injection,我正在编写一个类似于Tom Kyte的函数,但是有更多的输出选项和更好的格式等等。我突然意识到,编写一个函数,可以使用authid currentuser输入任意SQL,而不是传递一个ref游标,这是非常危险的!但是,我需要知道列的属性,而且,顺便说一句,没有其他方法可以得到这个 因此,是否有办法限制dbms_sql.execute函数,使其仅对选择查询进行操作?或者,换句话说,有没有一种方法可以检查通过游标解析的DML的类型,然后,例如,如果它不是select,则引发异常 对查询进行文本分析,

我正在编写一个类似于Tom Kyte的函数,但是有更多的输出选项和更好的格式等等。我突然意识到,编写一个函数,可以使用authid currentuser输入任意SQL,而不是传递一个ref游标,这是非常危险的!但是,我需要知道列的属性,而且,顺便说一句,没有其他方法可以得到这个

因此,是否有办法限制dbms_sql.execute函数,使其仅对选择查询进行操作?或者,换句话说,有没有一种方法可以检查通过游标解析的DML的类型,然后,例如,如果它不是select,则引发异常

对查询进行文本分析,例如,允许select或with,但其他任何操作都不起作用,因为您只需从dual执行print_table'select*;扔下一张桌子';等等


另外,Oracle 10gR2,如果有区别的话。

是什么让您认为运行任意选择查询并不十分危险?为什么使用authid当前用户运行会很危险?如果用户有权删除某个表,并且希望删除该表,那么如果用户直接或通过您的过程执行该命令,又有什么关系呢?这就是authid current_user的要点,您只是使用用户现有的priv,而不是隐式地给调用方额外的priv。在这种情况下,代码是以Oracle用户的身份运行的,其权限比应用程序用户实际应该拥有的权限要多,即存在一个三层应用程序,其中中间层调用您的过程?@JustinCave用户层应该是进行调用的用户层,因此受到角色/授权/等的适当限制。不幸的是,虽然它仅限于一小部分已知和可信任的用户,但在某些情况下,它可能会在更高级别上被错误调用。。。我只是希望有一些额外的方法,我可以保护自己从这样的错误!这从根本上说不是个问题吗?只需向用户提供所需的权限级别。@CleverIdeaWidgetry现在我知道使用Oracle的安全模型是应用此类限制的唯一方法,这已成为一个不成问题的问题。在此之前,我并不认为认为SQL语句可以被dbms_SQL广泛地分类,或者,一般来说:例如,这是一个select,这是一个update,或者PL/SQL块,或者语句序列,等等。