为了让这两个帐户都登录数据库,我们需要赋予它们 CONNECT 角色。为此,在 XE 图形界面的 Administration/Database Users 部分选中用户信息下的 CONNECT 复选框,或执行以下命令:
GRANT CONNECT to cms_user; GRANT CONNECT to cms_editor; |
现在,如果尝试以 CMS_USER 或 CMS_EDITOR 用户登录并试图从 WEB_CONTENT 表读取数据 (select * from hr.web_content;),将遇到以下错误:
ORA-00942:table or view does not exist |
为了访问数据或仅是看到表,需要授予 CMS_USER 和 CMS_EDITOR 帐户对 WEB_CONTENT 表的只读权限:
GRANT SELECT on hr.web_content to cms_user; GRANT SELECT on hr.web_content to cms_editor; |
以上代码使这两个帐户可以对 WEB_CONTENT 表执行 SELECT 语句。如果尝试执行其他语句,则会遇到错误。例如,插入一行:
INSERT INTO hr.web_content (page_id,page_content) VALUES (1,'hello world'); |
将产生错误消息
ORA-01031:insufficient privileges |
要允许 CMS_EDITOR 更改该表的内容,需要授予以下权限:
GRANT INSERT,UPDATE,DELETE on hr.web_content to cms_editor; |
从现在起,CMS_EDITOR 帐户可以对 WEB_CONTENT 表执行 INSERT、UPDATE 和 DELETE 语句。
您看,这有多简单!可见通过角色管理权限是更有效的方法。如果使用的 Oracle 数据库不是 XE,可以执行如下操作:
创建角色:
CREATE ROLE reader; CREATE ROLE writer; |
谟杞巧ㄏ蓿?
GRANT SELECT ON web_content TO reader; GRANT INSERT,UPDATE,DELETE ON web_content TO writer; |
赋予用户角色:
GRANT reader TO cms_user; GRANT reader TO cms_editor; (they need to read too) GRANT writer TO cms_editor; |
请注意,如果更改 READER 角色的定义,则这些更改会影响所有具有该角色的用户帐户。如果是直接将权限授予用户的,则必须逐个更新每个用户帐户。
完成上述步骤后,可以配置 PHP 应用程序,使之对由匿名 Web 用户请求的所有数据库连接均使用 CMS_USER 帐户,对由受口令保护的管理页面引发的连接使用 CMS_EDITOR 帐户。现在,即使公共 Web 表单受到攻击,该攻击对数据库的影响将微乎其微,这是因为 CMS_USER 帐户仅具有只读权限。
结论
在本文中,我们只是简单介绍了 Oracle 数据访问安全性的一些最基本的特性。此外,Oracle 还有许多其他特性,可把您的 Web 应用程序的安全性提高到一个新的等级 — 包括虚拟专用数据库 (VPD) 和标签安全性。