第二十一章 CSP Session 管理 - 身份验证和加密

身份验证和加密

在发送到 HTTP 客户端的页面上放置状态信息是很常见的。当从这些页面发出后续请求时,会将状态信息发送回服务器。很多时候,重要的是将状态信息放置在网页上,以便 a) HTTP 源的查看者无法确定状态信息的值,并且 b) 服务器可以验证返回的信息是,实际上,从同一服务器和会话发送出去。通过其加密服务,CSP 提供了一种易于使用的机制来实现这一点。

Session Key

CSP 可以使用加密密钥对服务器上的数据进行加密和解密。每个 CSP session 都有一个唯一的会话密钥(可通对象 Key 属性中的 %CSP.Session 访问),用于加密会话数据。这种机制是安全的,因为会话密钥永远不会发送到 HTTP 客户端;它作为 %CSP.Session 的一部分保留在 CSP 服务器上,位于对象中。

可以在类中使用 %CSP.PageEncrypt 方法手动加密服务器上的值。可以随后使用 Decrypt 方法解密此值。

加密 URL 和 CSPToken

在某些情况下(如下所述),从 .csp 文件生成的类会自动加密发送到客户端的 URL 值(对于手动创建的类,必须在类中调用 %CSP.PageLink 方法才能执行此操作)。

例如,假设 .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.PageLink 方法获得相同的行为。

如果将链接作为参数传递给函数,请始终类中使用 %CSP.PageLink 方法,而不是 #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>