2010-01-31 15 views
12

Questa domanda è in linea con this question, Sto cercando di connettermi al server FTP sicuro e non è in grado di connettersi, la parte strana è che sono in grado di fare ssh e connettermi al server ma quando provo a farlo dal codice PHP utilizzando alcuni approcci differenti, ma non sta funzionandoConnessione per proteggere il server FTP da PHP

approcci:

  1. FTP Wrappers
  2. ftp_connect & ftp_login
  3. ftp_ssl_connect
  4. ssh2_sftp
  5. ssh2-scp-send & ssh2-scp-receive - Non ho provato questo approccio ancora, ma raccomandato nei commenti porzione e così sarebbe lavorare su questo e pubblicherà aggiornamenti in seguito.

Codice in materia Approccio 1:

$ftp_server = "ftp://username:[email protected]:21/{$log_file_name}"; 
$opts = array('ftp' => array('overwrite' => TRUE)); 
$context = stream_context_create($opts); 
$put_file = file_put_contents($ftp_server, $response, LOCK_EX,$context); 

Qui, inoltre, non sono in grado di connettersi a garantire Server FTP, qualche suggerimento sul motivo per cui non è in grado di connettersi?

Codice in materia Approccio 2:

ftp_server = 'www.server.com'; 
$conn_id = ftp_connect($ftp_server) or die ("Cannot connect to host"); 
//Program dies out here and give error message "Cannot connect to host", 
//but why ftp_login does not work here, Any Suggestions ? 
$ftp_user_name = "login"; 
$ftp_user_pass = "password"; 
// login with username and password 
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 
// check connection and login result 
if ((!$conn_id) || (!$login_result)) 
{ echo "FTP connection has encountered an error!"; 
    echo "Attempted to connect to $ftp_server for user $ftp_user_name...."; 
//exit; 
} else 
{ 
echo "Connected to $ftp_server, for user $ftp_user_name"."....."; 
} 

Codice in materia Approccio 3:

Here am using same code as approach 1 but instead of ftp_connect, am using ftp_ssl_connect

Codice in Approach 4:

$connection = ssh2_connect('www.server.com', 22); 
ssh2_auth_password($connection, 'login', 'password'); 
$sftp = ssh2_sftp($connection); 
//exit(); 
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r'); 

Qualcuno può consigliare perché non riesco a collegarmi al server FTP sicuro usando gli approcci sopra ma sono ancora in grado di farlo usando ssh?

Esistono altri approcci per connettersi al server FTP sicuro utilizzando php?

UPDATE:

Q1. Ho provato di nuovo a usare ftp_connect ma si è spento e perché si esaurisce, quali sono gli scenari in cui muore ftp_connect?

Q2. Abbiamo solo questo approccio per connettersi al server o ce ne sono altri che possiamo implementare?

Q3. Questa lingua php è correlata al fatto che non supporta la connessione FTP protetta? O c'è un altro modo per farlo usando php, se sì che fornire approcci diversi in quanto sarebbe molto utile.

UPDATE 1:

io cercavo di google più sul problema e sembra che se ftp_connect non funziona oltre il firewall potrebbe essere uno dei motivi per questo. Non sono del tutto sicuro se questo è il caso, ma sto studiando di più su di esso e pubblicare un aggiornamento qui se trovo qualcosa di utile.

Soluzione possibile

Problema

Se rimuovo il "or die" poi si ottiene l'errore:

Quando si esegue da una pagina web:

Warning: ftp_login() expects parameter 1 to be resource, boolean given in /var/www/ftp_test.php on line 28

var_dump ($ conn_id); restituisce bool (falso).

Da riga di comando/usr/bin/php /var/www/ftp_test.php

var_dump ($ conn_id); restituisce la risorsa (4) di tipo (Buffer FTP).

Script completato.

Soluzione 1

Questo potrebbe essere uno solution:

Provate a spegnere selinux e qui è la way o Search : How to disable selinux per spegnerlo temporaneamente o permanentemente.

Soluzione 2

Se non si desidera disattivare completamente SELinux, si potrebbe ottenere quello che ti serve, semplicemente impostando il httpd_can_network_connect utilizzando il comando setsebool.

verificare che sia stato precedentemente impostato su "off": getsebool httpd_can_network_connect

impostarlo su "on":

setsebool httpd_can_network_connect=1 

Accendere SELinux indietro: setenforce 1

Controllare assicurati che php ftp_connect funzioni ancora quando sei in esecuzione con httpd.

impostare il criterio (-P) su "on" in modo che persiste per un riavvio:

setsebool -P httpd_can_network_connect=1 

Soluzione 3

Ci potrebbe anche essere questione con firewall aziendale. Assicurarsi che sia configurato correttamente e che i diritti di accesso siano impostati correttamente.

Soluzione 4

Un altro approccio è quello di utilizzare cURL : libcurl in quanto può essere utilizzato per collegare e comunicare a diversi tipi di server con diversi tipi di protocolli

Soluzione 5

C'è un progetto open source chiamato PHP Secure Communication Library (phpspeclib) che può essere utilizzato anche per stabilire una connessione sicura al server FTP.

+0

Quando si SSH nel ftp, è dallo stesso server che il vostro lo script php è in esecuzione? In caso contrario, potrebbe essere un problema dns –

+0

Sto usando lo stesso server quando sto facendo ssh in ftp e quindi non sono sicuro se questo potrebbe essere un problema? – user260204

+0

sFTP non è FTP. fa parte del protocollo SSH. FTP ssl è qualcosa di diverso. Ciò significa che l'approccio 1, 2 e 3 non funzionerà. Forse potresti provare a ricevere/inviare file con ssh2_scp_send/ssh2_scp_recv? –

risposta

0

Anch'io incontrato un bel po 'di problemi quando si tratta con connessioni crittografate.

Per prima cosa è necessario verificare il protocollo che si desidera utilizzare. L'FTP sicuro si sta generalmente ri-fiutando su FTP su SHH ma può anche significare SCP, SFTP o FTPS.

Un modo per capire è verificare la connessione utilizzando un client come filezilla.

Se il protocollo viene gestito tramite un modulo PHP, l'approccio migliore è proprio quello di utilizzarlo. In questo caso, è necessario assicurarsi che, oltre a quello relativo al protocollo, il modulo OPENSSL sia installato per php.

In alcuni casi il supporto del modulo continua a non funzionare. In questo caso, l'utilizzo del modulo libcurl è un'opzione. Questo è il caso ad esempio quando è necessario utilizzare un certificato client.

Purtroppo, anche in questo caso, è possibile che si verifichino alcuni problemi dovuti al supporto parziale di libcurl nel modulo php. Uno scenario che ho sperimentato è quando il certificato del server è giudicato non valido dal modulo.

L'ultima soluzione che uso di solito è eseguire il binario curl da un'istruzione exec, per il caso successivo usando l'opzione "-k".

0
  1. Molti web host a buon mercato non vi darà ssh (quindi non ftp tramite ssh alias SFTP) ma solo alias ftp ftps protetta SSL (see here). È possibile che abbia questo problema. Come altri suggeriscono, usa filezilla o un altro client ftp per testare in anticipo i tuoi crediti e il metodo di sicurezza scelto .

  2. ftp_ssl_connect() almeno sotto le finestre sarà un lungo viaggio, poiché è necessario compilare i propri binari php, see here.

  3. As this php contributor rightfully points out, non connessione sicura è sicuro, a patto che non si sa, chi si sta parlando troppo , alias “la certificazione dei pari” attraverso certificati validi.

  4. phpseclib è probabilmente la soluzione migliore.Ma non ho capire, come garantire, utilizza la verifica tra pari (indovinare, la verità è in openssl.conf ...)

  5. Quindi, anche al momento della scrittura, mi domando più che mai , se è disponibile il protocollo ftp convalidato peer (ftp con autenticazione ssl/tls) ... vedi anche my question here.

1

Per quanto riguarda'ftp via ssh' alias'sftp': Nessun consiglio diretta, ma è da notare, che molti webhosts a buon mercato 'del server non dedicato' non lo supportano (che è male). I firewall aziendali potrebbero bloccare i porti pertinenti.

Come per "ftp using ssl/tls" alias "ftps":Your answer is here. Non perdere tempo su ftp_ssl_connect() :-)

(Sì, è poco documentata sul sito php, per usare un eufemismo)