Fopen, include... en php impossible avec une URL externe

Bonjour,

J’ai récemment installé un serveur dédié avec Debian 5.0 Lenny dessus.

J’ai un gros soucis avec mes sites. Je ne peux pas faire d’include en php avec une URL externe au serveur à partir du navigateur internet, par contre si je lance le script avec la console, ça marche. Donc à mon avis cela vient de Apache2, puis que j’ai bien configurer php.ini. Vous pouvez le vérifier ici : 91.121.2.40/~meteobre/phpinfo.php

J’ai l’erreur si : “failed to open stream: Connection timed out in …”.

Donc voila je ne sais plus trop quoi faire, j’ai essayé de mettre mon site dans /var/www/ car c’est le répertoire principal de l’utilisateur apache mais cela ne change rien.

Je ne sais pas si j’ai donné assez de précisions. J’attends votre aide avec impatience,merci d’avance.

Personne ne peut m’aider ? Ce problème m’embête vraiment.

Quelqu’un m’a dit que c’était peut-être le dernier apache qui interdisait les requêtes sur des sites externes. Est ce possible ?
Si c’est le cas, y a-t’il une configuration à changer dans apache ?

Bonsoir.

Un include sur une URL externe?? C’est possible ça??

Logiquement, PHP n’est pas capable de le faire pour la simple et bonne raison que le pirate du dimanche pourrais se connecter a une base de donnée distante juste en faisant un include sur son serveur.

Après, je peux me tromper…

Oui c’est tout à fait possible mais à utiliser avec prudence, une faille peut très vite se glisser par là.

Regarde du côté de allow_url_fopen et allow_url_include dans le fichier php.ini

Merci de vos réponse. allow_url_fopen et allow_url_include sont bien configurés sur On comme vous pouvez le voir ici : 91.121.2.40/~meteobre/phpinfo.php

J’ai parlé ici des include, mais c’est le même cas pour fopen ou encore file_get_contents. Beaucoup de sites utilisent cela notamment pour l’utilisation de fichiers XML venant des autres sites. Mais pour include, c’est vrai que c’est plus dangereux, j’ai pris le mauvais exemple.

Bon au final, je suis toujours coincé, vraiment je vois pas d’où vient le problème. Selon moi, apache y est pour quelques chose.

Si vous avez des idées…

En principe si allow_url_include est à on cela permet de faire des trucs du genre :

Peux tu nous mettre ton bout de code qui coince.

Ensuite quand je vois “time out” je me dit que ce n’est peut être pas un soucis de code ou autre mais un soucis de flux.
La machine à qui fait l’include arrive bien à joindre la machine cible via un ping et via un w3m (ou lynx) ?

Bonsoir,

Le problème ne vient visiblement pas de php, parce que lorsque j’exécute le script php en console ça marche. C’est quand on lit le script sur le navigateur internet. Étrange comme problème.

Et je précise que c’est la même chose que ce soit l’URL que je met au fopen.

Vous pensez pas qu’il y a une relation avec apache ? puisque ça marche bien avec la console.

J’ai testé un ping et un w3m vers plusieurs sites, et ça marche parfaitement.

Décidément je ne vois plus quoi faire :neutral_face:

Il faut savoir que les fichiers php.ini pour apache2 et pour le cli (commande line interpreter) sont différents, as tu bien modifié les directives dans les deux fichiers ?
Sur une configuration dite “standard” ils se trouvent dans /etc/php5/

Oui j’ai bien modifié le fichier php.ini pour apache qui se trouve dans /etc/php5/apache2 et j’ai mis la même configuration pour le cli

Je t’invite à nous mettre le bout de code qui pose soucis.

D’accord je vous donne un exemple :

<?php $a = file_get_contents('http://weather.noaa.gov/pub/data/observations/metar/stations/LFRN.TXT'); echo ($a); ?>

Et vous voyez le résultat ici : meteobretagne.fr/test.php

Si le problème persiste, je crois que je vais complètement réinstaller le serveur.

Effectivement ceci devrait fonctionner avec allow_url_fopen à On.

As tu un pare-feu ? Si oui filtre t-il en sortie ?

Je vous montre les règles iptables que j’ai mis en place :

[code]#!/bin/bash
echo Setting firewall rules…

Debut Initialisation

Interdire toute connexion entrante

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
echo - Interdire toute connexion entrante : [OK]

Interdire toute connexion sortante

iptables -t filter -P OUTPUT DROP
echo - Interdire toute connexion sortante : [OK]

Vider les tables actuelles

iptables -t filter -F
iptables -t filter -X
echo - Vidage : [OK]

#Creation d’une chaine
iptables -N LOG_REJECT_SMTP
iptables -A LOG_REJECT_SMTP -j LOG --log-prefix ’ SMTP REJECT PAQUET : '
iptables -A LOG_REJECT_SMTP -j DROP

Anti-Taiwanais

iptables -t filter -A INPUT -i eth0 -s 61.64.128.0/17 -j LOG_REJECT_SMTP
iptables -t filter -A INPUT -i eth0 -s 122.120.0.0/13 -j LOG_REJECT_SMTP
iptables -t filter -A INPUT -i eth0 -s 168.95.0.0/16 -j LOG_REJECT_SMTP
echo - Bloquer Taiwanais : [OK]

Ne pas casser les connexions etablies

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo - Ne pas casser les connexions établies : [OK]

Autoriser la Supervision du serveur (SNMP)

iptables -t filter -A INPUT -p tcp --dport 161 -s 91.121.2.40/32 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 161 -s 91.121.2.40/32 -j ACCEPT
echo - Autoriser Supervision : [OK]

Autoriser les requetes DNS, FTP, HTTP, NTP

iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo - Autoriser les requetes DNS, FTP, HTTP : [OK]

Autoriser loopback

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo - Autoriser loopback : [OK]

Autoriser ping

iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo - Autoriser ping : [OK]

HTTP

iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
echo - Autoriser serveur Apache : [OK]

#modprobe ip_conntrack_ftp
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo - Autoriser serveur FTP : [OK]

#DNS
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo - Autoriser serveur Bind : [OK]

Mail

iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
echo - Autoriser serveur Mail : [OK]
[/code]

Mais je vois pas ce qui cloche :cry:
Sinon j’ai fail2ban qui est installé, cela peut venir de là ?

Bon je fouille, je fais un

netstat -lpn | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4163/apache2

Je devrais pas avoir 91.121.2.40:80 plutôt ? Sur mon ancien serveur j’ai 0.0.0.0:80 aussi, donc ça doit pas venir de là :frowning:

Est-ce que le problème pourrait venir de l’utilisateur apache www-data, qui n’aurait pas les droits nécessaire pour exécuter les fopen ?

Bon finalement j’ai complètement réinstallé le serveur. Maintenant tout marche, va t’en comprendre.

Merci de votre quand même :wink: