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

Re-use report in modal page to show different tables

我在 Apex 5 工作

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

这是最简单的报告。它只显示 table.

中的列

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

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

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

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


有人要求我 post 编码,所以,我可能有 10 table 这种格式:

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

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

SELECT column1, column2
from table1

我有 10 个 table 具有相同的列名。每个 table 被命名为:

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

而且我想使用相同的模式页面来显示所有 tables。

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

我在 apex.oracle.com

中做了一个示例应用程序

工作区:nekagav_ws

用户:测试

通过:测试

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

No checksum was provided to show processing for a page that requires a checksum when one or more request, clear cache, or argument values are passed as parameters.

Contact your application administrator.

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

  1. 在应用程序级别启用 SSP:编辑应用程序属性并在安全设置下将 会话状态保护 设置为 Enabled。 (您的示例应用已具有此值。)
  2. 在页面级别实施 SSP:编辑 target 页面属性(在您的示例中为第 3 页)并在安全下设置 页面访问保护Arguments Must Have Checksum。 (您目前已将其设置为 Unrestricted。)
  3. 在项目级别实施 SSP:编辑目标项目的项目属性(在您的示例中为 P3_TABLE_NAME)并在安全性下将 会话状态保护 设置为以下之一Checksum Required... 个选项。 (您目前已将其设置为 Unrestricted。)我通常使用 Checksum Required - Session Level

项目级别设置的原因不是很明显:如果您已将第 3 页设置为需要校验和,为什么还需要保护该页面上的个别项目?原因是可以在 URL 中的任何页面上设置项目的会话状态。因此,如果您有另一个将 SSP 设置为不受限制的页面,则用户可能能够构造一个 URL 以转到该页面并将 P3_TABLE_NAME 设置为某个值,然后导航到第 3 页而无需清除缓存或设置一个值并查看他们选择的值的数据。

What is the general solution for this problem?

您创建的示例并没有真正反映您所描述的内容(没有不同的按钮;不清楚您在按钮导航到页面 3 时究竟传递了什么,但没有值传递到那里)。

因此,我可以随意修改您的应用程序并执行了以下操作:

  • 已创建 P3_TABLE_NAME 个隐藏项
  • 报告类型现在是 "Classic report (based on function)"
  • 查询是 return 'select COLUMN1, COLUMN2 from ' || :P3_TABLE_NAME;
  • 使用通用列名设置为 "Yes",有 2 个通用列
  • 地区的"Server-side condition"设置为“PL/SQL函数体和 它只命名有效的 table 名称,例如 return lower(:P3_TABLE_NAME) IN ('copper', 'explain', 'fated');
  • 在 P1 上,按钮现在重定向到第 3 页,但将 P1_LIST_OF_TABLES 传递给 P3_TABLE_NAME
  • 在 P1 上,Select 列表项必须具有相同的 显示return 价值观;你不能传递一个数字 (12) 然后用作 table 第 3 页上的名称 - 必须是 "copper"(例如)。

差不多就这些了;看看,必要时调整一下。