我正在用 Delphi 编写一个 ISAPI 扩展,并寻找一种方法来克服 http 无状态问题。我想为此类任务使用会话,但找不到从我的 ISAPI 模块启动会话的方法。由于会话是非常特定于 Web 服务器的,我猜每个会话都有不同的方式,并且还猜测此类功能是通过服务器特定的 DLL 访问的。我目前对 Apache 很感兴趣,但非常感谢有关 IIS 的信息。
我下载了 PHP 的源代码并检查了session.c,其中包含PHPAPI void php_session_start(void)的代码,尽管它的代码并不多。
如何从 ISAPI Delphi Web 模块启动会话(并因此使用会话变量)?
1 回答
我对 IIS 上的 ISAPI 模块有一些经验。ISAPI 扩展只不过是一个 DLL,它实现了与接收请求的 Web 服务器交换数据的协议。
当 IIS 收到对某个 URL 的请求并且您已注册 ISAPI 扩展来处理该 URL 时,相应的 DLL 将由所谓的 IIS 工作进程加载(如果尚未在内存中)。当工作进程认为它不空闲时,DLL 将保存在内存中。您无法控制何时卸载 DLL,因此请在设计解决方案时牢记这一点。
TWebModule
以在收到请求并将其传递给它时触发的事件的形式抽象出许多 ISAPI 细节。但是,没有会话基础设施,您必须自己做。
在我看来,最好的方法是使用会话 cookie(每个人都这样做)。因此,在您的登录过程之后,您需要生成一个能够将当前用户识别为有效用户的字符串。当然,您必须将该字符串加密并转换为 Base64,但在您的初始测试中,您可以简单地用用户名填充 cookie。
因此,在处理登录之后,您应该使用Response属性 ( TWebResponse )TWebModule
添加一个新的 cookie (属性TWebResponse.Cookies ),例如,。此 cookie 将携带您的会话数据,在此示例中,只是用户名。MY_APP_SESSION
之后,您将开始在源自用于执行登录的浏览器的任何其他请求(由Request
属性、类表示)中接收该 cookie,因此在所有请求中,您必须验证 cookie 中的会话数据(在 中找到)当您检测到过期会话或虚假会话时,只需拒绝处理请求。TWebRequest
CookieFields
当用户注销时,只需删除 cookie。
我用来创建会话 cookie,其中包含用于识别用户的内容(不是名称,而是某种 ID)、会话有效之前的日期和时间以及一些安全数据(有时是一组声明)。所有这些都必须被加密并转换为 Base64。请注意,cookie 也可以添加一些安全属性,请阅读它们。另外,请注意这里的安全性必须包括 HTTPS 才能真正值得信赖。这是使您的 Web 应用程序或多或少安全的关键时刻!
因此,在每个请求中,首先要检查请求的 URL 的安全性。如果得出的结论是 URL 需要会话,请检查会话 cookie,还原 Base64,对其进行解密并评估 cookie 内容。如果一切似乎都正常,那么请求就会被处理。所以,很明显,防止cookie被伪造是避免欺诈的关键。
正如你所看到的,一切都是为了编写好的delphi代码。
我希望这有帮助!