在模态页面中重复使用报告以显示不同的表

时间:2018-01-13 23:00:37

标签: oracle11g oracle-apex

我在Apex 5工作

我有一个模态页面,带有报告。

这是最简单的报告。它只显示表格中的列。

但我想重复使用相同的模态页面来显示具有相同结构的任何表格。

我可以做的一件事是在我调用页面时将表名传递给模态页面。

问题是它成为SQL注入的目标。如果我传递表名,任何人都可以更改名称,并观看另一个表。

这个问题的一般解决方案是什么?

我被要求发布代码,因此,我可能有10个这种格式的表格:

CREATE TABLE table1
( 
  column1 varchar(20)
  column2 number
);

模态页面是包含此查询的报告:

SELECT column1, column2
from table1

我有10个具有相同列名的表。每个表都命名为:

copper
explain
fated
truck
neat
unite
branch
educated
tenuous
hum
decisive
notice

我想使用相同的模态页面来显示所有表格。

我在应用程序上有10个按钮(在不同的页面上),每个表一个,打开模态页面。

我在apex.oracle.com上做了一个示例应用程序

工作区:nekagav_ws

用户:测试

通:测试

2 个答案:

答案 0 :(得分:2)

APEX为此提供内置保护,称为会话状态保护(SSP)。这会根据URL包含的值为URL添加校验和。如果用户在使用SSP时通过操纵URL尝试更改值,则校验和将不再正确,并且将显示错误而不是页面:

  

没有提供校验和来显示需要的页面的处理   当一个或多个请求,清除缓存或参数值为时,校验和   作为参数传递。

     

与您的应用程序管理员联系。

要正确启用SSP,您需要做三件事:

  1. 在应用程序级别启用SSP:编辑应用程序属性,并在安全设置会话状态保护下编辑为Enabled。 (您的示例应用已经具有此值。)
  2. 在页面级别强制执行SSP:编辑目标页面属性(示例中为第3页),并在安全设置页面访问保护下编辑为Arguments Must Have Checksum。 (您目前将其设置为Unrestricted。)
  3. 在项目级别强制执行SSP:编辑目标项目的项目属性(示例中为P3_TABLE_NAME),并在安全性设置会话状态保护下编辑Checksum Required...之一选项。 (您目前将其设置为Unrestricted。)我通常使用Checksum Required - Session Level
  4. 项目级别设置的原因并不是很明显:如果您已将第3页设置为需要校验和,为什么还需要保护该页面上的各个项目?原因是可以在URL中的任何页面上设置项目的会话状态。因此,如果您有另一个页面将SSP设置为不受限制,则用户可能能够构建一个URL以转到该页面并将P3_TABLE_NAME设置为某个值,然后导航到第3页而不清除缓存或设置值并查看他们选择的值的数据。

答案 1 :(得分:1)

  

这个问题的一般解决方案是什么?

您创建的示例并没有真正反映您所描述的内容(没有不同的按钮;当按钮导航到第3页时,不清楚您完全传递给第3页,但没有值传递到那里)。

因此,我可以自由修改您的申请并执行以下操作:

  • 创建了P3_TABLE_NAME隐藏项
  • 报告类型现在是“经典报告(基于功能)”
  • 查询为return 'select COLUMN1, COLUMN2 from ' || :P3_TABLE_NAME;
  • 使用通用列名称设置为“是”,带有2个通用列
  • region的“服务器端条件”设置为“PL / SQL Function Body and 它仅命名有效的表名,例如return lower(:P3_TABLE_NAME) IN ('copper', 'explain', 'fated');
  • 在P1上,按钮现在重定向到第3页,但是将P1_LIST_OF_TABLES传递给 P3_TABLE_NAME
  • 在P1上,选择列表项必须具有相同的显示返回 值;你不能传递一个数字(12)然后用作表格 第3页上的名称 - 必须是“铜”(例如)。

这或多或少都是;看看,如果有必要调整它。