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