web-dev-qa-db-fra.com

y compris le fichier php d'un autre serveur avec php

J'ai deux fichiers PHP situés sur différents serveurs, l'un à http://www.mysite.com/main.php, l'autre à http://www.sample.com/includeThis.php.

Je veux inclure le deuxième fichier du premier.

Le contenu du second fichier ressemble à ceci:

<?php
$foo = "this is data from file one";

Et le premier fichier:

<?php
include "http://www.sample.com/includeThis.php";
echo $foo;

Y a-t-il un moyen de faire ça?

25
SolidSnake

Non, ce paramètre est désactivé/non autorisé par défaut dans la plupart des serveurs Web (php.ini). Vous ne pouvez donc pas utiliser la variable include pour inclure les fichiers d'une adresse distante pour raisons de sécurité.

Si vous souhaitez toujours autoriser inclusion des fichiers distants, la directive allow_url_include doit être définie sur On dans le fichier php.ini.

Mais là encore, c’est une mauvaise pratique, du point de vue de la sécurité; et, donc, il est généralement désactivé (je ne l'ai jamais vu activé, en fait)

Si vous souhaitez lire le contenu d'un fichier distant}, vous pouvez utiliser la fonction file_get_contents à la place de MAIS qui sera retourné sous la forme suivante: code HTML pur, il n’y aura pas de code côté serveur.

33
Sarfraz

Après avoir lu vos commentaires - dans lesquels vous indiquez que vous voulez faire cela comme moyen de protection contre la copie - ma réponse est catégorique, oubliez ça . Ce n'est pas ainsi que fonctionne la protection contre la copie.

La seule chose que vous puissiez faire avec include() est fetch de code source ailleurs pour être interprété sur l'interpréteur local. C'est enfantinement facile à craquer: un client malveillant aurait simplement à echo() le code récupéré.

L'exécution du script distant à distance (sur votre serveur) ne vous aidera pas, car l'état de ce script (variables, fonctions ...) ne sera pas présent dans le script à partir duquel vous l'appelez.

Les options que vous avez sont:

  • Compiler/encoder/masquer le script, nécessitant éventuellement l’exécution d’un module PHP spécifique (beaucoup de questions à ce sujet sur les SO)

  • Créer un vrai service Web (par exemple, en utilisant SOAP) qui s'exécute sur votre serveur et effectue les opérations demandées

Pour ce que cela vaut, cependant, je n’achète pas personnellement, ni ne recommande aux clients d’acheter des scripts codés et des scripts qui doivent "téléphoner à la maison" pour fonctionner. Je crois en la protection de vos produits par le biais d'un contrat de licence strict (cela incitera les clients professionnels à acheter votre produit, car les risques de se faire prendre en train de voler sont trop coûteux.) 

3
Pekka 웃

Je me demande si le PO n'a jamais trouvé de solution pour lui-même. Autant que je sache, la seule façon de travailler serait d’avoir tous vos comptes clients sur le même serveur que les scripts que vous voulez inclure - j’ai fait quelque chose de similaire:

/path_to_myserver_root/httpdocs/clients/client01/wwwroot/scriptA.php /path_to_myserver_root/httpdocs/clients/client02/wwwroot/scriptA.php , etc.

ALORS: /Path_to_myserver_root/privatefiles/myapp/scriptB.php

wwwroot est l'endroit où chaque domaine client pointe.

scriptA.php a une logique métier, puis inclut scriptB.php pour ses fonctions avec le chemin complet ci-dessus:

require ('/ path_to_myserver_root/privatefiles/myapp/scriptB.php')

scriptB.php réside dans un répertoire privé protégé sur le serveur, inaccessible par http et non traversable par les clients.

Maintenant, remarquez que mes raisons sont de maintenir la cohérence des versions sur plusieurs comptes et non de retenir du code php magique propriétaire à ma clientèle - mais je suppose que cela pourrait être implémenté à cette fin.

Meh, YMMV.

2
antmeeks

Utilisez file_get_contents, pour ouvrir le fichier, ajoutez-le au second fichier comme suit:

$secondFile = file_get_contents('http://www.sample.com/includeThis.php');
file_put_contents('your_file', $secondFile, FILE_APPEND);

Cela fonctionnera si vous voulez le mettre à la fin de votre fichier. Que simplement faire une inclusion sur votre dossier.

Quoi qu'il en soit, comme je l'ai dit, l'OMI est risquée et dangereuse, surtout si vous n'êtes pas sûr du contenu qu'il contient.

De plus, votre_fichier devra être un chemin de serveur réel, pas une URL.

1
SoLoGHoST

Lorsque vous essayez de parcourir plusieurs domaines, comme vous l'avez suggéré, vous n'incluez pas réellement un fichier prêt à être utilisé, le processus est différent. La machine doit ramener le fichier sur http, ce qui n’est pas l’objet de la déclaration d’inclusion.

De plus, si vous utilisez un hébergement partagé, PHP est souvent configuré pour vous empêcher de sortir de votre propre domaine.

Si vous n'êtes pas soumis à cette restriction, vous pouvez utiliser PHP pour copier une copie du fichier de l'autre serveur, puis l'inclure une fois qu'il est installé dans votre domaine. Une autre approche pourrait être d'écrire un petit script de "déploiement" qui le copie partout où il le faut chaque fois que vous apportez des modifications ...

J'espère que cela t'aides...

Martin

0
Martin Milan

renommer le premier en .txt
alors réfléchissez-y à deux fois, êtes-vous sûr de vouloir inclure l'inclusion interdomaine

0