我在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
用户:测试
通:测试
答案 0 :(得分:2)
APEX为此提供内置保护,称为会话状态保护(SSP)。这会根据URL包含的值为URL添加校验和。如果用户在使用SSP时通过操纵URL尝试更改值,则校验和将不再正确,并且将显示错误而不是页面:
没有提供校验和来显示需要的页面的处理 当一个或多个请求,清除缓存或参数值为时,校验和 作为参数传递。
与您的应用程序管理员联系。
要正确启用SSP,您需要做三件事:
Enabled
。 (您的示例应用已经具有此值。)Arguments Must Have Checksum
。 (您目前将其设置为Unrestricted
。)P3_TABLE_NAME
),并在安全性设置会话状态保护下编辑Checksum Required...
之一选项。 (您目前将其设置为Unrestricted
。)我通常使用Checksum Required - Session Level
。项目级别设置的原因并不是很明显:如果您已将第3页设置为需要校验和,为什么还需要保护该页面上的各个项目?原因是可以在URL中的任何页面上设置项目的会话状态。因此,如果您有另一个页面将SSP设置为不受限制,则用户可能能够构建一个URL以转到该页面并将P3_TABLE_NAME
设置为某个值,然后导航到第3页而不清除缓存或设置值并查看他们选择的值的数据。
答案 1 :(得分:1)
这个问题的一般解决方案是什么?
您创建的示例并没有真正反映您所描述的内容(没有不同的按钮;当按钮导航到第3页时,不清楚您完全传递给第3页,但没有值传递到那里)。
因此,我可以自由修改您的申请并执行以下操作:
return 'select COLUMN1, COLUMN2 from ' || :P3_TABLE_NAME;
return lower(:P3_TABLE_NAME) IN ('copper', 'explain', 'fated');
这或多或少都是;看看,如果有必要调整它。