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