ISAPI过滤器介绍与使用

来源:互联网 发布:淘宝图片保护在哪里看 编辑:程序博客网 时间:2024/05/21 15:43

                                                                      ISAPI过滤器介绍与使用

                                                                                                                                               flyli

首先先介绍下ISAPI 筛选器是什么

  ISAPI 筛选器是在启用 ISAPI 的 HTTP 服务器上运行的 DLL,用以筛选与服务器之间来回传送的数据。该筛选器注册事件的通知,例如登录或 URL 映射。当发生选定事件时,筛选器被调用,并且您可以监视及更改数据(在数据从服务器传输到客户端或相反的过程中)。可以使用 ISAPI 筛选器提供增强的 HTTP 请求记录(例如,跟踪登录到服务器的用户)、自定义加密、自定义压缩或其他身份验证方法。

        在我看来ISAPI筛选器就是介于web服务器与用户之间的一个筛子,所有web服务器与用户之间的信息web服务器基本上都能截获,但是他有什么作用呢?

        我使用的ISAPI过滤器开发工具是VC6.0

        网上的教程已经很多了,在这里我就不在做详细的介绍了

        我只说说几个比较有用的过滤器的功能

        1.当有人再服务器上发送了非法字符,比如《色~~~情》这个词的话,可以直接将其过滤掉,可以选择的方式有替换和直接删除,具体实现方法如下所示

DWORD CWwwFilter::OnSendRawData(CHttpFilterContext* pCtxt, PHTTP_FILTER_RAW_DATA pRawData)
{

CString content((char *)pRawData->pvInData);
for(int i = 0; i < str_key_fill; i++)
{
   str = str_keyword[i][0];
   str = str.Mid(str.Find("=")+1);

    content.Replace("web", "***");

content.ReleaseBuffer();
pCtxt->AllocMem(content.GetAllocLength());
pRawData->cbInData=content.GetAllocLength();
pRawData->cbInBuffer= content.GetAllocLength();
pRawData->cbInData=content.GetAllocLength();
strcpy((char*)pRawData->pvInData,content.GetBuffer(content.GetLength()));
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

此段代码的作用就是将所有网页中的“web”字符,替换成“***”,这样就形成了字符过滤的功能

但是要使OnSendRawData(一个当服务器向用户发送数据的时候被调用的函数)这个函数能被调用需要再GetFilterVersion(PHTTP_FILTER_VERSION pVer)这个函数中的 pVer->dwFlags标识符中添加SF_NOTIFY_SEND_RAW_DATA;

另外介绍一个在用户访问完网页后,服务器端记录下访问者访问的网页以及访问者ip的作用

此功能比较适合加在SF_NOTIFY_END_OF_NET_SESSION事件中,同样也是需要再pVer->dwFlags标示中加入SF_NOTIFY_END_OF_NET_SESSION标志,然后添加OnEndOfNetSession中,为什么添加到OnEndOfNetSession中呢?因为这个函数是在一次会话结束后调用的,最适合添加记录性的东西,当然再OnLog函数中添加也可以,不过你用了就会发现一些问题,其实我们并不需要如此频繁的记录这些日志的哈

DWORD CWwwFilter::OnEndOfNetSession(CHttpFilterContext* pfc)
{
// TODO: Add your specialized code here and/or call the base class
char buf[1000] = {0};
unsigned long buf_size = 1000;
CString str;
m_pRecordset->AddNew();///添加新记录
pfc->GetServerVariable("SERVER_NAME",buf,&buf_size);//被访问的域名
m_pRecordset->PutCollect("to_url",_variant_t(buf));
pfc->GetServerVariable("REMOTE_ADDR",buf,&buf_size);//客户的IP地址
m_pRecordset->PutCollect("from_IP",_variant_t(buf));
CTime tm;
tm=CTime::GetCurrentTime();
str=tm.Format("%Y年%m月%d日 %X");
m_pRecordset->PutCollect("time",_variant_t(str));
m_pRecordset->Update();

return CHttpFilter::OnEndOfNetSession(pfc);
}

        其中比较重要的是GetServerVariable函数,具体的使用方法参见MSDN哈,我再从上面cp些文字下来也没有意义。。。其中还用到了数据库的操作,但是没有配合上下文,相信大家的水平应该看得懂哈。

 

最后声明下哈,以上函数都是我从我做的现实工程中拷贝过来的,上下文需要各位同僚自己补全,或者删除哈

其实isapi筛选器还有个变态的功能,记录密码。。。。不过这个我就不介绍了。。。见谅。。。。

呵呵,今天就写这么多了,呵呵,下次有好东西继续拿来分享,假如有兄弟再编写isapi的时候遇到了什么问题,或者有相应的项目合作的话,我愿意参加哈~

另外如果要转载我的文章,希望各位著名作者哈,原创的哈,先谢谢了:)

原创粉丝点击