用户密码正确情况下,nginx转发执行PHP报用户名密码不对

首页    知识库    常见问题    用户密码正确情况下,nginx转发执行PHP报用户名密码不对

问题现象

php通过pdo接口,用odbc连接yashandb,代码如下图:

image2024-9-19_15-59-21

 

报错如下图:

image2024-9-19_14-45-53

image2024-9-19_14-47-33

 

问题的风险及影响

odbc连接失败,影响业务

 

问题影响的版本

23.2.3.100及之后版本

 

问题发生原因

yasdb升级到23.2.3.100之后,需要1.1.1l的openssl版本,否则加载libcrypto.so加载不了

 

解决方法及规避方式

yashandb-client包有ibcrypto.so,直接把client包放到LD_LIBARAY_PATH前面,先加载client包的库即可。

sudo vi /etc/sysconfig/php-fpm 修改path,把/lib目录去掉即可,如下图:

image2024-9-19_15-51-0

 

之后显示正常:

image2024-9-19_16-1-10

 

问题分析和处理过程

本地复现成功,分析yasdb报错过程:

clear_env=no已打开

php环境变量已添加

1、正常情况下,传到yasdb的密码已加密,yasdb解密后,pwd是正确的密码。

image2024-9-19_14-56-23

 

2、有报错情况下,发现传到yasdb的密码没有加密,yasdb解密后,pwd是乱码,导致报错。

image2024-9-19_14-55-0

分析odbc发送端,发现正常情况下,yasconnect在发送前,会调用加密接口,而报错的情况则没有调用该接口,如下图,从而定位到同encrypt加密相关。

image2024-9-19_14-59-30

本地环境虽然安装了openssl 1.1.1l,但是/lib64目录下还存在1.1.1k版本的库,替换掉即可解决问题。

yasdb加载的是openssl 1.1.1l版本,但是php使用的却是/lib64目录下的1.1.1k版本的库,导致问题出现。

image2024-9-19_15-24-42

image2024-9-19_15-26-8

 

openssl 1.1.1l的库放到了ld.so.conf中,比LD_LIBRARY_PATH 后加载,比/lib64先加载,导致的问题。

动态库加载优先级:

在 Linux 系统中,动态库的加载优先级可以由多个因素决定,包括:

1、LD_LIBRARY_PATH 环境变量:如果在环境变量 LD_LIBRARY_PATH 中指定了一个库文件的路径,那么在这个路径中找到的库文件将会被优先加载。

2、程序的 RPATH 属性:如果程序在编译时设置了 RPATH 属性,则会优先搜索 RPATH 中指定的路径来加载库文件。

3、系统的加载路径:在 /etc/ld.so.conf 文件中定义的路径,以及在 /etc/ld.so.conf.d 目录中的路径,都会被用来搜索库文件。

4、系统的默认加载路径:在大多数 Linux 系统中,/lib 和 /usr/lib 目录都是默认的加载路径,因此如果在这些目录中找到了库文件,就会被加载。

注意,上述加载优先级是相对的,也就是说,如果在 LD_LIBRARY_PATH 中找到了库文件,则不会再搜索 RPATH 和其他路径。另外,如果在 RPATH 中找到了库文件,则不会再搜索其他路径。

 

相关问题单

nginx转发执行PHP报错用户名和密码错误

浏览量:0