Protecting Vulnerable Applications with IIS7
很不错的一份演示PPT,详细介绍了如何在IIS7下利用HttpModule来实现一个完整的WAF产品,其中很多特性值得借鉴和学习,不妨仔细看看。
IIS7是一个充分借鉴了Apache的优秀模块化设计思想的产物,虽然在ASP.NET设计之初就有HttpModule/HttpHandle的概念,但是那时候的.NET HttpModule/HttpHandle只能捕获以及处理ASP.NET的请求,而针对于同样将IIS作为宿主的其他Http Request则只能干瞪眼,比如PHP/ASP。
在以前的IIS5.x/IIS 6下面,如果要开发一个完整的Web Application Firewall子集,则必须写ISAPI Filter。而ISAPI在不同的IIS版本下都有诸多限制。比如说:在IIS 5.x下,ISAPI Filter可以轻松捕获以及处理GET和POST数据,但是到了IIS6下面则很难捕获到POST数据,当然在IIS6下是同样可以捕获处理POST数据的,只是难度要远大于IIS5.x,需要利用通配符ISAPI Extend来迂回处理,或者启用IIS6的向下兼容模式(这也完全失去了IIS6的优势所在了)。
而在IIS5.x /IIS6下编写ISAPI Filter则在很长一段时间内都没有C#的份儿,原因很简单,C#之类的IL语言是不能直接来编写ISAPI Filter的,只能用VC/Delphi之类的来写ISAPI。不过使用C#还是可以开发ISAPI的,只是同样适用迂回策略即可,:) 。 这一点就连微软IIS Team竟然也在blog上不可行,不过后面我来告诉大家如何用C#来实现ISAPI Filter。
现在IIS7则完全提供了对于.NET的原生支持,也就是说我们可以用.NET Httpmodule/HttpHandle来捕获处理所有进站/出站的Request/Response,从而得以可以使用.NET完整控制整个Web Server的请求过程。
同时IIS7也提供了重写的原生C++支持。
从上面可以总结出来,IIS7.0下的Module/Handle可以通过.NET以及C++两种方式来编写,如果说两者之间有什么差异的话,那当然是原生的C++能处理的粒度更细微以及性能更好,总体上来说,差异并不大。
微软也建议在IIS7下不要再编写ISAPI,因为Module/Handle设计的架构更完备,他就是用来取代历史的ISAPI Filter以及ISAPI Extend的。不过有意思的是,URLScan 3.x版本竟然还是一个ISAPI,:) 。
Protecting Vulnerable Applications with IIS7
• Overview
• IIS7 Integrated Mode
• IIS7 Modules
– Request Filtering Module
– Add-on Modules (from Microsoft)
– Custom Modules
– Case Study: SPF