WAF_WL_LOG_MAX 超过时 URL 输出省略号的原因分析

这段代码用于在 URL 长度超过 WAF_WL_LOG_MAX 时,对 URL 进行截取并添加省略号。其核心逻辑是:

  1. 判断 URL 长度: 如果 URL 长度超过 WAF_WL_LOG_MAX,则进入截取逻辑。
  2. 中文字符判断: 如果 URL 包含中文字符,则会进入 for 循环,逐个判断最后三个字符是否为中文字符的起始字节。
  3. 截取和添加省略号:
    • 如果找到中文字符的起始字节,则将 URL 截取到该字节处,并添加省略号。
    • 如果没有找到中文字符的起始字节,则直接将 URL 截取到 WAF_WL_LOG_MAX 长度,并添加省略号。

为什么超过 WAF_WL_LOG_MAX,out_url 输出没有省略号内容?

如果超过 WAF_WL_LOG_MAX 时,URL 中没有中文字符,那么就不会进入 for 循环内部,直接执行下面的代码,将 URL 拷贝到 out_url 中,并在其末尾添加省略号。所以在这种情况下,out_url 输出会有省略号。

但是如果 URL 中包含中文字符,for 循环内部会判断最后三个字符是否为中文字符的起始字节,如果是,则将 URL 截取到这个位置,并在末尾添加省略号。但是如果最后三个字符不是中文字符的起始字节,那么就会继续循环,直到找到一个中文字符的起始字节为止。如果没有找到,就会执行下面的代码,将 URL 拷贝到 out_url 中,并在其末尾添加省略号。所以在这种情况下,out_url 输出也会有省略号。

总结:

当 URL 长度超过 WAF_WL_LOG_MAX 时,代码会根据 URL 中是否存在中文字符,以及中文字符在 URL 中的位置,来决定是否截取 URL,并添加省略号。只有当 URL 中没有中文字符,或者中文字符的位置不在最后三个字节内时,out_url 输出才会没有省略号。

代码示例:

int i = 0;
int out_len = 0;

if (url_len > WAF_WL_LOG_MAX) {
    for (i = 1; i < 4; i++) {
        if (is_utf8_chinese_start(url[WAF_WL_LOG_MAX-i])) {
            out_len = WAF_WL_LOG_MAX-i-1;
            strlcpy(out_url, url, out_len-3);
            strcat(out_url, "...");
            WAF_DBG("\nurl 1, url : [%s]
", out_url);
            goto err;
        }
    }

    out_len = WAF_WL_LOG_MAX;
    strlcpy(out_url, url, out_len-3);
    strcat(out_url, "...");
    WAF_DBG("\nurl 2, url : [%s]
", out_url);
    goto err;
}

out_len = WAF_WL_LOG_MAX;
strlcpy(out_url, url, out_len);

err:
WAF_DBG("\nurl for log, url : [%s]
", out_url);
return 0;
WAF_WL_LOG_MAX 超过时 URL 输出省略号的原因分析

原文地址: https://www.cveoy.top/t/topic/nf4K 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录