Tester l'existence d'un site

Le
Pascale
Sur l'un de nos sites, les gens qui s'inscrivent peuvent entrer (entre
autres) l'adresse de leur site web. Afin d'éviter les erreurs les plus
flagrantes, un contrôle est fait :

$siteini=$_POST['siteini'];
$site="http://".$siteini;
$file = @fopen($site,'r');
if ($file)
{$_SESSION['siteini']=$siteini;}
else
{
echo '<p class="erreur">L'adresse de site '.$site.' renvoie un
message d'erreur !</p>';
$errurl1='1';
}

Ça ne nous met pas à l'abri de toutes les bourdes, mais globalement ça
marche plutôt bien et oblige certains utilisateurs à ôter leurs moufles
pour se servir du clavier.
Aujourd'hui, j'ai le problème inverse, avec un site qui existe mais renvoie
un code erreur. Pour la page d'accueil du site en question http://www.les-
rolistes-rouennais.com/ ça ne m'étonne pas trop, car non seulement la page
d'accueil met longtemps à s'afficher, mais le chargement semble n'être
jamais fini (« en attente de http://www.les-rolistes-rouennais.com/ »). Ce
qui m'ennuie plus, c'est que j'ai le même message d'erreur
avec d'autres pages, par exemple http://www.les-rolistes-
rouennais.com/forum/accueil-f2.html , mais là aussi, il semble qu'il y ait
des éléments de page qui se chargent de manière sporadique.

Du coup, je suis embarrassée, car je n'ai pas envie du tout de supprimer ce
test, même s'il est imparfait, alors si vous avez de bonnes idées, ne vous
gênez pas (:

--
Pascale
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #11387531
Le 06/07/2008 16:51, Pascale a écrit :
Sur l'un de nos sites, les gens qui s'inscrivent peuvent entrer (entre
autres) l'adresse de leur site web. Afin d'éviter les erreurs les plus
flagrantes, un contrôle est fait :

[...]
$file = @fopen($site,'r');
[...]
Aujourd'hui, j'ai le problème inverse, avec un site qui existe mais renvoie
un code erreur. [...]



Si le code de retour de fopen() n'est pas assez informatif, une idée
serait peut-être d'utiliser CURL :
http://fr3.php.net/manual/fr/ref.curl.php

Les codes d'erreur sont assez complets :
http://curl.haxx.se/libcurl/c/libcurl-errors.html

... et certains pourraient t'intéresser, par exemple :

CURLE_URL_MALFORMAT (3)
The URL was not properly formatted.
-> erreur de l'utilisateur

CURLE_COULDNT_RESOLVE_HOST (6)
Couldn't resolve host. The given remote host was not resolved.
-> probable erreur de l'utilisateur (à confirmer avec une requête sur un
site dont tu es sûre, pour vérifier que ce n'est pas le DNS qui est
en rade).

CURLE_COULDNT_CONNECT (7)
Failed to connect() to host or proxy.
-> le site est peut-être correct, même s'il ne répond pas.

etc.
Pascale
Le #12159321
Olivier Miakinen news:4870ebd3$:

Si le code de retour de fopen() n'est pas assez informatif, une idée
serait peut-être d'utiliser CURL :
http://fr3.php.net/manual/fr/ref.curl.php



Ça a l'air de correspondre à ce que je cherche, par contre, je suis
totalement neuneue pour la mise en ½uvre...

On commence par faire :

$ch=curl_init($url);
puis on récupère le code erreur éventuel avec

curl_errno($ch);

Mais en fait non, j'ai rien compris ? Si...?

--
Pascale
Pascale
Le #12178331
Olivier Miakinen news:4870ebd3$:

Si le code de retour de fopen() n'est pas assez informatif, une idée
serait peut-être d'utiliser CURL [couic]



Je pense que ça correspond tout à fait à ce qu'il me faut : si je trouve
pas mon bonheur là dedans, c'est vraiment que je m'y prends mal, merci
Olivier (:

--
Pascale
CrazyCat
Le #12178301
Pascale wrote:
Sur l'un de nos sites, les gens qui s'inscrivent peuvent entrer (entre
autres) l'adresse de leur site web. Afin d'éviter les erreurs les plus
flagrantes, un contrôle est fait :

$siteini=$_POST['siteini'];
$site="http://".$siteini;
$file = @fopen($site,'r');



Pour ma part, j'utiliserais plutôt une fonction dédiée à cela: fsockopen:

<?
$siteini = $_POST['siteini'];
if (strpos($siteini , 'tp://')==úlse) $siteini = 'http://'.$siteini ;
if ($fid = @fsockopen($siteunu, 80, $errno, $errstr, 10) {
echo $siteini.' OK';
} else {
echo 'Error with '.$siteini.': '.$errno.' -> '.$errstr;
}
?>


--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Mickaël Wolff
Le #12178311
Pascale a écrit :

On commence par faire :

$ch=curl_init($url);
puis on récupère le code erreur éventuel avec

curl_errno($ch);

Mais en fait non, j'ai rien compris ? Si...?



curl_init créé une ressource, et l'initialise avec le paramètre s'il
lui est fournit.

curl_setopt te permet de configurer ta ressource.

Il faut savoir que, par défaut, curl va télécharger la page distante
et renvoyer le contenu vers ton navigateur. Donc si tu veux seulement
vérifier que la page existe, tu peux utiliser le code suivant :

function check_url($url)
{
$socket = curl_init($url) ;
curl_setopt($socket, CURLOPT_NOBODY, true) ;
$message = curl_exec($socket)
? curl_getinfo($socket, CURLINFO_HTTP_CODE)
: curl_error($socket) ;

curl_close($socket) ;
return $message ;
}

À noter que le message renvoyé n'est pas forcément une erreur.

Je profites du thread pour soulever un point concernant curl et la
sécurité. En fournissant directement l'URL de l'utilisateur à Curl, n'y
a-t-il pas potentiellement un problème de sécurité ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Patrick Mevzek
Le #12178281
Le Mon, 07 Jul 2008 12:36:13 +0000, Mickaël Wolff a écrit:
En fournissant directement l'URL de l'utilisateur à Curl, n'y
a-t-il pas potentiellement un problème de sécurité ?



Si, multiples même.

Voir par exemple des papiers sur la sécurité d'OpenID (même problème :
l'utilisateur fournit une URL à un serveur qui doit s'en servir et s'y
connecter), ou un client HTTP « paranoïaque » dans un autre language :
http://search.cpan.org/~bradfitz/LWPx-ParanoidAgent-1.03/lib/LWPx/ParanoidAgent.pm
(avec quelques explications sur les pièges évités).

Et bien sûr là on ne parle même pas d'éventuelles failles dans le client
HTTP en lui-même juste de failles découlant du fait d'accepter de
l'extérieur une information réutilisée telle quelle.

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
Olivier Miakinen
Le #12221001
Le 07/07/2008 15:39, Patrick Mevzek a écrit :

En fournissant directement l'URL de l'utilisateur à Curl, n'y
a-t-il pas potentiellement un problème de sécurité ?



Si, multiples même.



Même si cette URL n'est utilisée que pour une requête HEAD, et que la
seule information utile qu'on en retient est un éventuel code d'erreur ?

Je ne vois pas quel problème de sécurité cela pourrait poser pour
l'appelant : il y a *beaucoup* moins de risques que pour un simple
internaute cliquant sur un lien avec un navigateur qui ferait un GET
au lieu d'un HEAD et qui, en outre, interpréterait le JavaScript.

Et même pour l'appelé : s'il n'implémente pas d'effet de bord aux
requêtes HEAD, il ne risque pas grand chose -- et inversement s'il
reformate son disque dur en réponse à un HEAD, c'est bien fait pour
sa pomme !

Voir par exemple des papiers sur la sécurité d'OpenID (même problème :
l'utilisateur fournit une URL à un serveur qui doit s'en servir et s'y
connecter),



Tu aurais un lien (si possible traduit en français) ?

ou un client HTTP « paranoïaque » dans un autre language :
http://search.cpan.org/~bradfitz/LWPx-ParanoidAgent-1.03/lib/LWPx/ParanoidAgent.pm
(avec quelques explications sur les pièges évités).



Je n'ai pas bien compris ce que ça fait (il faut dire que je ne suis pas
allé voir ce qu'était LWP::UserAgent dont il dérive).

Et bien sûr là on ne parle même pas d'éventuelles failles dans le client
HTTP en lui-même juste de failles découlant du fait d'accepter de
l'extérieur une information réutilisée telle quelle.



Oui, bien sûr. Mais dans ce cas, quel genre de contrôle ferais-tu sur
l'URL qui pourrait minimiser les risques lors de la connexion par CURL ?
Mickaël Wolff
Le #12221011
Patrick Mevzek a écrit :
Le Mon, 07 Jul 2008 12:36:13 +0000, Mickaël Wolff a écrit:
En fournissant directement l'URL de l'utilisateur à Curl, n'y
a-t-il pas potentiellement un problème de sécurité ?



Si, multiples même.



J'ai un peu fouillé, et c'est en fait un énorme trou si on ne fait pas
attention. Merci pour les infos.

Pascale, le bout de code que j'ai fournit à titre d'illustration n'est
pas sécurisé. Il ne faut pas l'utiliser en production. Je regarde pour
faire une classe mieux fagotée, je la posterais ici.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Mickaël Wolff
Le #12263491
Olivier Miakinen a écrit :

Tu aurais un lien (si possible traduit en français) ?



C'est vrai que moi aussi ça m'aurait aider. Cependant, en essayant
l'url file:///etc/passwd dans curl_init, même en configurant l'option
CURLOPT_NOBODY à true le contenu du fichier est affiché :-D


Je n'ai pas bien compris ce que ça fait (il faut dire que je ne suis pas
allé voir ce qu'était LWP::UserAgent dont il dérive).



Ce que je pense qu'il faut en retirer, c'est la limitation du timeout
(pour éviter les redirections éternelles), l'exclusion d'hôtes sensibles
afin d'éviter de détourner la fonctionnalité pour sonder le voisinage
réseau, etc. Tiens, si ça ce trouve, en utilisant la fonctionnalité
telnet, on peut éventuellement utiliser ça pour faire du spam :-D (oui,
c'est une obsession).


Oui, bien sûr. Mais dans ce cas, quel genre de contrôle ferais-tu sur
l'URL qui pourrait minimiser les risques lors de la connexion par CURL ?



Vérifier que c'est une URL désignant une ressource HTTP est un bon
début en fait. C'est d'ailleurs ce que je suis en train de corriger dans
mes devs. Je n'avais pas réalisé la puissance de cURL.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Olivier Miakinen
Le #12275191
Le 07/07/2008 20:55, Mickaël Wolff a écrit :

C'est vrai que moi aussi ça m'aurait aider. Cependant, en essayant
l'url file:///etc/passwd dans curl_init, même en configurant l'option
CURLOPT_NOBODY à true le contenu du fichier est affiché :-D



Peut-être bien, mais je te rappelle le début du code de Pascale :
-----------------------------------
$siteini=$_POST['siteini'];
$site="http://".$siteini;
$file = @fopen($site,'r');
-----------------------------------

Je veux bien manger ma barbe si l'url html://file:///etc/passwd ouvre
quoi que ce soit en local...

[...] l'exclusion d'hôtes sensibles
afin d'éviter de détourner la fonctionnalité pour sonder le voisinage
réseau



Ah oui, là je suis d'accord. Par exemple en lui passant une adresse IP.

, etc. Tiens, si ça ce trouve, en utilisant la fonctionnalité
telnet, on peut éventuellement utiliser ça pour faire du spam :-D (oui,
c'est une obsession).



Même réponse que pour file : c'est impossible puisque c'est Pascale qui
rajoute http:// au début.

Vérifier que c'est une URL désignant une ressource HTTP est un bon
début en fait.



Cf. supra. Pas besoin de le vérifier : on l'impose.
Publicité
Poster une réponse
Anonyme