· 本文地址: http://www.laruence.com/2008/04/09/112.html
· 轉載請註明出處
還是和論文相關,要編寫一個Apache的模塊,掛在post read_request階段,在第一時間,判斷一個鏈接是否是而已連接請求,並在第一時間拒絕惡意連接請求。
首先遇到的第一個問題,就是需要從http.conf中讀取配置信息,提供倆個配置指令,MaxNumber, TimeRange.指定在一段時間內的連接次數上限。
編寫的時候,遇到的第一個問題就是,moudule申明,不能通過編譯,編譯器提示重複定義。查了N遍手邊的apache源碼分析,也沒有找到原因,如:
module door_module;
......
module MODULE_VAR_EXPORT door_module = {
STANDARD_MODULE_STUFF,
NULL,
NULL,
NULL,
create_door_config,
NULL,
door_cmds,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
door_authorization,
};
最後,刪除掉第一個module申明, 通過編譯。
遇到的第二個問題,就是命令表中的命令處理函數在http_config.h中的定義如下:
這倆個問題這麼糊塗的解決以後,接下來的工作就很簡單了。
首先在server config階段,初始化我們的全局配置結構。
int MaxNumber;
int TimeLimit;
}mod_door_config;
static void * create_door_config(pool *p, server_rec * s){
mod_door_config * cf = static_cast<mod_door_config *>(ap_palloc(p, sizeof(mod_door_config)));
cf->MaxNumber = 100;
cf->TimeLimit = 60;
return cf;
}
{"MaxRequest", maxRequest, NULL, RSRC_CONF|ACCESS_CONF, TAKE1, "Can't get MaxRequest"},
{"TimeRange", timeRange, NULL, RSRC_CONF|ACCESS_CONF, TAKE1, "Cant' get Time Range"},
{NULL}
};
server_rec * s = cmd->server;
mod_door_config *cf = static_cast<mod_door_config *>(ap_get_module_config(s->module_config, &door_module));
cf->MaxNumber = atoi(arg);
//cerr<<cf->MaxNumber<<endl;
return NULL;
}
static const char * timeRange(cmd_parms *cmd, void * dconf, const char * arg){
server_rec * s = cmd->server;
mod_door_config *cf = static_cast<mod_door_config *>(ap_get_module_config(s->module_config, &door_module));
cf->TimeLimit = atoi(arg);
//cerr<<cf->TimeLimit<<endl;
return NULL;
}
cerr << r->connection->remote_ip<<endl;
mod_door_config * cf = static_cast<mod_door_config *>(ap_get_module_config(r->server->module_config, &door_module));
//ap_rprintf(r ,"your IP : %s ", r->connection->remote_ip);
//ap_rprintf(r ,"MaxNumber : %d ", cf->MaxNumber);
//ap_rprintf(r ,"TimeRange : %s ", cf->TimeLimit);
//cerr<<cf->MaxNumber<<endl;
return OK;
}
先寫這麼多,等我慢慢研究這些遺留問題,留待以後補充。
ps: 看源代碼,是最快的學習方法。