1. 外挂轮询技术
外挂轮询技术是利用一个网页检测程序,以轮询方式读出要监控的网页,与真实网页相比较,来判断网页内容的完整性,对于被篡改的网页进行报警和恢复。
主要优点:实现、部署简单
主要弱点:在网站大的情况下,网页数量巨大,扫描一遍的时间太长,占用系统大量资源。
2. 核心内嵌技术
核心内嵌技术是将篡改检测模块内嵌在Web服务器软件里,它在每一个网页流出时都进行完整性检查,对于篡改网页进行实时访问阻断,并予以报警和恢复。
主要优点:仅对流出web服务器的页面进行检查,使得被篡改的页面完全没有被浏览者看到的可能。
主要缺点:在访问页面时会必须经过处理,会消耗点资源。
3. 事件触发技术
事件触发技术是利用操作系统的文件系统接口,在网页文件的被修改时进行合法性检查,对于非法操作进行报警和恢复。
主要优点:从根本上对非法篡改进行阻止。
主要缺点:如果攻击者完全非法控制主机,那么这种技术就没有作用了。
ISAPI筛选器是微软针对IIS提供的专用API,提供了对IIS 的纵向扩充功能。ISAPI筛选器和HTTP 服务器运行在同一地址空间,并且可以访问可由HTTP 服务器使用的所有资源。ISAPI筛选器随IIS启动而加载,客户机的每个HTTP请求都会导致筛选器执行,并且IIS处理HTTP请求的各个阶段都会产生一个通知,从而调用筛选器处理相应事件。我们的防篡改检测就是一个ISAPI 筛选器。
下面是我的一个实例。先说下配置:
将过滤器生成的DLL文件放在一个文件夹下。将SQLite3.dll和数据库文件(.db)放在过滤器的文件夹下面。
DWORD CDataSendDemoFilter::OnSendRawData(CHttpFilterContext* pCtxt,
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 然后在去核查里面的内容是否匹配 最后再去处理
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); //向客户端发送一串数据
ret = sqlite3_prepare(db,"select * from fileattr where filename = 'magic.html';" , -1, &stmt,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);
char buffer1[100];
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_finalize(stmt); // 释放sqlite3_stmt
sqlite3_close(db); //这段代码查询id号大于5的所有记录,并显示到控制台,最后效果为
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
这个例子实现了从数据库中取出数据,然后将其显示在HTML文件中。
下一个例子我会将md5加密算法给出。目的是将网页加密的密文和水印表中的密文进行匹配。如果匹配不成功,则说明有人篡改了HTML文件。此时可以将备份的HTML文件覆盖之前发布的HTML文件。这样就起到了安全的作用。
有什么地方说的不准确的希望广大网友给与指出!谢