使用包含 @ 的密码使用 PHP 连接到 FTP

Fre*_*ein 1 php ftp special-characters

我有以下问题:

我需要连接到 FTP 并读取一个 CSV 文件。主要问题是它的密码有@、$、%...我如何连接特殊字符?我尝试了以下几种连接方式:

文件打开

$filename = 'ftp://user:p@s($word@ftp.myftp.url/file.csv'; 
$handle = fopen($filename, "r") or die("Error");
Run Code Online (Sandbox Code Playgroud)

FTP登录

$ftp_server = "ftp.myftp.url/file.csv";
$ftp_user = "user";
$ftp_pass = "p@s($word";
$conn_id = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");
$login_result = ftp_login($ftp_server, $ftp_user, $ftp_pass) or die("Could not connect to 2");
$data = file_get_contents('ftp.myftp.url/file.csv');
Run Code Online (Sandbox Code Playgroud)

感谢大家!

Mar*_*ryl 5

您的两段代码有两个不同的问题。


文件打开

$filename = 'ftp://user:p@s($word@ftp.myftp.url/file.csv'; 
$handle = fopen($filename, "r") or die("Error"); 
Run Code Online (Sandbox Code Playgroud)

在这里,问题是,正如您所猜测的那样,因为它在URL 语法@中具有含义(作为凭据和主机名之间的分隔符)。

您必须将 URL@编码为%40

$filename = 'ftp://user:p%40s($word@ftp.myftp.url/file.csv'; 
Run Code Online (Sandbox Code Playgroud)

您提到实际密码也有%. 必须将其URL 编码%25.


FTP登录

$ftp_server = "ftp.myftp.url/file.csv";
$ftp_user = "user";
$ftp_pass = "p@s($word";
$conn_id = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");
$login_result = ftp_login($ftp_server, $ftp_user, $ftp_pass) or die("Could not connect to 2");
Run Code Online (Sandbox Code Playgroud)

这里,问题不在于@,因为不涉及 URL(两者都不%是问题)。在这里,问题是$, 因为您使用的是双引号,所以$word被替换为(可能未定义)变量的值word,有效地使密码成为p@s(唯一。

使用单引号以避免$被解释为变量:

 $ftp_pass = 'p@s($word';
Run Code Online (Sandbox Code Playgroud)

或者使用以下$命令逃避\

 $ftp_pass = "p@s(\$word";
Run Code Online (Sandbox Code Playgroud)