Apache与Resin组合暴露源代码的分析及解决方案

Apache与Resin组合暴露源代码的分析及解决方案

Apache 2.0.54 与 Resin 3.0.13 整合完成了,也能顺利解释jsp。但是如果resin因故障死掉,Apache会把Jsp的源文件输出到Browser出来。

开始以为是 Resin Bug 或者是 Resin 与 Apache 版本冲突,测试了各种不同的版本,均有这个问题。

试图通过Apache的配置文件httpd.conf禁止客户直接浏览.jsp文件,也找不到解决办法。

只好把目光盯在mod_caucho.so上了。

经过几天的通宵鏖战(本人是Liunx新手兼C新手,所以效率很低),对mod_caucho.so的源代码(resin-pro-3.0.13\modules\c\src\)进行了一番分析,初步明白了mod_caucho.so工作原理。

Apache的配置文件载入mod_caucho.so模块,并且定义Resin主机和端口
    LoadModule caucho_module /usr/local/apache/modules/mod_caucho.so
    ResinConfigServer localhost 6802
    CauchoStatus yes
   
mod_caucho.so就开始工作了,mod_caucho.so是怎么工作的呢?好像工作方式有点烂。

mod_caucho.so被apache载入后,会利用HOOK截获Apache的所有http请求,mod_caucho.so取得http请求后,马上连接Resin服务,如果可以连上Resin服务,mod_caucho.so会从Resin服务上取得某些配置信息,即resin可以处理哪些文件或路径,如:xtp,jsp,jspx,WEB-INF等。

接着mod_caucho.so会把客户请求URL和Resin配置信息进行比较,如果相符,mod_caucho.so把客户请求转交给Resin服务处理,如果不符,就把
请求返回给apache处理了。

如果连不上Resin服务,就无法取得相应的配置信息了。mod_caucho.so对客户请求URL和Resin配置信息比较的时候,会把jsp请求拒之门外,直接返回给Apache。

似乎mod_caucho.so对Resin配置信息有短时间的缓存,比如Resin死掉或者停掉的短时间内,mod_caucho.so还是会把jsp请求提交给Resin处理,由于此时Resin已经停止服务,所以浏览器上会出现下列字样

Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

但稍后一点时间(一两分钟内),mod_caucho.so就没有Resin配置信息了,也就会把所有的jsp请求返回给Apache。

Apache本身不能解析jsp,只好把jsp源文件作为普通文档返回给Browser了。

是不是觉得mod_caucho.so设计得很烂啊,这种东西居然还要卖钱。

干吗不能直接从conf配置文件取得相关信息,或者在httpd.conf中指定解析文件类型,还要每次从Resin服务上去取。既然可以在httpd.conf中指定
    ResinConfigServer localhost 6802
    CauchoStatus yes
为什么不再加几行,强制某些类型的请求由Resin处理,并禁止由Apache处理。
(我不知道mod_caucho.so是否已经具备上述功能噢,如果具备,请高手指正,拜谢)

能不能改写mod_caucho.so源代码呢,改成让mod_caucho.so直接从文件读取,或者在httpd.conf中定义或者把Resin可解析哪些文档的信息直接定义程序里面(这样最简单),mod_caucho.so取得客户请求后,不用先去连接Resin服务,直接比较是否属于resin处理范围,如果不是返回给apache处理,如果属于resin处理范围,并且可以连上resin服务,那么交给Resin处理,如果属于resin处理范围,但是不能连上resin服务,就给浏览器返回一个简单的提示。

改写mod_caucho.so源代码的工作就请哪位 Liunx C 高手来完成吧!

本人两天只分析了部分mod_caucho.so源代码,是新手,效率很低。

mod_caucho.so源代码主要文件
resin-pro-3.0.13\modules\c\src\apache2\mod_caucho.c
resin-pro-3.0.13\modules\c\src\common\config.c
resin-pro-3.0.13\modules\c\src\common\stream.c

关键函数
mod_caucho.c:
static int cse_dispatch(request_rec *r)

config.c:
resin_host_t * cse_match_request(config_t *config, const char *host, int port, const char *uri, int unescape, time_t now)
static resin_host_t * cse_is_match(config_t *config, const char *raw_host, int port, const char *raw_uri, int unescape, time_t now)
我也遇到这个问题,汗!!!
现在被人骂死~~!!!
字体设置的太大!
看得累!
楼猪把字改小点儿...
把jsp目录和html分开目录存放,没有这个问题
我试了半天,在windows下和linux下都可以避免这个问题啊。
应该是你的配置有问题。

我的配置如下:
LoadModule caucho_module /usr/local/apache2/modules/mod_caucho.so
<IfModule mod_caucho.c>
ResinConfigServer localhost 6802
CauchoConfigCacheDirectory /tmp
</IfModule>

IfModule 好像得有