libmodsecurity 作为一个库来处理我自己的网络请求
libmodsecurity as a library to process my own web requests
是否可以将 libmodsecurity 用作库并自行处理请求?我搞乱了 repo ModSecurity examples, but I cant figure out how to make it take my request. I tried with simple_example_using_c.c 中的示例,但没有成功。有人知道这是否可行吗?
#include <stdio.h>
#include <stdlib.h>
#include <modsecurity/modsecurity.h>
#include <modsecurity/rules_set.h>
char rulez[] ="basic_rules.conf";
const char *request = "" \
"GET /?test=test HTTP/\n" \
"Host: localhost:9999\n" \
"Content-Length: 27\n" \
"Content-Type: application/x-www-form-urlencoded\n";
int main(){
ModSecurity *modsec;
RulesSet *setRulez;
Transaction *transakcyja;
const char *error;
modsec = msc_init();
printf(msc_who_am_i(modsec));
msc_set_connector_info(modsec, "ModSecurity simple API");
setRulez = msc_create_rules_set();
int rulz = msc_rules_add_file(setRulez, rulez, &error);
if(rulz == -1){
fprintf(stderr, "huston rulez problem \n");
fprintf(stderr, "%s\n", error);
return -1;
}
msc_rules_dump(setRulez);
transakcyja = msc_new_transaction(modsec, setRulez, NULL);
if(transakcyja == NULL){
fprintf(stderr, "Init bad");
return -1;
}
msc_process_connection(transakcyja, "127.0.0.1", 9998, "127.0.0.1", 9999);
msc_process_uri(transakcyja, "http://127.0.0.1:9999/?k=test&test=test", "GET", "1.1");
msc_process_request_body(transakcyja);
msc_process_response_headers(transakcyja, 200, "HTTP 1.3");
msc_process_response_body(transakcyja);
msc_process_logging(transakcyja);
msc_rules_cleanup(setRulez);
msc_cleanup(modsec);
return 0;
}
编辑:我现在知道了更多,但是,有人知道如何将请求传递给交易吗?我知道有 addRequestHeader() 但它当时需要一个 header,我真的弄不明白。
我认为您必须了解 ModSecurity 的工作原理。
所有交易有五个阶段:
- 解析请求headers
- 解析请求body
- 解析响应headers
- 解析响应body
- 制作日志(并检查交易变量,例如异常分数(在 CRS 的情况下))
(加上阶段 0:处理连接本身。)
在示例中,您可以看到每个阶段的几个函数。
这是一个常见的 HTTP 请求:
POST /set.php HTTP/1.1
Host: foobar.com
User-Agent: something
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
a=1&b=2
现在,如果您已经创建了一个交易 object,您必须向其中添加阶段数据。
首先查看状态行,并添加必要的部分 - 考虑您的应用程序已经具有信息,如客户端 IP (std::string cip
)、端口 (int cport
) 和服务器 IP (std::string dip
),端口(int dport
)。您还拥有 URI (std::string uri
)、方法 (std::string method
) 和协议版本 (std::string vers
)。您还需要一个类型为 modsecurity::ModSecurityIntervention *it
.
的 object
// phase 0
trans->processConnection(cip.c_str(), cport, dip.c_str(), dport);
trans->processURI(uri.c_str(), method.c_str(), vers.c_str());
trans->intervention(it);
现在您必须检查 it
变量,例如。 it.status
。有关详细信息,请查看 source.
现在假设您有一个变量(列表),其中包含已解析的 headers。现在你必须将这些 headers 一一添加到交易中:
for(your_iterator it=headerType.begin(); it != headerType.end(); ++it) {
const std::string key = it->first.as<std::string>(); // key
const std::string val = it->second.as<std::string>(); // val
trans->addRequestHeader(key, val);
}
现在您可以处理 headers 并检查结果。请注意,如果您处理一个阶段,引擎会评估所有规则,其中 phase
值是相关的:1、2、3、4 或 5。
// phase 1
trans->processRequestHeaders();
trans->intervention(it);
在接下来的步骤中,您必须添加请求 body 并处理它,然后得到响应 headers 和 body (来自上游),并重复上述步骤...
希望您现在可以了解它是如何工作的。
我制作了一个实用程序,它运行 CRS test cases on libmodecurity3 while it uses CRS rules. The tool available here: ftwrunner。
希望对您有所帮助。
是否可以将 libmodsecurity 用作库并自行处理请求?我搞乱了 repo ModSecurity examples, but I cant figure out how to make it take my request. I tried with simple_example_using_c.c 中的示例,但没有成功。有人知道这是否可行吗?
#include <stdio.h>
#include <stdlib.h>
#include <modsecurity/modsecurity.h>
#include <modsecurity/rules_set.h>
char rulez[] ="basic_rules.conf";
const char *request = "" \
"GET /?test=test HTTP/\n" \
"Host: localhost:9999\n" \
"Content-Length: 27\n" \
"Content-Type: application/x-www-form-urlencoded\n";
int main(){
ModSecurity *modsec;
RulesSet *setRulez;
Transaction *transakcyja;
const char *error;
modsec = msc_init();
printf(msc_who_am_i(modsec));
msc_set_connector_info(modsec, "ModSecurity simple API");
setRulez = msc_create_rules_set();
int rulz = msc_rules_add_file(setRulez, rulez, &error);
if(rulz == -1){
fprintf(stderr, "huston rulez problem \n");
fprintf(stderr, "%s\n", error);
return -1;
}
msc_rules_dump(setRulez);
transakcyja = msc_new_transaction(modsec, setRulez, NULL);
if(transakcyja == NULL){
fprintf(stderr, "Init bad");
return -1;
}
msc_process_connection(transakcyja, "127.0.0.1", 9998, "127.0.0.1", 9999);
msc_process_uri(transakcyja, "http://127.0.0.1:9999/?k=test&test=test", "GET", "1.1");
msc_process_request_body(transakcyja);
msc_process_response_headers(transakcyja, 200, "HTTP 1.3");
msc_process_response_body(transakcyja);
msc_process_logging(transakcyja);
msc_rules_cleanup(setRulez);
msc_cleanup(modsec);
return 0;
}
编辑:我现在知道了更多,但是,有人知道如何将请求传递给交易吗?我知道有 addRequestHeader() 但它当时需要一个 header,我真的弄不明白。
我认为您必须了解 ModSecurity 的工作原理。
所有交易有五个阶段:
- 解析请求headers
- 解析请求body
- 解析响应headers
- 解析响应body
- 制作日志(并检查交易变量,例如异常分数(在 CRS 的情况下))
(加上阶段 0:处理连接本身。)
在示例中,您可以看到每个阶段的几个函数。
这是一个常见的 HTTP 请求:
POST /set.php HTTP/1.1
Host: foobar.com
User-Agent: something
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
a=1&b=2
现在,如果您已经创建了一个交易 object,您必须向其中添加阶段数据。
首先查看状态行,并添加必要的部分 - 考虑您的应用程序已经具有信息,如客户端 IP (std::string cip
)、端口 (int cport
) 和服务器 IP (std::string dip
),端口(int dport
)。您还拥有 URI (std::string uri
)、方法 (std::string method
) 和协议版本 (std::string vers
)。您还需要一个类型为 modsecurity::ModSecurityIntervention *it
.
// phase 0
trans->processConnection(cip.c_str(), cport, dip.c_str(), dport);
trans->processURI(uri.c_str(), method.c_str(), vers.c_str());
trans->intervention(it);
现在您必须检查 it
变量,例如。 it.status
。有关详细信息,请查看 source.
现在假设您有一个变量(列表),其中包含已解析的 headers。现在你必须将这些 headers 一一添加到交易中:
for(your_iterator it=headerType.begin(); it != headerType.end(); ++it) {
const std::string key = it->first.as<std::string>(); // key
const std::string val = it->second.as<std::string>(); // val
trans->addRequestHeader(key, val);
}
现在您可以处理 headers 并检查结果。请注意,如果您处理一个阶段,引擎会评估所有规则,其中 phase
值是相关的:1、2、3、4 或 5。
// phase 1
trans->processRequestHeaders();
trans->intervention(it);
在接下来的步骤中,您必须添加请求 body 并处理它,然后得到响应 headers 和 body (来自上游),并重复上述步骤...
希望您现在可以了解它是如何工作的。
我制作了一个实用程序,它运行 CRS test cases on libmodecurity3 while it uses CRS rules. The tool available here: ftwrunner。
希望对您有所帮助。