基于nginx的waf方案naxsi源码理解(6)_策略处理

这篇具有很好参考价值的文章主要介绍了基于nginx的waf方案naxsi源码理解(6)_策略处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文档说明

这里的策略处理以读取MainRule策略为例。
以naxsi_core.rules的首条策略做示例:

MainRule "rx:select|union|update|delete|insert|table|from|ascii|hex|unhex|drop|load_file|substr|group_concat|dumpfile" "msg:sql keywords" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1000;

MainRule配置文件处理过程

处理入口

/* command handled by the module */
static ngx_command_t ngx_http_naxsi_commands[] = {
  /* BasicRule (in main) */
  { ngx_string(TOP_MAIN_BASIC_RULE_T),
    NGX_HTTP_MAIN_CONF | NGX_CONF_1MORE,
    ngx_http_naxsi_read_main_conf,          // 当读到以TOP_MAIN_BASIC_RULE_T,即MainRule开头配置时,就会调用该函数去解析
    NGX_HTTP_MAIN_CONF_OFFSET,
    0,
    NULL },

ngx_http_naxsi_read_main_conf函数

如何读入配置策略信息

  value = cf->args->elts;   // nginx已读取的策略内容
  /* parse the line, fill rule struct  */

  NX_LOG_DEBUG(_debug_main_conf, NGX_LOG_EMERG, cf, 0, "XX-TOP READ CONF %s", value[0].data);
  // 无 MainRule 和 basic_rule 任何策略,退出
  if (ngx_strcmp(value[0].data, TOP_MAIN_BASIC_RULE_T) &&
      ngx_strcmp(value[0].data, TOP_MAIN_BASIC_RULE_N)) {
    ngx_http_naxsi_line_conf_error(cf, value);
    return (NGX_CONF_ERROR);
  }

value 的内容通过gdb调试输入如下:

(gdb) p value[0]
$1 = {len = 8, data = 0x7a0cc0 "MainRule"}
(gdb) p value[1]
$2 = {len = 107, data = 0x7a0cc9 "rx:select|union|update|delete|insert|table|from|ascii|hex|unhex|drop|load_file|substr|group_concat|dumpfile"}
(gdb) p value[2]
$3 = {len = 16, data = 0x7a0d35 "msg:sql keywords"}
(gdb) p value[3]
$4 = {len = 36, data = 0x7a0d46 "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"}
(gdb) p value[4]
$5 = {len = 8, data = 0x7a0d6b "s:$SQL:4"}
(gdb) p value[5]
$6 = {len = 7, data = 0x7a0d74 "id:1000"}
(gdb) p value[6]
$7 = {len = 0, data = 0x0}

ngx_http_naxsi_cfg_parse_one_rule // 策略分析函数

ngx_http_naxsi_cfg_parse_one_rule函数主要部分:
看这部分前,请先看先看下下面rule_parser的定义:

  // check each word of config line against each rule
  // nb_elem为数组value的长度
  for (i = 1; i < nb_elem && value[i].len > 0; i++) {
    valid = 0;
    for (z = 0; rule_parser[z].pars; z++) {
      ngx_http_naxsi_parser_t* np = &rule_parser[z];
      /*
        如:当value[i].data 为 "id:1000" 与 np->prefix 为 "id:"的前缀相等时,则调用 ret = np->pars(cf, &value[i], current_rule);
         即 naxsi_id 做"id:1000"这部分策略的解析
      */
      if (!ngx_strncmp(value[i].data, np->prefix, np->prefix_len)) {    

        ret = np->pars(cf, &value[i], current_rule);
        if (ret != NGX_CONF_OK) {
          NX_LOG_DEBUG(_debug_cfg_parse_one_rule,
                       NGX_LOG_EMERG,
                       cf,
                       0,
                       "XX-FAILED PARSING '%s'",
                       value[i].data);
          return (ret);
        }
        valid = 1;
      }
    }
    return_value_if(!valid, NGX_CONF_ERROR);
  }

先看下rule_parser的定义:

/*

MainRule “rx:select|union|update|delete|insert|table|from|ascii|hex|unhex|drop|load_file|substr|group_concat|dumpfile” “msg:sql keywords” “mz:BODY|URL|ARGS| H E A D E R S V A R : C o o k i e " " s : HEADERS_VAR:Cookie" "s: HEADERSVAR:Cookie""s:SQL:4” id:1000;

如上策略的每一部分都有对应的处理
*/
static ngx_http_naxsi_parser_t rule_parser[] = {
  { ID_T, const_len(ID_T), naxsi_id },                                // id:1000 部分的处理    
  { SCORE_T, const_len(SCORE_T), naxsi_score },                       // "s:$SQL:4" 部分的处理
  { MSG_T, const_len(MSG_T), naxsi_msg },                             // "msg:sql keywords" 部分的处理
  { RX_T, const_len(RX_T), naxsi_rx },                                // "rx:select|union| 部分的处理
  { STR_T, const_len(STR_T), naxsi_str },                             // 如果不是正则,即不是"rx: 开头,是str: 开头的话则调用naxsi_str函数做处理
  { LIBINJ_XSS_T, const_len(LIBINJ_XSS_T), naxsi_libinj_xss },        
  { LIBINJ_SQL_T, const_len(LIBINJ_SQL_T), naxsi_libinj_sql },
  { MATCH_ZONE_T, const_len(MATCH_ZONE_T), naxsi_zone },
  { NEGATIVE_T, const_len(NEGATIVE_T), naxsi_negative },
  { WHITELIST_T, const_len(WHITELIST_T), naxsi_whitelist },
  { NULL, 0, NULL }
};

策略每部分的解析函数,如 naxsi_id:

void*
naxsi_id(ngx_conf_t* r, ngx_str_t* tmp, ngx_http_rule_t* rule)
{
  rule->rule_id = atoi((const char*)tmp->data + strlen(ID_T));
  return (NGX_CONF_OK);
}

ngx_http_naxsi_read_main_conf函数的后半部分

通过上面分析完策略后,下面就是对

ngx_http_naxsi_main_conf_t* alcf = conf;

结构体的填充,依据匹配区域的压缩到结构体ngx_http_naxsi_main_conf_t定义的动态数组中,也即用户自定义的数据结构conf
如:文章来源地址https://www.toymoban.com/news/detail-595143.html

  if (rule.br->headers || rule.br->headers_var) {
    NX_LOG_DEBUG(
      _debug_main_conf, NGX_LOG_EMERG, cf, 0, "pushing rule %d in header rules", rule.rule_id);
    if (alcf->header_rules == NULL) {
      alcf->header_rules = ngx_array_create(cf->pool, 2, sizeof(ngx_http_rule_t));    // nginx的动态数组实现
      if (alcf->header_rules == NULL)
        return NGX_CONF_ERROR; /* LCOV_EXCL_LINE */
    }
    // 返回指向新增加元素的指针,即 alcf->header_rules  == rule_r
    rule_r = ngx_array_push(alcf->header_rules);      // nginx的动态数组实现, push时,当空间不够时,会自动扩容动态数组空间
    if (!rule_r)
      return (NGX_CONF_ERROR); /* LCOV_EXCL_LINE */
    memcpy(rule_r, &rule, sizeof(ngx_http_rule_t));
  }

到了这里,关于基于nginx的waf方案naxsi源码理解(6)_策略处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是WAF?WAF的作用?常用的WAF解决方案有哪些?

    WAF是Web应用程序防火墙(Web Application Firewall)的缩写。它是一种网络安全设备或服务,用于保护Web应用程序免受恶意攻击和漏洞利用。 WAF工作原理是通过监控、过滤和阻止对Web应用程序的恶意请求来提供安全保护。它位于Web应用程序和用户之间,作为一道防线,分析进入和离

    2024年02月17日
    浏览(25)
  • Python高频交易策略:基于交易成本模型的优化方案

    随着金融市场的复杂性和竞争的加剧,高频交易已成为金融市场中非常重要的一环。Python作为一种高效、易用、流行的编程语言,越来越受到期货、外汇交易策略程序化交易领域的欢迎。本文将介绍如何通过交易成本模型来优化Python高频交易策略。 一、什么是交易成本模型

    2024年02月12日
    浏览(30)
  • 使用Nginx+Lua实现自定义WAF(Web application firewall)

    WAF 使用Nginx+Lua实现自定义WAF(Web application firewall) 功能列表: 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。 支持URL白名单,将不需要过滤的URL进行定义。 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。 支持CC攻击防护,单个URL指定时

    2024年02月11日
    浏览(25)
  • JVM:全面理解线上服务器内存溢出(OOM)问题处理方案(一)

    前段时间生产上遇到了OOM问题,导致服务出现了短时间的不可用,还好处理及时,否则也将酿成大祸。OOM问题也是生产中比较重要的问题,所以本期我们针对OOM问题特别讲解,结合理论与实际案例来带大家彻底攻克OOM问题处理。 要解决问题,我们首先要清楚问题产生的原因。

    2024年02月12日
    浏览(32)
  • apache和nginx的TLS1.0和TLS1.1禁用处理方案

    TLS协议其实就是网络安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性,TLS 1. 0 和TLS 1. 1 是分别是96 年和 06 年发布的老版协议。 TLS1.0和TLS1.1协议使用的是弱加密算法,比如DES、SHA-1、MD5、RC4等。比较容易受攻击,目前新版本的TLS协议已经更新到TLS1.2、

    2024年02月16日
    浏览(28)
  • 线上项目源码安全性处理方案

    场景: 最近项目提出要对线上代码进行安全性处理,防止客户直接通过反编译工具将代码反编译出来 方案: 第一种方案使用的是代码混淆 第二种方案使用的是代码加密 方案比较 方案一:采用的proguard-maven-plugin插件 方案二:采用的classfinal-maven-plugin插件 在单模块中方案一还

    2024年02月04日
    浏览(25)
  • nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理

    提示:本人在生产部署服务时遇到一系列跨域问题和https配置问题,特此做以下记录: 跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了

    2024年02月02日
    浏览(38)
  • docker上面部署nginx-waf 防火墙“modsecurity”,使用CRS规则,搭建WEB应用防火墙

    web防火墙(waf)免费开源的比较少,并且真正可以商用的WAF少之又少,modsecurity 是开源防火墙鼻祖并且有正规公司在维护着,目前是https://www.trustwave.com在维护,不幸的是2024 年 7 月将不再维护交还开源社区管理,Trustwave目前打造自己的web防火墙,至于是否免费开源就不得而知

    2023年04月21日
    浏览(27)
  • (9-3)基于深度强化学习的量化交易策略(OpenAI Baselines +FinRL+DRL+PyPortfolioOpt):数据预处理

    1.1.6  数据预处理 数据预处理是训练高质量机器学习模型的关键步骤,在这一步需要检查缺失数据并进行特征工程,以将数据转换为适合模型训练的状态。本项目的数据预处理江湾城以下工作: 添加技术指标:在实际交易中,需要考虑各种信息,例如历史股价、当前持仓股票

    2024年01月25日
    浏览(33)
  • 鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

    【找到了一种简单易懂的实验实现方式,适合基础较薄弱的同学,见第二部分】 最终效果如下: 依次创建了3个任务线程,以One、Two、Three指代,时间分别为15秒、30秒、10秒。 如果按生成顺序输出应该是:One-Two-Three,但我们修改了OsPriQueueEnqueue函数,由原先的“先进先出”,

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包