在模态页面中重复使用报告以显示不同的表格
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,您需要做三件事:
- 在应用程序级别启用 SSP:编辑应用程序属性并在安全设置下将 会话状态保护 设置为
Enabled
。 (您的示例应用已具有此值。)
- 在页面级别实施 SSP:编辑 target 页面属性(在您的示例中为第 3 页)并在安全下设置 页面访问保护至
Arguments Must Have Checksum
。 (您目前已将其设置为 Unrestricted
。)
- 在项目级别实施 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"(例如)。
差不多就这些了;看看,必要时调整一下。
我在 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,您需要做三件事:
- 在应用程序级别启用 SSP:编辑应用程序属性并在安全设置下将 会话状态保护 设置为
Enabled
。 (您的示例应用已具有此值。) - 在页面级别实施 SSP:编辑 target 页面属性(在您的示例中为第 3 页)并在安全下设置 页面访问保护至
Arguments Must Have Checksum
。 (您目前已将其设置为Unrestricted
。) - 在项目级别实施 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"(例如)。
差不多就这些了;看看,必要时调整一下。