网页防篡改系统原理


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文件。这样就起到了安全的作用。

 

有什么地方说的不准确的希望广大网友给与指出!谢

你可能感兴趣的:(网页防篡改系统原理)