2012-11-08 28 views
0

有什么方法可以使用JBoss和Oracle定义一个真正的只读数据源?如何将Oracle JBoss数据源定义为只读?

我想坚持单一的默认模式用户,但限制应用程序的某些部分为只读,以避免SQL注入问题。如果在JBoss中没有这种方式,我将不得不在Oracle中创建另一个用户权限有限的用户。

+0

为什么JBoss需要限制只读? –

+1

如果你担心*只是* SQL注入攻击,那么你的程序员就可以使用准备好的语句。还是他们不遵循编码标准? – Perception

+0

它更复杂......我们允许在某些部分使用自定义的“公式”作为查询来自实体化视图的大量数据的select语句的一部分,这些部分被转发到Oracle。将其视为数据仓库功能。我们进行了一些常规检查,但我想确保用户无法以任何方式注入任何类似ALTER TABLE或DELETE FROM ...即使不是偶然的 - 如果可能的话,无需配置单独的数据库用户。 –

回答

4

无论你在JBoss中是否可以这样做,都应该创建第二个用户。

应该在数据库层设置数据库权限;不要试图在代码中应用它们。该数据库旨在确保无法写入您无权写入的表。如果你在应用程序中实现它,它只需要一个小小的改变或者一个小错误来打破这个限制。

如果您不想在另一个模式中引用表,您可以始终创建一个指向它的自己的同义词。

有一个related programmers question,您可能会感兴趣。简单地说就是“不要在代码中做什么,你可以得到SQL服务器来为你做好”。这个具体的情况没有提到,但我认为它适用。

+0

我担心这会成为......使我们的客户和托管服务变得更复杂一些......但我们可能会在这里与安全性辩论。 –

0

要完成这个...我已经创建另一个用户用下面的SQL:

-- USER SQL 
CREATE USER MYUSER_READONLY IDENTIFIED BY password 
DEFAULT TABLESPACE "USERS" 
TEMPORARY TABLESPACE "TEMP"; 

-- ROLES 
GRANT "AUTHENTICATEDUSER" TO MYUSER_READONLY; 
GRANT "CONNECT" TO MYUSER_READONLY; 
GRANT "EJBCLIENT" TO MYUSER_READONLY; 
GRANT SELECT ANY TABLE TO MYUSER_READONLY; 
GRANT ALTER SESSION TO MYUSER_READONLY; 

为了简化用户的使用我的Java代码初始化我们用下面的语句每一个SQL会话:

ALTER SESSION SET CURRENT_SCHEMA = MYUSER; 

这使我们能够查询其他用户的表,就好像它是同一个用户一样。

就是这样。