PHP调用ftp_login报闲置10分钟断开警告但FileZilla可正常登录
问题原因
- 你使用的FTP服务器要求必须通过显式TLS加密进行身份验证和数据传输,从FileZilla的连接日志可以看到,客户端连接后第一步就执行了
AUTH TLS命令完成TLS握手,之后才提交用户名密码完成登录。 - 你的PHP脚本使用普通明文FTP的
ftp_connect函数连接服务器,没有走TLS加密流程,服务器在收到明文登录请求时会返回提示信息并拒绝登录,这个提示信息被PHP的ftp_login函数以警告的形式抛出。
解决方案
将普通明文FTP连接替换为FTP over TLS连接,同时添加对应TLS参数配置即可,修改后的参考代码如下:
$ftp_server = 'ftp.xxx.com'; $ftp_user_name = 'myusername'; $ftp_user_pass = 'mypassword'; // 用SSL加密连接代替普通明文连接 $conn_id = ftp_ssl_connect($ftp_server,21); if ($conn_id) { echo("Connected to FTP<br><br>"); } else { echo("Connection error<br>"); exit; } // 测试环境如果证书不被信任可以临时关闭校验,生产环境不推荐开启 // stream_context_set_option($conn_id, 'ssl', 'verify_peer', false); // stream_context_set_option($conn_id, 'ssl', 'verify_peer_name', false); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); if ($login_result) { // 登录成功后设置TLS传输参数,和FileZilla配置保持一致 ftp_exec($conn_id, 'PBSZ 0'); ftp_exec($conn_id, 'PROT P'); echo "登录成功<br>"; } var_dump($login_result);
注意事项
- 使用
ftp_ssl_connect需要你的PHP环境已经开启openssl扩展,未开启的话需要先修改php.ini配置启用extension=openssl。 - 生产环境建议保留SSL证书校验规则,避免出现中间人攻击风险。
内容的提问来源于stack exchange,提问作者Tarvobarros
相关产品推荐
相关产品推荐

