• 去年夏天

    图片

    你把宝塔升级到正式版13.0后,基本 Nginx 免费防火墙面板里所有涉及日志显示部分的功能都会是类似上图的效果,一堆 undefined,涉及对应项的按钮一点就报错。

    简而言之就是宝塔这货呢,把面板(和里面插件扩展)的运行环境从从3.7.9升级到3.13.14了。

    众所周知 Python 3.8 和 3.12这两个版本都和前边的版本做了比较大的修改。

    但是很多面板里的扩展并没有更随升级,导致故障。

    其中免费Nginx防火墙8.3就是个典型例子。鉴于这个东西还算好用(总比裸奔强),挺多人也在用,原作者已经消失多年,官方也明确表示不管三方软件的适配了,于是和AI一起把他修了一下,将免费Nginx防火墙8.3升级到兼容 python 3.13 了。

    宝塔 Nginx 免费防火墙 8.3 修复补丁

    - 补丁下载地址:蓝奏云

    - 安装步骤:

    - 先备份 /www/server/panel/plugin/free_waf 路径下的 free_waf_main.py 与 fail2ban_main.py 文件。

    - 用压缩包里的 free_waf_main.py 与 fail2ban_main.py,替换掉 /www/server/panel/plugin/free_waf 路径下的同名文件。

    - 刷新宝塔面板的 Nginx 免费防火墙页面,确认日志不再显示 undefined,封锁历史和 webshell 查杀结果恢复正常。

    搞定,收工,Nginx 免费防火墙 8.3 (其实8.2版也能用这个补丁)已经可以在 Python 3.13 环境下正常工作了。

    图片

    修复补丁具体改了什么

    其实主要就是两条:

    • Python 3.13 彻底移除了整个 cgi 标准库,而免费Nginx防火墙8.3代码依赖 cgi 解析日志数据,所以在系统环境升级到 Python 3.13 后就开始大量报错。 补丁从cgi改成用标准库 html.escape。```

    #原始代码
    import cgi
    text2 = cgi.escape(str_convert, quote=True)
    tmp_data = json.loads(cgi.escape(line))

    #修复后代码
    import html
    text2 = html.escape(str_convert, quote=True)
    tmp_data = json.loads(html.escape(line, quote=False))
    ``- 规范正则表达式 Raw 字符串前缀,原始代码里充斥着大量这样的写法``
    rep_ip = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}($|[\/\d]+$)"
    rep = "\nPort\s+(\d+)"
    if re.search("\d+.\d+.\d+.\d+-\d+.\d+.\d+.\d+$", i):
    ``这样写在python3.11及以下版本是不会显性报错的,但这确实是错误的写法, \d、\s、\w 是正则表达式的转义语法,不是 Python 的字符串转义语法。对 Python 而言,这些都是非法的转义字符,只不过 Python3.11 以下版本不会直接报错,而是进入容错回退机制,原样保留反斜杠和后面的字符继续传递,所以之前不会显式报错。但到了3.13就完犊子了。 补丁统一增加了 r""` 前缀,告知解析器(后面的正则)是个 Raw 字符串。

    其余基本都是原始代码被AI审计后的小毛病修复,类似统一 API 返回方法大小写啊、日志返回容错与防白屏、防御性编程啊、接口空指针崩溃啊、 换行符判断失效的小问题。

    主楼
  • afff

    宝塔在8月份已经修复这个了

    #1
  • 宝塔面板

    该问题实测8.4版本已修复,可以更新插件版本解决

    #2

发表回复

登录后回复