我想使用PHP连接到FTP以上传生成的报告。对于远程服务器,FTP必须处于活动模式。
这是我的代码:
ini_set('display_errors', '1');
error_reporting(E_ALL);
$conn_id = ftp_connect('myftpserver.com', 21);
if($conn_id)
{
// login with username and password
$login_result = ftp_login($conn_id, 'mysuer', 'password');
$passive = ftp_pasv($conn_id,FALSE);
echo "is active?<br/>";
var_dump($passive);
echo 'Login Result:';
var_dump($login_result);
$files_list = ftp_nlist($conn_id, '/MyFolder/');
echo "<br/>files list ";
var_dump($files_list);
}
else
{
var_dump('Unable to connect to FTP Server');
}
当我从本地计算机或普通共享服务器运行它时,我可以获取列表,但是无法从我的AWS AMI实例运行脚本。为了进行测试,我什至也打开了所有入站流量。仍然没有运气。另外,要点是,如果我尝试使用其他一些ftp详细信息,则可以得到ftp_nlist
的响应。但不是这个。到目前为止,我已经在3个AWS实例上进行了尝试。产生了相同的结果。
我只能说这是服务器安全组/防火墙存在的问题。但无法弄清楚。请帮忙。
我从服务器获得的响应:
is active
bool(true)
Login Result:bool(true)
files list bool(false)
答案 0 :(得分:3)
在AWS安全组中使用FTP活动模式存在问题。
要使活动模式工作,必须打开1023以上的所有入站端口。如果客户端支持限制范围,请这样做。您还需要同时打开端口20和端口21的入站和出站。
问题是FTP客户端选择了它将侦听的端口。然后,FTP客户端将此端口号通知FTP服务器。 FTP服务器然后连接到该端口。这违反了正常的AWS安全组设计,这意味着仅允许打开特定端口。您可以通过临时打开所有端口,测试您的FTP客户端,然后关闭所有端口来验证这一点。
活动模式对于FTP客户端不安全。被动模式对于FTP服务器并不安全(但更好的选择)。
注意:经常轮换您的FTP凭据。您的登录名和密码以明文形式发送,未加密。
FTP是一项仍然很流行的传统技术,应将其存储在阁楼中。