文章
姚 鑫 · 十月 20, 2022 阅读大约需 4 分钟

第二十二章 CSP Session 管理 - Private Pages

第二十二章 CSP Session 管理 - Private Pages

CSP 提供了私有页面的概念。只能从同一 CSP 会话中的另一个页面导航到私有页面。私有页面对于想要限制对某些页面的访问的应用程序很有用。

例如,假设有一个名为 private.csp 的私有页面(CSP 示例页面之一)。用户无法直接导航到 private.csp(例如,通过输入其 URL)。用户只能从另一个 CSP 页面中包含的链接导航到 private.csp。引用 CSP 页面中包含的链接不能是绝对 URL,以 http:// 开头。只有相对于引用页面的路径才被私有页面方法正确加密/标记。即:下面的前两个链接将相同的令牌传递给目标私有页面 test2.csp

<A HREF='test2.csp'>Link to private page - relative path</A> <BR>
<A HREF='/csp/samples/test2.csp'>
       Link to private page - full application path</A> <BR>

此链接的散列方式不同,无法访问。

<A HREF='http://myserver/csp/samples/test2.csp'>
        Link to private page - absolute path</A>

用户也不能为私有页面添加书签以供以后使用,因为用于保护私有页面的加密令牌仅对当前会话有效。

私有页面的工作方式如下。负责该页面的子类中的 %CSP.Page 将其类参数 PRIVATE 设置为 1。请求此页面的 URL 必须在其查询字符串中包含有效的加密 CSPToken 值。 CSP 处理的任何指向此页面的链接都会自动具有加密的 CSPToken 值。

编码 URL 参数

以类似于私有页面的方式,可以通过在类参数 ENCODED 中设置 %CSP.Page 的值来指定要对 CSP 页面的 URL 参数进行编码。 ENCODED 可以设置为 012。任何指向 ENCODED 类参数为 12 的页面的链接都会自动将任何 URL 参数编码在加密的 CSPToken 值中。如果 ENCODED 设置为 2,则必须对值进行编码;如果为 1,则可以混合编码值和未编码值。

ENCRYPTED 的三个设置是:

  • ENCODED=0 — 查询参数未加密
  • ENCODED=1 — 查询参数被加密并在 CSPToken 内传递
  • ENCODED=2 — 与“1”相同,除了在调用 Page 方法之前从 %request 对象中删除任何未加密的参数。这可确保在对象中的 %CSP.Request中只有加密参数可用。

请注意,因为 ENCODED=2 会从 url 中删除未加密的参数,所以它可以禁用 Zen <form> 元素等组件。

ENCODED=2 的示例

例如,假设有两个 .csp 页。一个页面 (list.csp) 将银行帐户列表显示为超链接,第二个页面 (account.csp) 显示有关特定帐户的信息。 account.csp 需要一个名为 ACCOUNTIDURL 参数来确定要显示的帐户。我们不希望在客户端上发布帐号,也不希望未经授权访问 account.csp 或显示任何其他帐号的能力。我们可以通过将 account.csp ENCODED 参数设置为 2 来做到这一点。以下是相关的 .csp 文件:

list.csp 的源

<html>
<body>
Select an account:<br>
<a href="account.csp?ACCOUNTID=100">Checking</a>
<a href="account.csp?ACCOUNTID=105">Saving</a>
</body>
</html>

account.csp 的源

<html>
<csp:class private=1 encoded=2>
<body>
Account Balance: <b>$#(..GetBalance())#</b>
</body>



</html>

当请求 list.csp 时,CSP 服务器将以下 HTML 发送到客户端:

<html>
<body>

Select an account:<br>
<a href="account.csp?CSPToken=fSVnWw0jKIs">Checking</a>
<a href="account.csp?CSPToken=1tLL6NKgysXi">Saving</a>
</body>
</html>

请注意,只有 ACCOUNTID 的加密值被发送到客户端。

在处理 account.csp 时,它会看到 ACCOUNTID 的解密值(在其 GetBalance 方法中引用)。

ENCODED=1 的示例

ENCODED=2ENCODED=1 之间的区别在于,如果 ENCODED=2,任何以未加密形式添加到 URL 的文本都会被丢弃。如果使用 ENCODED=1,则未加密的文本将传递到页面。然后,该页面可以包含指定如何处理此未加密文本的代码。

示例页面 protected.cspprotectedentry.csp显示了使用 ENCODED=1 的示例。 protected.csp 的源显示它检查是否已将任何内容添加到未加密的 URL。如果有任何未加密的内容,页面会显示一个滚动字幕,上面写着 HACKER ALERT!

要查看此内容,请转到示例页面在打开。

  1. 双击 protectedentry.csp 在新选项卡中打开。
  2. BALANCE:字段中输入 500
  3. 点击查看余额
  4. protected.csp 页面显示帐户余额为:500
  5. 请注意,该 URL 包含一个加密的 CSPTokenCSPTaken= 之后的所有内容)。这是输入的 500 加密。
  6. 导航到此 URL 的末尾并输入 &BALANCE=8000 并按 Enter
  7. 显示受保护的.csp 页面。它接受了对 URL 的未加密添加,并通过显示 HACKER ALERT!选框。如果 ENCODED 设置为 2,它将忽略未加密的条目。
0
0 12
讨论 (0)1
登录或注册以继续