安全服务|网站地图|RSS订阅
位置:主页 > 计算机网络安全 >

SAPI与网络服务器安全研究(2)

时间:2007-10-29 17:23 来源: 服务器安全资源网 作者: 阅读:

ISAPI(Internet Server Application Programming Interface)作为一种可用来替代CGI的方法,是由微软和Process软件公司联合提出的Web服务器上的API标准.ISAPI程序以DLL 形式被Web服务器加载到自己的进程空间中,因此和服务器共用同一个地址空间,且在没有客户请求时可以将其从内存中卸载;ISAPI主要分为ISA和 ISAPI Filter两部分.ISA方法相对而言要传统一些,利用一些特殊的链接,指向服务器的作业,供程序开发人员设计一些扩展功能;而ISAPI过滤器则倾向于构造服务器直接调用的模块,提供一种无缝链接部件用于监测直接来自于服务器的HTTP请求.通过ISAPI过滤器,进行自己定制的处理,来增强IIS的功能.ISAPI过滤器可以定制以下的处理:接收HTTP协议头预处理,发送HTTP协议头预处理,发送生数据预处理,获得生数据预处理,HTTP会话结束信息.
IIS过滤器的实现过程是:首先捕获客户端用户请求的数据,解析出用户请求的URL,请求方法等所有的消息头和消息体,之后将通过 WinInet将请求二次转发到后台服务器,后台服务器接受来自网站服务器转发的请求,处理后将结果返回给网站服务器.网站服务器得到后台服务器处理的结果将结果以重定向的形式原样返回给客户端.
ISAPI的使用需要通过编码的方式进行,下面给出关键性代码,并加以解释.代码采用VC++ 6.0编写,用RedirFilter.dll文件来实现IIS过滤器.在RedirFilter过滤器中我们共用到IIS三个通知事件: OnReadRawData,OnPrepareHeader和OnLog.通过OnReadRawData事件将请求参数截获,将截获的请求参数打包原样转发给后台服务器,然后把后台服务器返回的数据写入临时文件,通知OnPrepareHeader事件重定向到临时文件.为了测试起见,我们只考虑在一个目录下的POST方法的请求转发.如需要全部的目录和更多的请求方法只要稍微改动即可.
类实现:
class CRedirFilter : public CHttpFilter
{
public:
virtual BOOL GetFilterVersion(PHTTP_FILTER_VERSION pVer);
virtual DWORD OnPreprocHeaders(CHttpFilterContext* pCtxt, PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo);
virtual DWORD OnReadRawData(CHttpFilterContext* pCtxt, PHTTP_FILTER_RAW_DATA pRawData);
private:
CString ReSendPost(CString strAddress,CString FormData); //转发POST表单数据
CString pstrPostData; //用户请求数据
protected:
CString GetPostData(LPTSTR lpStrData); //得到用户请求数据
};
在原始的请求数据过滤OnReadRawData:
DWORD CRedirFilter::OnReadRawData(CHttpFilterContext* pCtxt,
PHTTP_FILTER_RAW_DATA pRawData)
{
LPTSTR pstrIn;
pstrIn=(LPTSTR)pRawData->pvInData;
pCtxt->m_pFC->pFilterContext = NULL;
//如果是POSt方法并且虚拟目录是User进行过滤操作
if (pstrIn[0]==\'P\'&&pstrIn[1]==\'O\'&&pstrIn[2]==\'S\'&&pstrIn[3]==\'T\'&&
pstrIn[5]==\'/\'&&(pstrIn[6]==\'U\'||pstrIn[6]==\'u\')&&(pstrIn[7]==\'S\'||pstrIn[7]==\'s\')&&
(pstrIn[8]==\'E\'||pstrIn[8]==\'e\')&&(pstrIn[9]==\'R\'||pstrIn[9]==\'r\')&&pstrIn[10]==\'/\')
{//是POST方法
pstrPostData=GetPostData(pstrIn); //找到POST提交的数据
}
else
{
pCtxt->m_pFC->pFilterContext=(VOID *)1; //不是Post方法
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
得到表单POST数据GetPostData:
CString CRedirFilter::GetPostData(LPTSTR lpStrData) //分析并得到Post数据
{
int ndx=0;
CString strPostData;
strPostData=(CString)lpStrData;
ndx=strPostData.ReverseFind(\'n\');
strPostData=strPostData.Mid(ndx+1);
return strPostData;
}
进行重定向和转发处理.
转发处理函数ReSendPost:
CString CRedirFilter::ReSendPost(CString strAddress,CString FormData)
{
//重定向的文件名
CString RedirFile="error.asp";
//请求的地址
CString m_strAddress="http://192.168.0.168/back"+strAddress;
CInternetSession session(_T("RedirFilter"));
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
try
{
CString strServer;
CString strObject;
INTERNET_PORT nPort;
DWORD dwServiceType;
CString strHeaders =_T("Content-Type: application/x-www-form-urlencoded");
CString strFormData=FormData;
AfxParseURL(m_strAddress,dwServiceType,strServer,strObject,nPort);
pServer = session.GetHttpConnection(strServer,nPort);
//增加头来支持POST表单
pFile = pServer->OpenRequest(0,strObject,NULL,1,NULL,NULL,
INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT );
pFile->AddRequestHeaders(_T("USER-AGENT:RedirFilter"));
pFile->SendRequest(strHeaders,(LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
CString strNewLocation;
pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation);
阅读排行
最新阅读
反黑客技术
反病毒资讯
网络安全资讯
Copyright © 2003-2010 Server Security Resource Site.服务器安全资源网 版权所有 Design: Berlin QQGroup [粤ICP备09049593号]