我在Delphi中编写ISAPI扩展并寻找克服http无状态问题的方法。我想将会话用于此类任务,但无法找到从ISAPI模块启动会话的方法。由于会话是特定于Web服务器的,我猜每个会话都有不同的方式,并且还猜测这些功能是通过服务器特定的DLL访问的。我目前对Apache感兴趣,但非常感谢IIS的信息
我下载了PHP的源代码并检查了 session.c ,其中包含 PHPAPI void php_session_start(void)的代码,尽管没有多少来自它。
如何从ISAPI Delphi Web模块启动会话(因此使用会话变量)?
答案 0 :(得分:3)
我在IIS上有一些ISAPI模块的经验。 ISAPI扩展只不过是一个DLL,它实现了与接收请求的Web服务器交换数据的协议。
当IIS收到对某个URL的请求并且您已注册ISAPI扩展以处理该URL时,将通过所谓的IIS工作进程加载相应的DLL(如果尚未在内存中)。 DLL将保留在内存中,而工作进程认为它不是空闲的。您无法控制何时卸载DLL,因此请在设计解决方案时考虑到这一点。
TWebModule
以接收并传递请求时触发的事件形式抽象出许多ISAPI详细信息。但是,没有会话基础设施存在,您必须自己完成。
在我看来,最好的方法是使用会话cookie(这是每个人所做的)。因此,在您的登录过程之后,您需要生成一个能够将当前用户标识为有效用户的字符串。当然,您必须保留该字符串并将其转换为Base64,但在初始测试中,您只需使用用户名填充cookie即可。
因此,在处理完登录后,您应该使用TWebModule
中的Response属性(TWebResponse)来add新的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代码。
我希望这有帮助!