写了一个ISAPI的筛选器 基于IP的筛选
之前实现的功能是 根据来访者的IP和本地的一个txt文件比较,如果本地文件包含了这个IP 就允许访问.否则就拒绝访问现在要实现的是
根据来访者的IP和某IIS服务器上的一个文件比较..如果远程的那个文件包含这个IP 就允许访问,否则就拒绝访问..我现在的思路是通过 MSXML2 的办法去获取远程文件的源码到本地文件...然后再进行之前的那种本地校验现在获取远程源码到本地在单个的程序中已经实现了...
但是将代码整到ISAPI里面就无法实现...附上CPP代码
// IPISAPI.CPP - Implementation file for your Internet Server
// IPISAPI Filter#include "stdafx.h"
#include "IPISAPI.h"
#import "msxml.dll"
#import "msxml2.dll"
#include <string>
///////////////////////////////////////////////////////////////////////
// The one and only CWinApp object
// NOTE: You may remove this object if you alter your project to no
// longer use MFC in a DLL.CWinApp theApp;using namespace MSXML2;
CString bstrtbody;
int main(int argc, char* argv[])
{
CoInitialize(NULL);{
IXMLHTTPRequestPtr xmlrequest;
xmlrequest.CreateInstance("Msxml2.XMLHTTP");
_variant_t varp(false);
xmlrequest->open(_bstr_t("GET"),_bstr_t("http://yy.hhvod.com/ip.asp"),varp);
xmlrequest->send();
BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
_bstr_t bstrtbody(bstrbody);
//printf("%s\n",(LPCTSTR)bstrtbody);
CStdioFile file; file.Open("C:\\BlockIP.txt",CFile::modeReadWrite|CFile::typeText);
file.WriteString((LPCTSTR)bstrtbody);
}
CoUninitialize();
return 0;
}
///////////////////////////////////////////////////////////////////////
// The one and only CIPISAPIFilter objectCIPISAPIFilter theFilter;
///////////////////////////////////////////////////////////////////////
// CIPISAPIFilter implementationCIPISAPIFilter::CIPISAPIFilter()
{
}CIPISAPIFilter::~CIPISAPIFilter()
{
}
BOOL CIPISAPIFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
// Call default implementation for initialization
CHttpFilter::GetFilterVersion(pVer); // Clear the flags set by base class
pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK; // Set the flags we are interested in
pVer->dwFlags |= SF_NOTIFY_ORDER_LOW | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT
| SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_URL_MAP | SF_NOTIFY_END_OF_NET_SESSION; // Load description string
TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
_tcscpy(pVer->lpszFilterDesc, sz);
return TRUE;
}DWORD CIPISAPIFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
{
// TODO: React to this notification accordingly and
// return the appropriate status code
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}DWORD CIPISAPIFilter::OnUrlMap(CHttpFilterContext* pCtxt,
PHTTP_FILTER_URL_MAP pMapInfo)
{ // TODO: React to this notification accordingly and
// return the appropriate status code
char szAddress[80];
memset(szAddress,'\0',80);
DWORD dwSize = sizeof(szAddress);
pCtxt->GetServerVariable("REMOTE_ADDR", szAddress, &dwSize);
CString strAddress;
strAddress.Format("%s",szAddress);
CStdioFile file;
CString str1;
CString StrAll;
BOOL bRet;
file.Open("C:\\BlockIP.txt",CFile::modeReadWrite|CFile::typeText);
do
{
bRet=file.ReadString(str1);
StrAll+=str1+"-";
} while(bRet);
file.Close();
if (strstr(StrAll,strAddress))
return SF_STATUS_REQ_NEXT_NOTIFICATION;
else
return SF_STATUS_REQ_FINISHED;}DWORD CIPISAPIFilter::OnEndOfNetSession(CHttpFilterContext* pCtxt)
{
// TODO: React to this notification accordingly and
// return the appropriate status code
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CIPISAPIFilter, CHttpFilter)
//{{AFX_MSG_MAP(CIPISAPIFilter)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0static HINSTANCE g_hInstance;HINSTANCE AFXISAPI AfxGetResourceHandle()
{
return g_hInstance;
}BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason,
LPVOID lpReserved)
{
if (ulReason == DLL_PROCESS_ATTACH)
{
g_hInstance = hInst;
} return TRUE;
}****/
之前实现的功能是 根据来访者的IP和本地的一个txt文件比较,如果本地文件包含了这个IP 就允许访问.否则就拒绝访问现在要实现的是
根据来访者的IP和某IIS服务器上的一个文件比较..如果远程的那个文件包含这个IP 就允许访问,否则就拒绝访问..我现在的思路是通过 MSXML2 的办法去获取远程文件的源码到本地文件...然后再进行之前的那种本地校验现在获取远程源码到本地在单个的程序中已经实现了...
但是将代码整到ISAPI里面就无法实现...附上CPP代码
// IPISAPI.CPP - Implementation file for your Internet Server
// IPISAPI Filter#include "stdafx.h"
#include "IPISAPI.h"
#import "msxml.dll"
#import "msxml2.dll"
#include <string>
///////////////////////////////////////////////////////////////////////
// The one and only CWinApp object
// NOTE: You may remove this object if you alter your project to no
// longer use MFC in a DLL.CWinApp theApp;using namespace MSXML2;
CString bstrtbody;
int main(int argc, char* argv[])
{
CoInitialize(NULL);{
IXMLHTTPRequestPtr xmlrequest;
xmlrequest.CreateInstance("Msxml2.XMLHTTP");
_variant_t varp(false);
xmlrequest->open(_bstr_t("GET"),_bstr_t("http://yy.hhvod.com/ip.asp"),varp);
xmlrequest->send();
BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
_bstr_t bstrtbody(bstrbody);
//printf("%s\n",(LPCTSTR)bstrtbody);
CStdioFile file; file.Open("C:\\BlockIP.txt",CFile::modeReadWrite|CFile::typeText);
file.WriteString((LPCTSTR)bstrtbody);
}
CoUninitialize();
return 0;
}
///////////////////////////////////////////////////////////////////////
// The one and only CIPISAPIFilter objectCIPISAPIFilter theFilter;
///////////////////////////////////////////////////////////////////////
// CIPISAPIFilter implementationCIPISAPIFilter::CIPISAPIFilter()
{
}CIPISAPIFilter::~CIPISAPIFilter()
{
}
BOOL CIPISAPIFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
// Call default implementation for initialization
CHttpFilter::GetFilterVersion(pVer); // Clear the flags set by base class
pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK; // Set the flags we are interested in
pVer->dwFlags |= SF_NOTIFY_ORDER_LOW | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT
| SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_URL_MAP | SF_NOTIFY_END_OF_NET_SESSION; // Load description string
TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
_tcscpy(pVer->lpszFilterDesc, sz);
return TRUE;
}DWORD CIPISAPIFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
{
// TODO: React to this notification accordingly and
// return the appropriate status code
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}DWORD CIPISAPIFilter::OnUrlMap(CHttpFilterContext* pCtxt,
PHTTP_FILTER_URL_MAP pMapInfo)
{ // TODO: React to this notification accordingly and
// return the appropriate status code
char szAddress[80];
memset(szAddress,'\0',80);
DWORD dwSize = sizeof(szAddress);
pCtxt->GetServerVariable("REMOTE_ADDR", szAddress, &dwSize);
CString strAddress;
strAddress.Format("%s",szAddress);
CStdioFile file;
CString str1;
CString StrAll;
BOOL bRet;
file.Open("C:\\BlockIP.txt",CFile::modeReadWrite|CFile::typeText);
do
{
bRet=file.ReadString(str1);
StrAll+=str1+"-";
} while(bRet);
file.Close();
if (strstr(StrAll,strAddress))
return SF_STATUS_REQ_NEXT_NOTIFICATION;
else
return SF_STATUS_REQ_FINISHED;}DWORD CIPISAPIFilter::OnEndOfNetSession(CHttpFilterContext* pCtxt)
{
// TODO: React to this notification accordingly and
// return the appropriate status code
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CIPISAPIFilter, CHttpFilter)
//{{AFX_MSG_MAP(CIPISAPIFilter)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0static HINSTANCE g_hInstance;HINSTANCE AFXISAPI AfxGetResourceHandle()
{
return g_hInstance;
}BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason,
LPVOID lpReserved)
{
if (ulReason == DLL_PROCESS_ATTACH)
{
g_hInstance = hInst;
} return TRUE;
}****/
解决方案 »
- 使用InstallShield打包VC++,数据库连接的问题
- 字符串相加,数据为何总是消失,问题解决给分
- 在 ActiveX控件中调用一个DLL,下面这个创建对象的过程放在控件的什么地方合适呢?
- CSocket问题
- 不用MFC如何生成一个OpenFile的标准对话框?
- 如何改变按钮的标题?基于对话框的简单程序。
- mouse hook程式為什么點擊一下就會出現非常多個WM_NCLBUTTONDOWN消息呢?
- 我想做一个smtp服务器程序,谁有这方面的资料
- 使用MFC绘图,200×200的位图每秒只能画两次,如何提高速度?
- 在vc++6.0中,在一个对话窗体中用按钮打开另一个对话窗体,应该怎么做,
- 重新回来给大家服务,这里放分给大家!!!!
- 如何利用SQL语句将数据库中的信息导入到Excel表格中,最有有这方面的例子
http请求建议直接用SOCKET写,也就几十行代码在UrlMap中每次都请求远端服务器,效率会很低,通常一个网页,都有N个请求的,也许要优化