记一次大的折腾经历
前两天想随手记一下学习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行,咦,有中文注释:

“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 这篇文章的

这段内容中,因为情况跟我类似,已经比较明确问题所在了——之前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 分流(端口复用)使用Xray+VLESS+XTLS
Xray+VLESS+XTLS+NginxSNI分流/443端口复用
Xray前置SNI分流/回落WebSocket+CDN (所查找到的,唯一讲xray前置SNI分流的,可惜需通配证书,不适合我用)

