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

希望对您有所帮助。