PHP ini file_get_contents url externe
Je utiliser à la suite de fonction PHP:
file_get_contents('http://example.com');
Chaque fois que je fais cela sur un certain serveur, le résultat est vide. Quand je le faire n'importe où d'autre, le résultat est celui que le contenu de la page peut être. Quand j'cependant, sur le serveur où le résultat est vide, utilisez la fonction localement, sans accès à une URL externe (file_get_contents('../simple/internal/path.html');
), il ne travail.
Maintenant, je suis sûr qu'il a quelque chose à voir avec un certain php.ini de configuration. Ce que je ne suis toutefois pas sûr à ce sujet est, qui un. S'il vous plaît aider.
Vous devez vous connecter pour publier un commentaire.
Le paramètre que vous cherchez est
allow_url_fopen
.Vous avez deux façons de se déplacer sans changer de php.ini, l'un d'eux est d'utiliser
fsockopen()
, et l'autre est d'utiliser cURL.Je recommande l'utilisation de cURL sur
file_get_contents()
de toute façon, depuis qu'il a été construit pour cela.file_get_contents()
avec l'option de configuration--with-curlwrappers
.--with-curlwrappers
, la boucle sera utilisé pour faire une requête HTTP à chaque fois que vous nefile_get_contents("http://example.com/stuff")
. Mon point était que curl etfile_get_contents
ne sont pas orthogonales, ce n'est pas "utiliser l'un ou l'autre".Complétant Aillyn de réponse, vous pouvez utiliser une fonction comme celle ci-dessous afin de mimer le comportement de file_get_contents:
L'est liée à l'ini de configuration
allow_url_fopen
.Vous devez être conscient que de permettre à cette option peut prendre de quelques bugs dans votre code exploitable.
Par exemple, cet échec pour valider la saisie peut se transformer en un acteur à part entière exécution de code à distance de la vulnérabilité:
est le mieux pour les url http,
Mais comment faire pour ouvrir des url https m'aider
Les réponses fournies au-dessus de résoudre le problème, mais de ne pas expliquer le comportement étrange de l'OP décrit. Cette explication devrait aider toute personne de tester la communication entre les sites dans un environnement de développement où ces sites tout résident sur le même hôte (et le même virtualhost, je travaille avec apache 2.4 et php7.0).
Il y a une subtilité avec
file_get_contents()
je suis tombé sur qui est tout à fait pertinentes ici, mais sans réponse (probablement parce que c'est soit à peine documentées ou non documentées à partir de ce que je peux dire ou est documenté dans un obscur php modèle de sécurité de livre blanc, je ne trouve pas).Avec
allow_url_fopen
ensemble deOff
dans tous les contextes pertinents (par exemple,/etc/php/7.0/apache2/php.ini
,/etc/php/7.0/fpm/php.ini
, etc...) etallow_url_fopen
ensemble deOn
dans la ligne de commande de contexte (c'est à dire/etc/php/7.0/cli/php.ini
), les appels àfile_get_contents()
pour une ressource locale sera autorisée et aucun avertissement sera enregistré comme:ou
ou
Pour conclure, la restriction
allow_url_fopen = Off
est analogue à uneiptables
règle dans leOUTPUT
de la chaîne, où la restriction n'est appliquée lors d'une tentative de "sortir du système" ou "modifier les contextes" est faite.N. B.
allow_url_fopen
ensemble deOn
dans la ligne de commande de contexte (c'est à dire/etc/php/7.0/cli/php.ini
) est ce que j'avais sur mon système, mais je pense qu'elle n'aurait aucune incidence sur l'explication que j'ai fourni, même si elle a été définie àOff
moins bien sûr que vous faites des tests en cours d'exécution de vos scripts en ligne de commande lui-même. Je n'ai pas tester le comportement avecallow_url_fopen
ensemble deOff
dans la ligne de commande de contexte.Cela permettra également de donner des liens externes d'un chemin absolu, sans devoir utiliser php.ini
Ajouter:
dans votre
php.ini
fichier. Si vous êtes à l'aide de l'hébergement mutualisé, d'abord en créer une.