第二十二章 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 可以设置为 0、1 或 2。任何指向 ENCODED 类参数为 1 或 2 的页面的链接都会自动将任何 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 需要一个名为 ACCOUNTID 的 URL 参数来确定要显示的帐户。我们不希望在客户端上发布帐号,也不希望未经授权访问 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>
<script language="Cache" method="GetBalance" arguments=""
returntype="%Integer">
// server-side method to lookup account balance
New id
Set id = $Get(%request.Data("ACCOUNTID",1))
If (id = 100) {
Quit 157
}
ElseIf (id = 105) {
Quit 11987
}
Quit 0
</script>
</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=2 和 ENCODED=1 之间的区别在于,如果 ENCODED=2,任何以未加密形式添加到 URL 的文本都会被丢弃。如果使用 ENCODED=1,则未加密的文本将传递到页面。然后,该页面可以包含指定如何处理此未加密文本的代码。
示例页面 protected.csp 和 protectedentry.csp显示了使用 ENCODED=1 的示例。 protected.csp 的源显示它检查是否已将任何内容添加到未加密的 URL。如果有任何未加密的内容,页面会显示一个滚动字幕,上面写着 HACKER ALERT!
要查看此内容,请转到示例页面在打开。
- 双击
protectedentry.csp在新选项卡中打开。 - 在
BALANCE:字段中输入500 - 点击查看余额
protected.csp页面显示帐户余额为:500- 请注意,该
URL包含一个加密的CSPToken(CSPTaken=之后的所有内容)。这是输入的500加密。 - 导航到此
URL的末尾并输入&BALANCE=8000并按Enter。 - 显示受保护的
.csp页面。它接受了对URL的未加密添加,并通过显示HACKER ALERT!选框。如果ENCODED设置为2,它将忽略未加密的条目。

浙公网安备 33010602011771号