为站点创建下载管理程序—ISAPI,ADO,Delphi 5

ZDNet软件频道 时间:2000-08-09 作者:Marc Hoffman |  我要评论()
本文关键词:
在本文中我们来讨论如何创建定制的ISAPI DLL控制站点中的下载。我们使用DELPHI开发DLL。

Who Am I??

目录
简介
数据库
起步
Who Am I??
我可以“当”你吗?
仅此而已吗?

现在我们要讨论如何正确的处理请求。首先,我们要检查当前用户是谁,以及他是否拥有请求的文件权限。如果文件是开放的,自然很简单,任何人(包括匿名用户)都可以下载该文件。但是如果访问的文件是受限的,我们如何确定是谁登录的呢?

第一个方案,使用ASP的Session对象存储UserID。ASP代码可以随时了解到用户的身份,但是ISAPI在IIS的结构上和ASP位于不同的层面,所以无法访问到Session的数据。

第二个方案是通过URL传递UserID。该方案也不可行,一个怀有恶意用户是不能将UserID写入ASP Session对象中,所以对于ASP代码来说相对安全些,它可以将所有的UserID都认为是有效的。但是任何用户都可能无意的使用URL传递随机的UserID到ISAPI扩展中。总会有人发现一个可以使他取得对他来说原本不能下载的文件。

最终我们选择了使用Cooike暂存UserID和密码。该方法简单也相当有效。

将下面的代码放到上面的书简处理程序中。

UserID := StrToInt(Request.CookieFields.Values['UserID']);
Password := Request.CookieFields.Values['Password'];
DownloadID := StrToInt(Request.QueryFields.Values['id']);


if (UserID > 0) and (Password <> '') then begin
{ ToDo: we have a user authorization data, check his data }
end
else begin
{ ToDo: we have an anonymous user, may download only public files }
end;

首先我们检查提供的用户信息是否有效。只需查询用户的纪录并核对密码。

qry_User.Parameters.ParamByName('UserID').Value := UserID;
qry_User.Open();


try
 // do we have exactly one record, and does the password match? 
 // if yes we had valid credentials.

 if (qry_User.RecordCount = 1) and
    (qry_User.FieldByName('Password').Value = Password) then begin

   { ToDo: user is ok, now check if he may download this file }

 end
 else
   Error(Response,ERROR_INVALID_USER);
finally
 qry_User.Close();
end;

如果密码无误,我们就确认用户合法,并转到下载的步骤。如果密码有误,我们产生一个错误。稍后我们将讨论如何将错误返回用户。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134