ISAPI中过滤器主要应用在IIS服务器上面。
网页防篡改技术的探究 主要用的就是ISAPI过滤的功能。
在当今电子商务、电子政务日益普及的时代,网站往往成为企事业单位、政府机关的形象窗口同时也是对外开展业务、提供服务的重要手段之一。网站页面被篡改,不仅影响正常业务的开展而且对企业形象、政府信誉带来极其不好的影响。虽然目前已有、入侵检测等安全防范手段,但现代的复杂性和多样性导致系统漏洞层出不穷,防不胜防。黑客入侵和篡改页面的事件时有发生。根据CNCERT/CC统计,网页篡改事件已经成为威胁网站安全和社会正常秩序的一个严重问题,必须高度重视。只要做好网页防篡改,才能保证政府形象和企业的利益以及社会的稳定不受网页篡改事件的危害。
本文就是针对目前市场上的主流网页防篡改技术的探究,并提出我们的解决方案。
网页防篡改系统原理
1. 外挂轮询技术
外挂轮询技术是利用一个网页检测程序,以轮询方式读出要监控的网页,与真实网页相比较,来判断网页内容的完整性,对于被篡改的网页进行报警和恢复。
主要优点:实现、部署简单
主要弱点:在网站大的情况下,网页数量巨大,扫描一遍的时间太长,占用系统大量资源。
2. 核心内嵌技术
核心内嵌技术是将篡改检测模块内嵌在Web服务器软件里,它在每一个网页流出时都进行完整性检查,对于篡改网页进行实时访问阻断,并予以报警和恢复。
主要优点:仅对流出web服务器的页面进行检查,使得被篡改的页面xx没有被浏览者看到的可能。
主要缺点:在访问页面时会必须经过处理,会消耗点资源。
3. 事件触发技术
事件触发技术是利用操作系统的文件系统接口,在网页文件的被修改时进行合法性检查,对于非法操作进行报警和恢复。
主要优点:从根本上对非法篡改进行阻止。
主要缺点:如果攻击者xx非法控制主机,那么这种技术就没有作用了。
ISAPI筛选器是微软针对IIS提供的专用API,提供了对IIS 的纵向扩充功能。ISAPI筛选器和HTTP 服务器运行在同一地址空间,并且可以访问可由 HTTP 服务器使用的所有资源。ISAPI筛选器随IIS启动而加载,客户机的每个HTTP请求都会导致筛选器执行,并且IIS处理HTTP请求的各个阶段都会产生一个通知,从而调用筛选器处理相应事件。我们的防篡改检测就是一个ISAPI 筛选器。
下面是我的一个实例。先说下配置:
将过滤器生成的DLL文件放在一个文件夹下。将SQLite3.dll和数据库文件(.db)放在过滤器的文件夹下面。
DWORD CDataSendDemoFilter::OnSendRawData(CHttpFilterContext* pCtxt, ret = sqlite3_prepare(db,"select * from fileattr where filename = 'magic.html';" , -1, &stmt,0); char buffer1[100]; sqlite3_finalize(stmt); // 释放sqlite3_stmt 这个例子实现了从数据库中取出数据,然后将其显示在HTML文件中。 下一个例子我会将md5加密算法给出。目的是将网页加密的密文和水印表中的密文进行匹配。如果匹配不成功,则说明有人篡改了HTML文件。此时可以将备份的HTML文件覆盖之前发布的HTML文件。这样就起到了安全的作用。 有什么地方说的不准确的希望广大网友给与指出!谢
PHTTP_FILTER_RAW_DATA pRawData)
{
// TODO: React to this notification accordingly and
// return the appropriate status code
/*TRACE("CMyex34bFilter::OnReadRawData\n");
char buffer[100];
memset(buffer,0,sizeof(buffer));
sprintf(buffer,"ASDGJKLLL");
DWORD len = strlen(buffer);
//数据写在URL对应的数据的前面
pRawData->pvInData = buffer;
pCtxt->WriteClient(buffer,&len,0);
pRawData->cbInData = 0; */ //将发送的数据设置为零
//得到相应的URL 然后在去核查里面的内容是否匹配 {zh1}再去处理
sqlite3 *db = 0;
char *pErrMsg = 0;
sqlite3_stmt *stmt = NULL;
int ret = 0;
char stderr1[100]; //记录错误的信息
ret = sqlite3_open("C:\\ASPISAPI\\security.db",&db); //打开数据库成功了
DWORD len;
//char sql[100] = "select * from fileattr where filename = 'magic.html';";
if (ret != SQLITE_OK)
{
sprintf(stderr1,"无法打开数据库");
len = strlen(stderr1);
pCtxt->WriteClient(stderr1,&len,0);
pRawData->cbInData = 0;
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
else
{
char Message[100];
sprintf(Message,"我就是我");
DWORD Messlen = strlen(Message);
pCtxt->WriteClient(Message,&Messlen,0); //向客户端发送一串数据
if(ret != SQLITE_OK)
{
char Message[100];
sprintf(Message,"select * from fileattr where filename = 'magic.html'; 出现了错误");
DWORD Messlen = strlen(Message);
pCtxt->WriteClient(Message,&Messlen,0); //向客户端发送一串数据
pRawData->cbInData = 0;
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
// int rc = sqlite3_step(stmt);
while (SQLITE_ROW == sqlite3_step(stmt))
{
CString filename = sqlite3_column_text(stmt,0);
CString filetext = sqlite3_column_text(stmt,1);
int times = sqlite3_column_int(stmt,2);
sprintf(buffer1,"文件名:%s 文件内容:%s 被篡改的次数:%d",filename,filetext,times);
len = strlen(buffer1);
pCtxt ->WriteClient(buffer1,&len,0);
pRawData->cbInData = 0;
//rc = =sqlite3_step(stmt);
break;
}
sqlite3_close(db); //这段代码查询id号大于5的所有记录,并显示到控制台,{zh1}效果为
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}