| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
学习型 ASP/PHP/ASP.NET 主机 35元/年全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
赛孚耐:软件保护加密专家身份认证令牌USB KEY虚拟主机 域名注册 主机托管 
共有 2429 人关注过本帖
标题:[经验]ISAPI开发心得
收藏  推荐  打印 
redice
Rank: 4
等级:高级会员
威望:6
帖子:858
积分:8910
注册:2006-12-11
结帖率:100%
  问题点数:0  回复次数:11   
[经验]ISAPI开发心得

//转载请保留此信息,谢谢合作
//By RedIce 2008.4.13
//E-mail:redice@163.com
//http://redice.bookold.net

最近写了几个ISAPI Filter,网上这方面的资料很少, 不过MSDN上有一些。

总结了一些我的经验,如下:

问:如何创建一个ISAPI Filter工程?
答:Vc++6.0->工程->ISAPI Extension Wizard 然后根据向导提示和自己的实际需求,一步一步进行
     要注意的地方:
     你希望创建什么类型的IIS对象?我们应该选"产生一个过滤器对象"
     你的过滤器拥有的通知优先级?根据自己的需要,如果向让我们的程序最先处理客户的请求就要选择"高"
     你的过滤器将处理那些通知?一般选择“URL映射请求”

问:我的处理代码应该加在什么地方?
答:一般放在OnUrlMap函数中(这与上面的选择有关系)

问:如何取得客户端请求的URL?
答:在OnUrlMap函数中使用pMapInfo->pszURL即可获得,类型char *

问:如何取得HTTP请求报文中的参数?
答:在OnUrlMap函数中使用pCtxt->GetServerVariable(LPTSTR ,LPVOID,LPDWORD )即可取得,该函数的原型如下:
     GetServerVariable( LPTSTR lpszVariableName, LPVOID lpvBuffer, LPDWORD lpdwSize )
     简单解释一下参数,
     参数(1) lpszVariableName-要取得的参数的名称,例如"ALL_HTTP",将取得所有客户发送的HTTP请求头;"QUERY_STRING",取得客户端以Get方式提交的参数。至于其它的,可以到MSND中查阅,里面有详细的说明。
     参数(2) lpvBuffer-接收缓冲区,存放取得的参数的缓冲区。
     参数(3) lpdwSize-函数成功调用后,该参数存放成功获取的参数的字节数。

问:如何向客户端输出HTML?
答:在OnUrlMap函数中使用pCtxt的WriteClient方法即可实现,函数原型如下:
     BOOL WriteClient( LPVOID lpvBuffer, LPDWORD lpdwBytes, DWORD dwReserved = 0 );参数不解释了,大家可以望文生义。

问:如何重定向客户的请求?
答:看个例子,自然明白
     //将用户请求的URL重定向到http://www.baidu.com/
   char szRedirect [256];
   sprintf(szRedirect, "Location: http://%s\r\n\r\n", "www.baidu.com");
   pCtxt->ServerSupportFunction ( SF_REQ_SEND_RESPONSE_HEADER, (LPVOID) "302 Redirect", (DWORD *) szRedirect,0 );
   补充一下,ServerSupportFunction这个函数可以实现修改向客户端发出的HTTP报文头信息,详情,敬请查看MSDN

问:如何将写好的程序(DLL),添加到IIS?
答:follow me,打开Internet信息服务管理,在需要保护的站点上点击鼠标右键,打开属性页,切换到ISAPI筛选器标签,然后,添加即可。

问:我写的筛选器怎么在没有安装VC++的机器上不工作?
答:以release方式发布即可

Ok,总结完了。我就知道这么多了。最后再把我最近写的一个程序附上,仅供参考:


先说一下这个过滤器实现的功能:防数据库被下载,防SQL注入

//水品有限,不当之处还望高手指出:
DWORD CSafeWebFilter::OnUrlMap(CHttpFilterContext* pCtxt,
PHTTP_FILTER_URL_MAP pMapInfo)
{
//By RedIce 2008.4.12
char c_url[256];//客户端请求的URL
char c_VariableName[256];
char c_exten[5];
char c_response[256];
DWORD  response_len;
unsigned long l_Variable_len;

memset(c_VariableName,0,256);
//取得客户端请求的参数

pCtxt->GetServerVariable("QUERY_STRING",c_VariableName,&l_Variable_len);
//如果请求的URL(包括参数)过长则给做警告
if(strlen(pMapInfo->pszURL) +strlen(c_VariableName)>=256)
{
  memset(c_response,0,256);
  sprintf(c_response,"<p align=center><font color=red>注意:客户端请求的URL过长!</font>");
  response_len=strlen(c_response);
  pCtxt-&gt;WriteClient(c_response,&response_len);
  return SF_STATUS_REQ_FINISHED;
}
memset(c_url,0,256);
strcpy(c_url,pMapInfo-&gt;pszURL);//取得客户端请求的URL
if(strlen(c_VariableName)) strcat(c_url,"?");
strcat(c_url,c_VariableName);//将用户请求的URL和参数连接起来
strlwr(c_url);//将url中所有字母转换为小写
memset(c_exten,0,5);
strcpy(c_exten,&c_url[strlen(c_url)-4]);

//防数据库被下载
if(!strcmp(c_exten,".mdb"))
{
  memset(c_response,0,256);
  sprintf(c_response,"<p align=center><font color=red>注意:你没有访问该资源的权限!</font>");
  response_len=strlen(c_response);
  pCtxt-&gt;WriteClient(c_response,&response_len);
  return SF_STATUS_REQ_FINISHED;
}

//防SQL注入
if(strstr(c_url,"'")||
    strstr(c_url,";")||
    strstr(c_url,"select")||
    strstr(c_url,"where")||
    strstr(c_url,"count")||
    strstr(c_url,"update")||
    strstr(c_url,"insert")||
    strstr(c_url,"delete")||
    strstr(c_url,"and")||
    strstr(c_url,"exec"))
{
  memset(c_response,0,256);
  sprintf(c_response,"<p align=center><font color=red>注意:你提交的URL中含有非法参数!</font>");
  response_len=strlen(c_response);
  pCtxt-&gt;WriteClient(c_response,&response_len);
  return SF_STATUS_REQ_FINISHED;
}


// TODO: React to this notification accordingly and
// return the appropriate status code
return SF_STATUS_REQ_NEXT_NOTIFICATION;



   


[ 本帖最后由 redice 于 2008-6-10 14:47 编辑 ]
附件: 只有本站会员才能下载或查看附件,请您 登录注册
搜索更多相关主题的帖子: ISAPI  过滤器  心得  IIS  Filter  
2008-4-12 14:10
redice
Rank: 4
等级:高级会员
威望:6
帖子:858
积分:8910
注册:2006-12-11
  得分:0 

“精华贴”都没人看呀 呵呵

redice's Blog  http://www.redicecn.cn
问渠那得清如许,为有源头活水来。
2008-4-12 17:43
永夜的极光
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:27
帖子:2719
积分:26830
注册:2007-10-9
  得分:0 

好东西,加精没商量

从BFS(Breadth First Study)到DFS(Depth First Study)
学习VIM中,欢迎访问我的blog  http://hi.baidu.com/newkedison
严重鄙视一切把论坛当成作业生成器和人肉搜索引擎的人
2008-4-13 13:14
2007bo
Rank: 2
等级:注册会员
帖子:77
积分:817
注册:2007-12-3
  得分:0 
DING

~~~~~
2008-5-24 23:02
xiongjl9555
Rank: 2
来自:深圳南山区
等级:注册会员
帖子:83
积分:930
注册:2008-5-27
  得分:0 
好东西

好东西,就是不怎么看明白,功力有限,先收藏
2008-6-1 01:02
hmhz
Rank: 12Rank: 12Rank: 12
等级:版主
威望:24
帖子:1770
积分:18595
注册:2006-12-17
  得分:0 

楼主,你这个帖子在这个论坛早就发过一次了,怎么又发出来了?老是用一个帖子得精华算不算是灌水+作弊行为呢
2008-6-1 12:50
zhuzhanjun
Rank: 2
等级:注册会员
帖子:133
积分:1376
注册:2008-5-3
  得分:0 

呵呵。学习学习。虽然我不知道用来做什么的
2008-6-1 15:38
a815101
Rank: 1
等级:新手上路
帖子:2
积分:120
注册:2008-6-1
  得分:0 
請問??

請問Form Post Data 如何 抓取判斷?
多謝
2008-6-2 02:07
ilovey4
Rank: 2
等级:注册会员
帖子:65
积分:738
注册:2007-6-21
  得分:0 

不是很懂//

新手!
2008-6-2 05:43
a815101
Rank: 1
等级:新手上路
帖子:2
积分:120
注册:2008-6-1
  得分:0 
請問如何存入資料庫

請問如何將抓到的資料在ISAPI FILTER 中存入資料庫
多謝您的回答...
2008-6-2 19:18
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.099982 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved