改进经典asp应用程序中的记录级访问限制

时间:2009-04-17 02:57:13

标签: oracle security asp-classic

就像标题所说,我被要求提出改造现有asp应用程序的估计。

当前的安全机制控制对应用程序不同部分的访问(页面级限制),但没有将单个记录标记为受限制的机制。为用户分配权限(使用现有的自定义访问管理代码)是没有问题的,但强制执行权限是另一回事 - 每个asp页面都嵌入了sql - 没有使用存储过程,对象等。

是修改每个表和查询的唯一解决方案,还是有更好的方法?欢迎任何指示,建议或祈祷。

这是在IIS6上针对oracle数据库运行的经典asp。

更新:这是一个用户场景。

我们有用户,经理,董事和副总裁。管理人员可以查看向其报告的用户创建的数据,但不会查看向其他经理报告的用户。用户无法查看任何经理创建的数据。董事也是如此 - 他们可以看到,但他们的报告却看不到。

2 个答案:

答案 0 :(得分:1)

这听起来像是实现行级安全性的理想时间。 Oracle有一个包DBMS_RLS,允许您定义可应用于一个或多个表的任意访问策略,这些表限制允许特定用户查看哪些行。从概念上讲,当用户在受保护的表上发出没有过滤器的查询时,即

SELECT *
  FROM my_table

Oracle自动且透明地插入由安全策略定义的WHERE子句,该子句限制结果集。您不应该对应用程序正在执行的SQL进行任何更改。

答案 1 :(得分:0)

假设您需要最大粒度,能够将每个行和任何行“授予”给很多用户,那么您就有多对多的关系,是吗?

所以应用以下模式:

添加用户表。

然后,对于每个受限制的表,如下所示:

  • 将其重命名为tablename +“_ base”。

  • 创建一个多对多表 将该表的id与a关联 用户ID,称为tablename + “allowed_user”。

  • 使用名称表创建视图 将tablename_base连接到的名称 table_name_allowed_user,带有 select * from tablename_base and tablename_allowed_user中的user_id。 这个观点应该符合Oracle的要求 要求是“天生的 可更新的“。

现在来了困难的部分。您需要为每个查询添加“and user_id = $ user_id”。找到您用于进行查询的各种函数。将这些函数包装在从会话中获取用户ID并添加该谓词的函数中。

执行此操作的一种可行方法是读取选择字符串,找到所有“where”s(对于子查询可能有更多),并将其替换为“where(user = $ user)and”。对于没有where的查询,您需要在任何“group by”或“order by”之前插入。这很脆弱,所以很明显你会测试这适用于所有页面(你有一个自动测试所有页面,对吗?),并添加黑客以涵盖特殊情况。

“更新”语句不必改变; “插入”可能会插入到视图中,然后对表的“allow_user”表执行单独的插入,其中包含插入用户的ID,以自动授予插入用户对其插入内容的访问权限。

如果您的用户数量有限,或者您限制了用户类型,则可以采用为用户或类型命名的多个视图策略;然后你用相应的视图替换查询中的表名。