鉴于大家对其他类别十分关注,我们编辑小组在此为大家搜集整理了“网络入侵防御系统的设计”一文,供大家参考学习
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
1.1.1 使用ISAPI进行Http响应 (1) 拒绝访问 当在ISAPI Filter中直接返回SF_STATUS_REQ_FINISHED时,IIS服务器就会断开和客户端的连接。 (2) 发送信息 发送信息的响应中有两个参数,一个是http报文响应的状态,例如:http状态200表示正常;http状态403表示拒绝访问;http状态500表示服务器错误等等。另一个参数是所发送信息的内容。通过ISAPI Filter中提供的ServerSupportFunction API可以设置响应的HTTP报文的状态,通过WriteClient可以直接向客户端写数据。以下为发送信息响应方式的部分实现代码 void IISClient::SendMsg(const char *status, const char *msg) { uint32_t bufSize; _pfc->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER, const_cast<char*>(status), NULL, NULL); bufSize = uint32_t(strlen(msg)); _pfc->WriteClient(const_cast<char*>(msg), &bufSize); } (3) 发送文件 发送文件的实现和发送信息的实现类似。第二个参数换成了要发送文件的路径。发送的文件内容从该路径指定的文件中读取。以下为发送文件响应的实现的部分实现代码 void IISClient::SendFile(const char *status, const char *filename) { const DWORD BUF_SIZE = 10 * 1024; char buffer[BUF_SIZE] = {0}; _pfc->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER, const_cast<char*>(status), NULL, NULL); ifstream in(filename, ios_base::binary); if(in) { DWORD nCount = 0; for(;;) { in.read(buffer, BUF_SIZE); nCount = in.gcount(); if(nCount == 0) break; _pfc->WriteClient(buffer, &nCount); } } } (4) 重定向 将服务器端响应的Http报头中的状态码设置为“302 Moved Permanently ”,同时设置报头中的Location为要转向的地址。客户端的浏览器在收到这样的报文后会重新去访问新的地址。重定向的部分实现代码如下 void IISClient::Redirect(const char *url) { char buf[256]; sprintf(buf,"Location: %s\r\n", url); _pfc->AddResponseHeaders(buf); _pfc->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER, "302 Moved Permanently", NULL, NULL); return; } 1.1.2 在服务器上的安装配置ISAPI Filter 正确的配置ISAPI Filter才能保证系统能够正常工作。在Windows 2003的服务器上配置IIS的ISAPI Filter的步骤如下: (1) 打开IIS管理器 (2) 展开左侧的目录树,选择网站,单击鼠标右键,选择属性 (3) 选择ISAPI 筛选器一栏 (4) 点击添加按钮,筛选器名称填“WebIPS”,可执行文件选择WebIPS所在的路径,单击确定添加完毕。 (5) 如果需要重新加载ISAPI ,需要重启IIS服务。 在完成上述步骤后,通过浏览器访问下服务器所在的网站,如果状态栏变为绿色向上箭头,说明系统已经可以正常工作,否则说明ISAPI Filter没有加载成功。 1.2 基于Lua的策略实现 在这个Web的入侵防御系统的设计中,策略引擎可以加载C++实现的策略和脚本实现的策略脚本。C++实现的策略效率高但因为采用硬编码的方式集成到系统中,除了少量的数据信息可以通过配置文件在加载时动态配置外,其策略的逻辑无法灵活的修改。而脚本由于其动态解析的特点,策略的逻辑可以很方便的通过修改策略脚本完成,也可以通过策略脚本提供更多的策略。虽然脚本方式的策略在效率方面低于C++实现的策略,我们可以根据服务器的配置及需求在C++实现的策略高效和脚本的方便灵活上找到一个平衡点。在考察了各种脚本引擎的特点后,我们为本系统采用Lua语言作为它的策略脚本语言。 1.2.1 对策略的封装 要让Lua作为策略的脚本语言首先得完成对策略的封装。在前面的设计部分已经介绍了策略实现中需要提供的几个接口。由于Lua的特性,可以在C++ 中很方便的调用Lua编写的函数,所以可以在Lua策略脚本中,通过Lua函数的方式提供策略引擎所需要的OnRecv和OnSend接口。当策略引擎调用Lua策略时,会向Lua脚本中的OnRecv和OnSend函数传递client对象这个参数。我们需要将此对象封装成Lua脚本能识别的形式。在《Programming in Lua》[7]和《我的编程感悟》[8]中都介绍了如何将C++的类封装成Lua的Table的实例,这里就不在介绍了。 1.2.2 Lua策略脚本示例 使用Lua语言编写策略脚本非常简单,下面是一段用来过滤SQL注入关键字的Lua策略脚本示例: warning_msg = [[ <html> <head> <meta http-equiv="Content-Language" content="zh-cn"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>请你自重</title> </head> <body bgcolor="#D6D3CE"> <p><b><font size="2"> 你的攻击行为已经被记录</font></b></p><hr><p><b><font size="2"><span lang="en-us">BY 林海峰 </span>版权所有</font></b></p> </body> </html> ]] function OnRecv(request) url = request:GetServerVariable("QUERY_STRING") Logger.Append("AntiSQLInject", url) if CheckSqlKey(url) then return Response.SendMsg(request, "200 OK", warning_msg); end end function CheckSqlKey(str) local test_key = {"and", "or"} str = string.lower(str) for i,v in ipairs(test_key) do if string.find(str, v) then return true end end return false end 1.3 基于xml的策略管理 在这套系统中,我们通过xml配置文件来管理策略的信息。我们使用tinyxml库完成xml文件的解析与生成。例如,我们将上面的lua脚本保存为AntiSQLInject.lua后可以使用如下的config.xml文件使系统加载该策略。 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <PolicyList> <Policy Name="AntiSQLInject" Description="Anti SQL Inject" Loader="lua" Path="Policy\AntiSQLInject.lua" Type="USER" Priority="1" Enable="true" /> </PolicyList> IIS加载我们的ISAPI Filter 的DLL成功后,会读取该目录下的config.xml文件,并通过xml中的policy列表加载策略。按照上面的xml文件信息所示,AntiSQLInject.lua应该存放在Policy目录下。 |
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |