当前位置:首页 > 技术文章 > 正文内容

记一次大的折腾经历

ivker_lee4年前 (2021-07-29)技术文章277

前两天想随手记一下学习exchange2019的知识点,就随手打开了自己博客的后台。先是看见zlog-php程序有版本升级的提示(升级到1.70),也有升级“数据库结构”的提示,没多想,就随手各都点了“升级”。然后新建完文章,保存的时候,出现错误。

然后,并发现后台首页,在“清空缓存并重新编译模块”也会出现“操作失败”的错误。在其他更换“主题”,或者重新提交“网站设置”,都会出现上述或者类似错误。一开始完全不知道怎么解决,以为是zblog-php版本随意就升级了,带来的问题,然后去zblog论坛查资料,查来查去,得到模糊的概念,以为是升级后,“主题”或者“插件”方面引起了该问题。但是各种尝试未果。后来查到通过改mysql数据库其中的zb_config表中某个ZC_DEBUG_MODE值,由“b:0”,改为“b:1”,即可打开网站的“调试模式”。然后得到了调试模式下的错误信息。如下:

(0)UNKNOWN : 非法访问 (set_exception_handler) (1.7.0.2955 (Tenet)) (Linux4.14.168; nginx1.18.0; PHP7.2.27x64; mysqli5.7.30; curl7.29.0; OpenSSL1.0.2k)
文件位置

/www/html/zb_system/function/c_system_common.php
1886        $flag = CheckHTTPRefererValid();
1887        }
1888        
1889        if (!$flag) {
1890        $zbp->ShowError(5, __FILE__, __LINE__);
1891        exit;
1892        }
1893        }
1894        
1895        /**
堆栈跟踪

请求数据

$%_GET = Array
(
    [act] => ThemeSet
)
$%_POST = Array
(
    [csrfToken] => 5cdf032a3e448ed3bd916bfc7172790b
    [theme] => default
    [style] => default
)
$%_COOKIE = Array
(
    [timezone] => 8
    [http304ok] => 1
)
引用文件

。。。。。

(以上未完全复制内容)


因为看不懂上面的内容,就把问题抛在了zblog的bbs论坛上。但zblog开发者也没能给出有效解答。

后来,又各种尝试,尝试过把网站程序恢复到最初版本(升级前的版本,有个小插曲,因为不知道升级前的版本是多少,后来无意中在数据库中查找到的),也尝试过数据库恢复(因为有升级前的备份)。(说明一下:先是下载了zblog-php 1.7之前的老版本程序,强制覆盖了网站根目录下的程序内容,然后把mysql数据库删了,innobakupex恢复了数据库,之后才查到升级前的确切版本是1.6.4)。总之,各种尝试。最后发现,用老版本1.6.4或者某个版本,彻底重装zlog-php,数据库都不恢复,还是一样的错误。这才怀疑到是网站运行环境(NGINX、MYSQL、PHP)本身的问题上来。

因为不知道具体是N、M、P哪个有问题,又由于之前系统也出过问题,想着干脆彻底重装系统吧。所以把该备份的又备份了一遍,系统重装。

重装完系统,又安装nginx、mysql(mysql一开始版本安装错了,安装了8.0,后来看到备份出来的sql文件,发现应该用5.7的,又重装了5.7)、php,把它们原本的配置文件再导回去。检查原本的配置文件,也都没觉得有问题,而且N、M、P启动运行也都正常,正打算恢复zblog-php本身,想起机器上原本还装着xray呢。那装吧。

安装完xray,导入原本的xray配置。ok,再用zblog-php 1.6.4重装网站,再恢复数据库。打开网站后台,“新建文章”-“保存”。嗯?还是出错?

(0)UNKNOWN : 非法访问 (set_exception_handler) (1.6.4.2135 (Valyria)) (Linux4.11.8; nginx1.20.1; PHP7.2.34x64; mysqli5.7.35; curl7.29.0; OpenSSL1.0.2k)
文件位置


/www/html/zb_system/function/c_system_common.php

 1661         $flag = CheckHTTPRefererValid();

 1662     }

 1663 

 1664     if (!$flag) {

 1665         $zbp->ShowError(5, __FILE__, __LINE__);

 1666         exit;

 1667     }

 1668 }

 1669 

 1670  /**



这下真的有点懵。怎么办?

然后,既然是/www/html/zb_system/function/c_system_common.php这个文件,那打开看看吧。找到1661行,咦,有中文注释:

image.png

“CSRF”检测又是个什么东西?是它引起的报错?(百度了一下CSRF检测是什么,可惜看不懂)那干脆把这整个函数注释掉,不让它起作用好了。

好了,注释完,再试,完蛋,还是报错,这回是其他文件报错了。不能把每个PHP文件对应内容都改一遍吧?改了可能网站程序都运行不起来了。还是先把c_system_common.php里的改回去。

仔细想想,“CSRF检测”既然是一种安全检测,它引起了PHP程序不能正常运行,那是什么干扰了正常的安全检测呢?对了,xray现在配置的是监听443,而且配的是vless,配置的是fallback回落,是不是它?嗯,似乎只能是它。

再仔细想想,之前用vmess+ws,网站可完全没问题。是不是自从改了vless并配了fallback后,网站就有问题了?(确实很长时间没登录网站后台了)很有可能。那既然用了vless,总不能再改回去用vmess吧?看来,只有改xray的配置了。

因为之前改xray的vless,也该的稀里糊涂的。虽然能正常fq,但还是很多不懂。既然要重改xray的配置,就去查查看看资料吧。

查翻资料的过程中,从https://lala.im/7666.html 这篇文章的

image.png

这段内容中,因为情况跟我类似,已经比较明确问题所在了——之前xray的配置,是独占443端口,然后回落,没有什么端口复用,然后引起了PHP的CSRF检测。既然这样,那nginx和xray的配置,都要大改。

改之前,明确了以后xray客户端还是要连接443(便于伪装嘛)。那么,既然xray在前端、独占443并回落的方式本身就有问题,还有什么其他方法呢?查了资料,发现最好的方法是做SNI分流。SNI分流有2种方式,一种是用nginx做,一种是用xray做。但是,xray前置做SNI分流,就需要通配的SSL证书。我申请不到啊。只能用nginx做了。


最后,根据网上的几篇文章,彻底改了nginx和xray配置,并恢复数据库后,一切正常。

Nginx和xray的配置,几乎都是抄https://www.orzlee.com/proxy/2021/04/13/nginx-sni-offload-port-multiplexing-uses-xray-vless-xtls.html  这篇文章的。但是,在测试中发现,如果按文中xray配置用的是 "b.example.com”的证书,那么客户端“allowInsecure跳过证书验证”必须是“true”。

https://lala.im/7666.html 文章中,提过伪装站是唯一必须的,所以xray配置用的也是伪装站的证书。那么,按照前者文章中的配置,仅把xray的证书换成伪装站的证书,是不是就不必开启“allowInsecure”了呢?经我测试,可行。

至此,问题全部解决。


PS:附上前面SNI相关的所有文章链接

使用Nginx进行SNI分流并完美和网站共存

Nginx SNI 分流(端口复用)使用Xray+VLESS+XTLS

通过 SNI 回落功能实现伪装与按域名分流

Xray+VLESS+XTLS+NginxSNI分流/443端口复用

Trojan 共用 443 端口方案

Xray前置SNI分流/回落WebSocket+CDN       (所查找到的,唯一讲xray前置SNI分流的,可惜需通配证书,不适合我用)

分享给朋友:

相关文章

Linux学习——Shell

Linux学习——Shell

1、bash解释器csh\ksh\bash都是shell的解释器。2、关于bash的启动和配置环境按上图的理解,正常我们需要把脚本放在开机启动,需要写入的是/etc/bashrc文件或者~/.bashrc文件。另外,关于su  username和su - username的区别(bash的交互式非登录和交互式登录式)。可以参考下图...

Centos7学习笔记(二)-基础命令(二)

Centos7学习笔记(二)-基础命令(二)

3、Linux基础命令1、date参数:-s  设置日期-d  display time described by STRING, not 'now'---用日期表示法的完整字符串(比如“1day”,“2month”,“1year”)来显示时间,但不准用“now”。实例如下:[root@ecs-ryCz8 /home/study]# date +%F -d "now" 2020-...

CentOS 7 系统优化脚本

CentOS 7 系统优化脚本

以下引用自网上内容:#!/bin/sh. /etc/rc.d/init.d/functionsexport LANG=zh_CN.UTF-8#一级菜单menu1(){        clear        cat <<eof------------------------------------...

Centos7学习笔记(九)- 基础系统优化

Centos7学习笔记(九)- 基础系统优化

本部分内容是针对运维管理过程中,为了达到规范、便捷、增强基础安全性等目的,而对初始安装的生产(也包括测试)用操作系统,做各项系统优化、规范工作。(持续更新。。。)1、做好服务器的用途规划(含IP规划)和磁盘目录(比如一般备份用的服务器,独立建立/data目录)2、如有必要,尽量做本地hosts解析;或者搭建本地dns解析服务器,所有非dns服务器dns指向该服务器。3、分组各服务器,各组指定更改yum源为不同的公网yum源(比如阿里源、163源、清华源等),如有可能,自行搭建yum源服务器,所有...

Centos7学习笔记(六)——shell编程初步

Centos7学习笔记(六)——shell编程初步

1、shell编程的一些基础a)shell编程有两类变量,                             全局变量(环境变量)——  一般指系统内置的变量,或者手动用export、declare等方式宣称,写入/etc/profile(~./bash_profile、~/bashrc、/etc/bashrc)的全局变量 ...

 Centos7学习笔记(十二)- inotify+rsync与sersync

Centos7学习笔记(十二)- inotify+rsync与sersync

1、inotify-tools的安装yum安装,安装好epel源后,yum -y install inotify-tools源码安装:wget  https://github.com/inotify-tools/inotify-tools/releases/download/3.20.2.2/inotify-tools-3.20.2.2.tar.gz tar zxvf inotify-tools-3.20.2.2.tar.gz cd inot...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。