ISAPI开发心得
来源:互联网 发布:仪器比对 数据分析 编辑:程序博客网 时间:2024/06/08 03:07
问:如何创建一个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->WriteClient(c_response,&response_len);
return SF_STATUS_REQ_FINISHED;
}
memset(c_url,0,256);
strcpy(c_url,pMapInfo->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->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->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;
- ISAPI Filter 开发心得
- ISAPI开发心得
- 开发ISAPI关于路径的一点心得
- ISAPI Filter开发入门
- IIS ISAPI Filter 开发
- IIS ISAPI Filter 开发
- D2007开发ISAPI网站
- ISAPI开发介绍
- ISAPI开发介绍
- C#开发ISAPI程序(摘)
- ISAPI
- ISAPI
- 用isapi开发论坛的一些体会
- 使用MFC开发ISAPI Extensions程序
- 开发心得
- 开发心得
- 开发心得
- 开发心得
- 3.Database Architecture
- 如何搭建Windows Embedded CE6.0开发环境?
- Java规则引擎工作原理及其应用(摘)
- MVC架构探究及其源码实现(3)-WebApplicationContext
- 通过观察者模式和Reactor模式深入理解JAVA NIO 线程
- ISAPI开发心得
- 《弯道超越》
- 深入浅出之正则表达式(二)
- Ubuntu Server 装图形操作界面
- 测试测试
- javascript函数
- Unix Shell - If statement
- 【转自: http://blog.csdn.net/liuxiaotao008/archive/2008/06/29/2595391.aspx 】各种JavaEE架构图汇总!
- [转载]JSP PO VO BO DTO POJO DAO解释