Le cloaking, inutile ?
décembre 29, 2008 par Julien
Catégorie Référencement
Présentation
“La technique du Cloaking (en français dissimulation) est une technique utilisée par les black hat pour optimiser leur positionnement dans les moteurs de recherche. [...] Le seul usage légitime qu’il peut être fait de cette technique est de proposer seulement aux clients qui peuvent l’interpréter des contenus spécifiques (par exemple, un contenu Adobe Flash n’est pas lisible par un robot). Aujourd’hui, de meilleures méthodes d’accessibilité sont à disposition, rendant le cloaking inutile.” Source : Wikipedia.
Le cloaking est une technique légitime de référencement consistant à proposer deux versions d’une même page selon que le visiteur soit un robot ou un humain. Si le cloaking à mauvaise presse il n’en est pas moins vrai que de nombreux sites très connus et bien classés dans Google l’utilisent à bon escient.
Mais d’abord techniquement, le cloaking, comment ça marche ?
Le premier problème qui se pose lorsqu’on veut réaliser un bon cloaking est de réussir à bien identifier Googlebot (Et les autres robots). Il existe plusieurs méthodes avec chacune avantages et inconvénients.
Identifier Googlebot grâce à l’user-agent :
Lorsqu’une application se connecte à un serveur web, elle envoi généralement dans sa requête HTTP un entête “user agent” contenant une chaîne de caractères permettant de l’identifier. Il suffit donc pour détecter Googlebot d’examiner l’user agent.
La darkseoteam analyse en permanence les crawls de Google fait sur leur site. Vous donnant ainsi un user agent toujours à jour : “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)“.
En général, si l’user agent au complet peu changer, certaines parties de la chaîne restent fixes dans le temps. Un bon moyen d’identifier les différents Googlebots est de vérifier la présence de “Googlebot” dans l’user agent. Exemple en Php :
if (preg_match("/Googlebot/", $_SERVER['HTTP_USER_AGENT'])) {
echo 'Bonjour Google !';
} else {
echo 'Toi tu n'es pas Google.';
}
Le gros problème de cette méthode est quelle est très facile à tromper. Un simple plugin Firefox comme User Agent Switcher permettra à n’importe qui de se faire passer pour Google à vos yeux. Bien sûr si vous faite du “whitehat cloaking” cela est sans importance, mais si par hasard vous avez des choses à cacher, vous aller au devant d’un spam report de la part de vos concurrents.
Identifier Googlebot grâce à l’IP :
Une méthode plus efficace consiste à identifier Google à partir de son adresse IP. La aussi la Darkseoteam propose une liste constamment mise à jour, mais le mieux consiste à exploiter vos logs apache pour réaliser votre propre liste qui sera alors à comparer avec la variable php $_SERVER['REMOTE_ADDR'] lors de l’identification.
Le problème ici, est que vous ne serez jamais sur de pas laisser parfois quelques Googlebots passer à travers les mailles de votre filet. Un moyen efficace est de faire un reverse DNS, c’est-à-dire transformer l’adresse IP de vos visiteurs en nom de domaine. Vous devriez alors voir apparaître “googlebot.com“.
> host 66.249.66.1
1.66.249.66.in-addr.arpa domain name pointer
crawl-66-249-66-1.googlebot.com.
Il y a deux façons de mettre cela en place. La première en vérifiant bien que la directive “HostnameLookups” soit à “On” dans votre fichier de config Apache. Le nom de l’hôte sera alors présent dans la variable $_SERVER['REMOTE_HOST']. Le cas échéant, il vous est encore possible de faire un gethostbyaddr sur l’IP du client. Le code :
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
if (preg_match("/google.com/", $hostname)) {
echo 'Cloaking sur IP';
} else {
echo 'Version visiteurs';
}
Si cette dernière méthode est la plus efficace elle n’est certainement pas à conseiller sur des sites à fort trafic, la résolution DNS inverse étant assez lourde.
Il existe d’autres solutions envisageables. On pourrait imaginer par exemple utiliser gethostbyaddr conjointement à une table HEAP contenant les dernières IP ayant demandées une page pour limiter de trop nombreuses résolutions inverses. On doit aussi pouvoir se baser sur le fait que les robots d’indexation ne gèrent pas les cookies et génèrent des sessions à chaque demande de pages. Les solutions finalement ne manquent pas mais sont à moduler en fonction de vos contraintes.
Le cloaking, toujours blackhat ?
Il existe plusieurs applications légitimes du cloaking. Si par exemple vous utilisez des variables de tracking sur votre site, il est plus que conseillé de faire un cloaking sur vos liens internes pour éviter de générer du duplicate content. Des sites réputés comme la Fnac ou Amazon usent de cette technique de façon modéré. Il n’y a qu’à aller sur ces sites avec l’user agent de Google pour voir les différences.
Si votre site nécessite une inscription pour accéder à son contenu, vous pouvez très bien envisager de mettre en place un cloaking pour permettre quand même à Google de l’indexer. On se rapproche ici d’une pratique assez borderline, mais c’est ce qu’ils conseillent eux même pour Google actualités.
Le plus dur étant en général, comme toujours avec Google, de savoir ou se situe la ligne.
Utiliser l’API SimplePie
Il y a quatre ans de cela, Olivier Duffez de WebRankInfo avait écrit un excellent article sur l’intégration de flux RSS avec l’outil MagpieRSS.
Cet outil, fort pratique, permet à un webmaster d’intégrer sur son site des fils de news RSS en provenance de diverses sources, à la manière du célèbre Netvibes. Malheureusement, le projet Magpie ayant été abandonné, le format RSS 2.0 n’est pas totalement supporté, notamment par exemple les enclosures. Heureusement, depuis quelques années, un remplaçant pointe le bout de son bec, il s’agit de SimplePie, tout aussi pratique, et simple d’utilisation, mais en plus compatible avec tout les formats RSS. C’est de lui que nous allons parler.
Tout ce que fait Magpie, SimplePie le fait également, aussi vous pouvez lire l’article d’Olivier pour plus d’informations.
Pour utiliser SimplePie, il vous faut la télécharger. Vous la trouverez sur le site http://simplepie.org. C’est le fichier simplepie.inc sous licence LGPL.
Les fonctionnalités offertes par cette API sont multiples, on a bien sûr entre autres, la gestion d’un cache, mais aussi la possibilité de filtrer le flux en y supprimant certaines publicités, ou des balises et attributs potentiellements dangeureux. Certaines configurations doivent se faire dans le fichier lui même (si vous souhaitez par exemple filtrer une balise supplémentaire), mais la pluparts peuvent se faire directement dans votre code php. En parlant de code, voici un exemple d’intégration :
// adresse du flux qu'on souhaite intégrer. $fichier_xml='http://www.lemonde.fr/rss/sequence/0,2-3208,1-0,0.xml'; // appel de la libraire SimplePie. require 'simplepie.inc'; // création d'une nouvelle instance de la classe SimplePie. $feed = new SimplePie(); // on lui indique quel fichier il doit traiter. $feed->set_feed_url($fichier_xml); // on peut lui interdire de trier par date. true par défaut. $feed->enable_order_by_date(false); // on lui indique le nom du fichier de cache. $feed->set_cache_location('cachenews/'); // on lache la pie. $feed->init(); // Si le flux contient à manger. if($feed->data){ // On défini le nombre d'articles qui nous intéressent. $max=$feed->get_item_quantity(5); // Nous voici au coeur du code d'intégration. for($x=0; $x<$max; $x++) { // On prend le x-iéme item. $item=$feed->get_item($x); // Un peu d'habillage html. echo "<div style=\"width: 290px; text-align: left; padding: 4px; background-color: #FFFFEE; border: 1px solid #CCCCCC; margin: 6px;\"> <a href=\""; // le lien ou pointe le flux. echo $item->get_permalink(); echo "\">"; // le titre du flux. echo utf8_decode($item->get_title()); echo "</a><br />"; // si enclosure, on affiche. C'est le cas du monde. if($enclosure=$item->get_enclosure(0)){ echo "<img src=\""; echo $enclosure->get_link(); echo "\" border=\"1\" style=\"float: left; margin: 4px; margin-top: 8px;\">"; } // Et la description pour finir. echo utf8_decode($item->get_description()); echo "</div>"; } }
Voila, c’est on ne peut plus simple. Pas vraiment de commentaire à rajouter sur le code en lui même, si ce n’est ici l’utilisation de utf8_decode pour afficher le texte correctement (fonction de l’encodage de votre page). Comme Olivier, je vous conseille de mettre ce code dans une fonction dédié, la seule variable étant le fichier à parser. A noter que le code suppose ici que votre enclosure soit une image, ce qui ne sera pas souvent le cas en général.
Parser un fichier XML avec l’API DOM
Ce petit article n’a pas pour objectif de vous enseigner XML, ni ne prétend être un cours exhaustif au sujet de l’API DOM. Il vous expliquera seulement, comment, à partir d’un fichier XML, extraire les données qu’il contient, et les afficher dans une page web. Nous utiliserons pour cela le langage PHP5.
Pour parser un fichier XML, il existe de nombreuses méthodes. Vous pouvez utiliser les fonctions standards de traitements de fichiers, et chaines de caractères, alliées aux très puissantes expressions régulières, ou si vous souhaitez perdre moins de temps utiliser SimpleXML beaucoup plus adapté. Il existe un troisième chemin, pas toujours plus efficace, ni même plus simple, mais qui offre l’avantage d’être un standard du W3C accessible depuis la plupart des langages. Vous l’avez bien compris, nous allons utiliser le Document Object Model, déjà survolé quelquefois en Javascript sans toujours oser le nommer.
Nous allons donc supposer que vous ayez un fichier XML à parser. Nous ne nous poserons pas de questions sur la validé de ce fichier avec la DTD qui lui est associé. Vous ne savez pas ce qu’est une DTD ? Tant mieux, cela ne vous servirait à rien ici. Tout ce que nous voulons c’est extraire des données du fichier. Imaginons que notre fichier contienne les données qui suivent :
<catalogue>
<ordinateurs>
<marque prix="1200">Sony</marque>
<marque prix="1800">Fujitsu</marque>
<marque prix="1300">IBM</marque>
</ordinateurs>
<imprimantes>
<marque prix="300">Epson</marque>
</imprimantes>
</catalogue>
Récupérer le contenu d’une balise
Par récupérer le contenu d’une balise, nous entendons le texte se trouvant entre la balise ouvrante, et celle fermante, ainsi, Sony, Fujitsu, IBM, et Epson sont des contenus de balise. Supposons que nous voulions afficher la liste des marques d’ordinateurs, voici le code que nous devrions utiliser :
<?php
$dom =new DomDocument();
$dom->load('monfichier.xml');
$ordinateurs=$dom->getElementsByTagName('ordinateurs')->Item(0);
$marques = $ordinateurs-> getElementsByTagName('marque');
foreach($marques as $marque)
$listemarques[] = $marque->firstChild->nodeValue
?>
Le fonctionnement de ce code est assez simple. On crée un nouvel objet DOM, on charge le fichier XML contenant les données à parser. getElementsByTagName nous permet d’identifier les éléments possédant le TagName “ordinateur”, Item(0) pointe vers le premier d’entre eux. A partir de la, il ne nous reste plus qu’à identifier les éléments possédant le TagName “marque” parmi ceux ayant le TagName “ordinateur”. Un foreach dans la structure résultante nous permet alors de tous les afficher.
Récupérer le contenu d’un attribut
Nous entendons par attribut le texte se trouvant entre les guillemets de notre exemple XML. Nous allons donc ici récupérer les prix. Pour cela, le code utilisé sera tout aussi simple, à celui précédement vu, on rajoute tout simplement ceci :
if ($marque->hasAttribute('prix'))
{
$listeprix[] = $marque->getAttribute('prix');
}
hasAttribute, nous permet de vérifier l’existence de l’attribut prix pour la marque correspondante, et getAttribute en récupére la valeur. Bien sûr, $listemarques et $listeprix sont des tableaux. Il existe un grand nombre d’autres fonctions dans l’api DOM, aussi je vous renvois vers le manuel php, mais vous en savez déjà suffisament pour extraire les données que vous souhaiteriez d’un fichier XML.
Forum PHP Paris 2008
novembre 2, 2008 par Julien
Catégorie Nouveautés
Le 8 et 9 décembre 2008 aura lieu le 8éme forum PHP organisé par l’afup et placé sous le signe des web services pro et des grands projets PHP.
Objectifs
Depuis 8 ans, l’AFUP organise le Forum PHP pour permettre aux utilisateurs de PHP de se retrouver et d’échanger autour de conférences et ateliers à forte valeur ajoutée. Cette année encore, les participants auront l’opportunité de débattre avec les experts internationaux présents, et ainsi mieux appréhender les enjeux technologiques du langage PHP, devenu la technologie de référence pour construire des applications web en entreprise. Des acteurs de poids dans le monde PHP comme Zend, Oracle et Anaska/AlterWay ont apporté leur soutien pour cette huitième édition.Les deux journées seront l’occasion d’assister à des conférences et ateliers techniques ou fonctionnels, ainsi qu’à des retours d’expériences. Cet événement intéressera les responsables informatiques et décideurs souhaitant découvrir le potentiel de la plate-forme PHP, et les développeurs attirés par les aspects plus techniques tels que la sécurité et la montée en charge.
Toutes les informations complémentaires sur le site de l’afup :
http://www.afup.org/article.php3?id_article=368