codice php esterno - come reagisce?

megarospo

Utente Attivo
25 Set 2007
147
0
0
Se includo un codice php depositato su un server "X" nel mio sito sul server "Y" e che contiene dei comandi per il mio database, questi vengono eseguiti su "Y" o per forza su "X"? Che caratteristiche dovrebbero avere questi comandi per agire sul database giusto? :book:
Grazie.
 
Dipende se la direttiva allow_url_fopen è abilitata. In ogni caso non credo che tu possa eseguire del codice PHP ospitato su un altro server, in quanto rimane una pagina PHP e prima dell'inclusione viene quindi parsata dal server (Apache), che ti restituirebbe il risultato dell'inclusione (quindi viene eseguito sul server ospitante, non sul tuo). L'unico modo è di fare qualcosa del genere:
PHP:
<?php
// i file .txt non sono parsati da Apache
$file = file_get_contents('http://www.prova.com/mioscript.txt');

// elimino i delimitatori perché eval() non li vuole
$file = str_replace('<?php', '', $file);
$file = str_replace('?>', '', $file);

// eseguo il codice
eval($file);
?>
Così dovrebbe funzionare, ma c'è il piccolo problemino che tutti possono leggere il codice del file mioscript.txt e quindi avere accesso anche a dati sensibili contenuti in esso. Per evitare questo io metterei nella directory dove sta questo file .htaccess:
Codice:
<Files mioscript.txt>
  Order deny,allow
  Deny from all
  Allow from ip.del.tuo.server
</Files>
Ovviamente sostituendo ip.del.tuo.server con l'indirizzo IP della tua macchina.

Spero di averti chiarito le idee, per qualsiasi dubbio o delucidazione in merito fammi pure sapere! ;)
 
Non a caso inventarono l'rpc (remote procedure call, poi sfociato nel progetto xml-rpc).
Non puoi chiamare un processo a quel modo o se ne va la sicurezza, quello che propone Alessandro è si fattibile ma insicuro, in pratica fai viaggiare i tuoi dati in chiaro lungo la rete.
RPC fa viaggiare solo il risultato, in pratica chiami la procedura remota che risponde con un xml formattato con i dati processati.
Puoi usare anche json per fare questo, vai sul sito php.net e fai delle ricerche con xml-rpc e json, in ogni caso bisogna anche vedere se il server remoto ti permette il loro uso.
Una domanda, ma perché ti vuoi impiccare a fare una cosa del genere?
 
No, io credo che a lui non servano i risultati ma proprio le procedure che li generano (ammesso che ci siano dei risultati). Comunque se hai bisogno di recuperare dei dati in effetti usare JSON o XML è molto meglio...
 
Il motivo di queasta richiesta era dettato dalla curiosità di sapere se era tecnicamente possibile con php realizzare un programma di utilità e permettere ad altri utenti di utilizzarlo senza darne in visione il codice e senza che questi abbiano particolari conoscenze di programmazione.
Che ne pensate? :book: c'è un sistema? Il codice php sul server "X" potrebbe connettersi al database del server "Y", estrarre i dati, elaborare i risultati e compilare il codice che poi viene trasmesso al server "Y"? ....mmm problema sicurezza vero? :crying:
 
Scusami, non ho capito. Tu vuoi connetterti al database di un altro host, esatto? E dove sarebbe il problema? Basta che al posto di localhost inserisci l'hostname dell'altro server e potrai interagire con il suo database come se eseguissi lo script da locale. Però su alcuni server non è fattibile perché accettano connessioni solo dal proprio host.

Per l'altra richiesta invece non ti sei spiegato chiaramente. Vuoi creare un programma PHP senza che ne sia visibile il codice... ma questa è già una caratteristica di PHP, in quanto il codice viene parsato dal server, non dal client, di conseguenza non è visibile all'utente.
 
Scusami, non ho capito. Tu vuoi connetterti al database di un altro host, esatto? E dove sarebbe il problema? Basta che al posto di localhost inserisci l'hostname dell'altro server e potrai interagire con il suo database come se eseguissi lo script da locale. Però su alcuni server non è fattibile perché accettano connessioni solo dal proprio host.
Esatto, ma mi immagino che invece di "alcuni server" siano quasi tutti. Giusto?


Per l'altra richiesta invece non ti sei spiegato chiaramente. Vuoi creare un programma PHP senza che ne sia visibile il codice... ma questa è già una caratteristica di PHP, in quanto il codice viene parsato dal server, non dal client, di conseguenza non è visibile all'utente.
Si. non mi sono spiegato bene.
Faccio un esempio. Immagina che tu, nel tuo sito abbia bisogno di avere un servizio di posta interna (Così mi ricollego all'altro mio post) o un'altra utilità. Ti sarà successo di scaricare qualche script già pronto (es: phpmailer, ecc) ed usarlo. immagina ora che il programmatore di Phpmailer si volesse tenere il codice per se.
Questo in definitiva era il mio iterrogativo. Ma era solo una elucrubazione mentale (leggi sega) per fare due chiacchere e imparare qualcosa. :D Ciao!
 
Riguardo la prima parte sugli host dei database: no, in realtà sono strani quelli che non consentono connessioni esterne. O almeno, a me non è mai capitato, a parte AlterVista che però è un servizio gratuito, quindi che cosa ti aspetti? Però si può ovviare con un sistema molto innovativo, quasi geniale, e qui ci ricolleghiamo alla seconda parte.

Esistono delle librerie, chiamate API (Application Programming Interface) che funzionano in questa maniera: un programmatore scarica una libreria che, dopo aver ricevuto i dati in input, fa una richiesta al server dell'applicazione. Il server parsa i dati in input e genera dell'output, solitamente XML, in maniera che sia facilmente utilizzabile da PHP.

Faccio un esempio pratico: le API di Twitter. Non so come funzionano perché non le ho mai usate, però mi posso fare un'idea. Scarichi la libreria API di Twitter (a volte neanche ce n'è bisogno, ti spiegano loro come fare) e tramite una semplice funzione puoi ricevere gli ultimi tweet di un utente, semplicemente passandogli il suo username. Questa funzione richiama una pagina del server di Twitter, creata ad-hoc per le API, che riceve lo username dell'utente, recupera i dati dal database e restituisce gli ultimi tweet.

Capisci come questo sistema possa essere vantaggioso: tutte le operazioni vengono svolte localmente sul server ospitante, nessuno conosce i codici sorgenti delle librerie (pur essendo PHP un linguaggio Open Source, mi rendo conto che molte persone potrebbero sfruttare male la conoscenza che metti a disposizione) e il tuo script riceve un output che può gestire come meglio crede.

Sviluppare delle API è una cosa relativamente facile, bisogna però conoscere bene il sistema utilizzato per l'output dei dati (XML, JSON, solitamente il primo per PHP e il secondo per JavaScript), e poi tutto dipende da quanto è complesso il software che sta dietro all'API e la mole di dati che consenti di recuperare.

Per qualunque delucidazione, dubbio, oppure se vuoi che ti aiuti a sviluppare una semplice API di esempio, in modo che capisci un po' come funziona, fammi pure sapere! ;)
 
Non edito il mio post precedente perché è già abbastanza lungo di suo, spero che i moderatori mi perdoneranno.

Guarda come sono bravo, visto che non mi hai ancora risposto ho preparato un esempio di API. Lo puoi trovare in allegato al post, prima ricordati di importare il file dump.sql tramite phpMyAdmin.

Il file server/api.php è quello che deve stare in remoto sul server che ospita l'applicazione che mette a disposizione la API, invece il file local/articles.php deve stare sul server che sfrutta l'API. Inutile dire che, per un test, nulla vieta che siano tutte e due in locale :D

Ricordati di modificare le variabili relative all'URL dell'API remota e, se vuoi, del numero di articoli da recuperare dal database.

In realtà questa non è proprio una API, perché, essendo semplicissima, non c'è bisogno di una classe che automatizzi le richieste al server, ma quella è una parte secondaria e il mio script rende bene l'idea! ;)

Fammi sapere cosa ne pensi e se ti ha schiarito le idee! Nessuno ti proibisce di usarla come base per le tue API. È parecchio da migliorare perché la funzione serialize genera un output abbastanza lungo, che può essere compresso con JSON. Però quest'ultima libreria mi dava dei problemi e ho preferito non inserire nel codice cose che potrebbero confonderti. Ogni riga è commentata, comunque. Buona fortuna, ne avrai bisogno! :D
 

Allegati

Discussioni simili