,欢迎光临!
加入收藏设为首页请您留言
您当前位置:网站首页 >> 西南地区 >> 用过滤器防止图书馆业务系统受多线程攻击-上海联兵环保免费电话:400-600-5030

用过滤器防止图书馆业务系统受多线程攻击-上海联兵环保免费电话:400-600-5030

2011-09-13 13:43:17 来源:中国过滤器网 浏览:1
【摘要】:在B/S和C/S模型相结合开发的图书馆自动化集成应用系统中,B/S模块被发布到Internet后,多线程客户端程序访问部分较长耗时查询页面时,容易造成数据库被拖垮。本过滤器限制这部分访问,从而保证各业务子系统能够充分访问数据库。
【关键词】:ISAPI;过滤器;IIS;多线程;B/S;C/S;数据库
1.引言
图书馆自动化集成应用系统的稳定运行直接影响着图书馆各种业务工作的正常开展,目前图书馆自动化集成应用系统大多采用C/S(Client/Server)和B/S(Browser/Server)相结合的模型开发。如重庆大学图书馆开发的"图腾"系统便是如此,采访、编目、典藏、流通、阅览、读者管理等内部业务子模块,以C/S模式开发,一般在图书馆内部局域网上,供馆内部日常工作用;而书目查询、网上续借、网上读者证挂失、新书推荐等公共Web子模块则以B/S的模式开发,并发布到Internet上,供所有读者使用。
各子系统共同访问一个中央数据库,显而易见数据库的稳定运行对整个系统的稳定运行起着至关重要的作用。本文主要给出了一个ISAPI过滤器,限制客户端利用多线程从Internet同时访问较长耗时查询页面,保证数据库硬件资源不被这些访问拖垮,从而充分保证了系统的功能完善和稳定运行。
2.公共Web子模块的脆弱性分析
公共Web子模块的显著特点是:面向Internet开放。而面向Internet开放可以让图书馆读者在任何一个能够接入Internet的计算机上使用公共Web子模块,大大方便了读者,但这也是其脆弱的根源,比如:各种网络黑客、病毒等对Web服务器进行恶意攻击;各大搜索引擎利用网络机器人进行多线程搜索,或者恶意访问者利用多线程程序,调用大量费时的数据库查询,造成数据库服务器资源耗尽,致使整个集成应用系统瘫痪。对于防止Web服务器受到恶意攻击[1],Internet上相关知识较多,应该说,要建立一个稳定安全的网站应该说是一件不难的事,而且这方面的攻击一般也不会攻击到数据库服务器,导致整个系统瘫痪。
对于多线程调用大量长费时的数据库查询对系统造成的影响却容易造成整个系统瘫痪,而且这些访问不易被认为是恶意攻击,但他会直接影响到整个系统的核心--系统数据库,一旦数据库硬件资源被耗尽,整个系统将崩溃,连图书馆内部业务工作也无法正常开展。因此,要充分享用公共Web子模块面向Internet开放性的优点,必须防止客户端通过公共Web子模块暴力访问系统数据库。
3.应对多线程长费时Web查询的一般策略
很多图书馆也应该意识到了这个问题,部分能够修改Web查询程序源代码的用户将一些比较典型的长耗时查询功能(查询某作者所著的图书等)取消;多数图书馆则只在校园内部,甚至图书馆内部局域网上使用这些公共Web子模块,但是这样做确不能够充分享用公共Web子模块面向Internet开放的优越性。
4.用ISAPI过滤器应对应对多线程长费时Web查询
为了充分克服公共Web子模块的脆弱性,充分发挥公共Web子模块的优越性,ISAPI过滤器限制多线程访问长耗时查询是个深入到IIS服务器内部的解决方案[2]。
4.1 ISAPI简介
ISAPI过滤器是监督和改变处理传入的HTTP请求的DLL(动态链接库)。过滤器有机会被访问服务器的每个请求调用;当调用时,他们可以看到并修改请求或为请求服务而不把请求传回缺省IIS逻辑。过滤器可以用来对IIS服务器操作方式修改一些基本的修改[3]。
图1给出了ISAPI过滤器是如何嵌入IIS服务器,即嵌入I-IS处理每个请求的详细过程。IIS服务启动时调用GetFilterVersion,IIS服务停止时调用TerminateFilter,当IIS在处理每个请求时检测到有GetFilterVersion注册的事件(能够处理的IIS事件可以参阅参考文献[3])发生,调用HttpFilterProc进行处理,根据HttpFilterProc的返回值继续处理请求,直到IIS响应完请求。
ISAPI过滤器正是通过实现处理网站应用所关心的事件的处理函数Http-FilterProc,在服务器检测到这些事件发生时调用它,达到监督和改变处理传入的HTTP请求的目的。
4.2限制多线程访问长耗时查询过滤器的实现
在实现本ISAPI过滤器中,过滤器只需要对"预处理请求标题后"事件(SF_NOTIFY_PREPROC_HEADERS)和"已完成对请求的处理"事件(SF_NOTIFY_END_OF_REQUEST)作处理,便可以实现限制多线程访问长耗时查询的目的。对"预处理请求标题后"事件的处理主要是:如果该客户端IP不在当前正在访问这些长耗时查询页面的IP中,则向正在访问长耗时查询页面的IP数组中加入该IP,并继续处理该请求的后续步骤;否则停止处理该请求,并向客户端返回错误码。对"已完成对请求的处理"事件的处理主要是:在正在访问长耗时查询页面的IP数组中删除该客户端IP。下面以Delphi语言为例介绍本过滤器中三个关键函数实现。

GetFilterVersion的实现:
function GetFilterVersion(var Ver:THTTP_FILTER_VERSION):BOOL;
begin
Ver.dwFilterVersion:=HTTP_FILTER_REVISION;
Ver.lpszFilterDesc:=’限制多线程访问长耗时查询’;
Ver.dwFlags:=SF_NOTIFY_ORDER_DEFAULT
or SF_NOTIFY_PREPROC_HEADERS
or SF_NOTIFY_END_OF_REQUEST;
Result:=TRUE;
end;
HttpFilterProc的实现:
function HttpFilterProc(var pfc:THTTP_FILTER_CONTEXT;Notificationtype:
DWORD;
pvNotification:Pointer):DWORD;
begin
多线程访问保护;
if(Notificationtype and SF_NOTIFY_PREPROC_HEADERS)>0 then
begin
if(访问的是长耗时查询文件并且该客户端IP正在访问)then
begin
pfc.ServerSupportFunction(pfc,SF_REQ_SEND_RESPONSE_HEAD-
ER,PChar(’400 Bad Request’),0,0);
pfc.WriteClient(pfc,PChar(sMsg),sMsgLen,0);
Result:=SF_STATUS_REQ_FINISHED;
End
Else if(访问的是php文件)then
Begin
加入IP(_GetServerVariable(pfc,’REMOTE_ADDR’));
end
Else begin
Result:=SF_STATUS_REQ_HANDLED_NOTIFICATION;
end;
end;
end;
end;
if(Notificationtype and SF_NOTIFY_END_OF_REQUEST)>0 thenbegin
删除IP(_GetServerVariable(pfc,’REMOTE_ADDR’));Result:=SF_STATUS_REQ_HANDLED_NOTIFICATION;
end;
多线程保护释放;
end;
其中多线程保护操作可以用Delphi封装的TCriticalSection类轻松实现。
TerminateFilter的实现:
function TerminateFilter(dwFlags:DWORD):BOOL;
begin
Result:=TRUE;
end;
5.结束语
该ISAPI过滤器成功运用到我馆Web查询上,限制了多线程访问长耗时查询,充分保证我馆图书馆自动化集成应用系统的数据库硬件资源不被这些访问耗尽,从而保证整个系统不会因为数据库硬件资源的耗尽而崩溃。事实上,目前很多办公系统都是采用B/S、C/S相结合的模型开发,其B/S部分同样存在着类似的问题,在本过滤器的设计思想同样适合这些系统。

 

上海联兵环保科技有限公司
地址:上海市松江区工业区茸北分区茸阳路69号
总机:021-51691929
传真:021-57784244
免费电话:400-600-5030
技术支持:13641659499
E-mail:zhanglianbing@126.com
http://www.shlbhb.com

发表评论
网名:
评论:
验证:
共有0人对本文发表评论查看所有评论(网友评论仅供表达个人看法,并不表明本站同意其观点或证实其描述)
赞助商链接
关于我们 - 联系我们 - 咨询联兵