第二十一章 CSP Session 管理 - 身份验证和加密
身份验证和加密
在发送到 HTTP
客户端的页面上放置状态信息是很常见的。当从这些页面发出后续请求时,会将状态信息发送回服务器。很多时候,重要的是将状态信息放置在网页上,以便 a) HTTP
源的查看者无法确定状态信息的值,并且 b) 服务器可以验证返回的信息是,实际上,从同一服务器和会话发送出去。通过其加密服务,CSP
提供了一种易于使用的机制来实现这一点。
Session Key
CSP
可以使用加密密钥对服务器上的数据进行加密和解密。每个 CSP session
都有一个唯一的会话密钥(可通对象 Key
属性中的 %CSP.Session
访问),用于加密会话数据。这种机制是安全的,因为会话密钥永远不会发送到 HTTP
客户端;它作为 %CSP.Session
的一部分保留在 CSP
服务器上,位于对象中。
可以在类中使用 %CSP.Page
的 Encrypt
方法手动加密服务器上的值。可以随后使用 Decrypt
方法解密此值。
加密 URL 和 CSPToken
在某些情况下(如下所述),从 .csp
文件生成的类会自动加密发送到客户端的 URL
值(对于手动创建的类,必须在类中调用 %CSP.Page
的 Link
方法才能执行此操作)。
例如,假设 .csp
文件包含定义指向另一个页面的链接的锚标记:
<a href="page2.csp?PI=314159">Page 2</a>
如果此 URL
已加密,则可能会向客户端发送以下内容:
<a href="page2.csp?CSPToken=8762KJH987JLJ">Page 2</a>
当用户选择该链接时,加密参数 CSPToken
被发送到 CSP
服务器。然后服务器对其进行解密并将其解密后的内容放入 %request
对象中。如果加密值已被修改或从不同的会话发送,则服务器将引发错误。可以在类 IsEncrypted
方法中使用 %CSP.Request
来确定参数值是否最初是加密的。
CSP
编译器会自动检测 HTML
文档中可能出现 URL
的所有位置,并根据需要执行加密(基于目标页面的类参数,如下节所述)。如果以编程方式创建页面,则可以在类中使用 %CSP.Page
的 Link
方法获得相同的行为。
如果将链接作为参数传递给函数,请始终类中使用 %CSP.Page
的 Link
方法,而不是 #url()#
指令,如下例所示:
window.showModalDialog('#(..Link("locks.csp"))#','',windowFeatures);
这个使用#url()#
作为函数参数的例子不起作用:
window.showModalDialog('#url(locks.csp)#','',windowFeatures);
如果需要在 .csp
文件中 CSP
编译器未检测到的位置提供加密 URL
,请使用 #url()#
指令。例如,在链接是参数的客户端 JavaScript
函数中,可以使用:
<script language=JavaScript>
function NextPage()
{
// jump to next page
CSPPage.document.location = '#url(nextpage.csp)#';
}
</script>