第二十二章 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
,它将忽略未加密的条目。