有什麼方法可以使用JBoss和Oracle定義一個真正的只讀數據源?如何將Oracle JBoss數據源定義爲只讀?
我想堅持單一的默認模式用戶,但限制應用程序的某些部分爲只讀,以避免SQL注入問題。如果在JBoss中沒有這種方式,我將不得不在Oracle中創建另一個用戶權限有限的用戶。
有什麼方法可以使用JBoss和Oracle定義一個真正的只讀數據源?如何將Oracle JBoss數據源定義爲只讀?
我想堅持單一的默認模式用戶,但限制應用程序的某些部分爲只讀,以避免SQL注入問題。如果在JBoss中沒有這種方式,我將不得不在Oracle中創建另一個用戶權限有限的用戶。
無論你在JBoss中是否可以這樣做,都應該創建第二個用戶。
應該在數據庫層設置數據庫權限;不要試圖在代碼中應用它們。該數據庫旨在確保無法寫入您無權寫入的表。如果你在應用程序中實現它,它只需要一個小小的改變或者一個小錯誤來打破這個限制。
如果您不想在另一個模式中引用表,您可以始終創建一個指向它的自己的同義詞。
有一個related programmers question,您可能會感興趣。簡單地說就是「不要在代碼中做什麼,你可以得到SQL服務器來爲你做好」。這個具體的情況沒有提到,但我認爲它適用。
我擔心這會成爲......使我們的客戶和託管服務變得更復雜一些......但我們可能會在這裏與安全性辯論。 –
要完成這個...我已經創建另一個用戶用下面的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;
這使我們能夠查詢其他用戶的表,就好像它是同一個用戶一樣。
就是這樣。
爲什麼JBoss需要限制只讀? –
如果你擔心*只是* SQL注入攻擊,那麼你的程序員就可以使用準備好的語句。還是他們不遵循編碼標準? – Perception
它更復雜......我們允許在某些部分使用自定義的「公式」作爲查詢來自實體化視圖的大量數據的select語句的一部分,這些部分被轉發到Oracle。將其視爲數據倉庫功能。我們進行了一些常規檢查,但我想確保用戶無法以任何方式注入任何類似ALTER TABLE或DELETE FROM ...即使不是偶然的 - 如果可能的話,無需配置單獨的數據庫用戶。 –