Ouvrir le fichier PDF - Jean
Transcription
Ouvrir le fichier PDF - Jean
Extension ZIP pour PHP 2 9/2010 Extension ZIP pour PHP web 2.0 Ajax SGBD oracle mysql mssql windows linux Cloud HTML CSS PHP XML Apache IIS REST * Web SSO (*) SOA, Interfaces, webservices, SOAP b-pack développe les applications des grandes entreprises du secteur privé et public pour la gestion des processus stratégiques finances et achats. Vous êtes passionné par les nouvelles technologies ? Rejoignez-nous, et participez à la création de la nouvelle génération de logiciels d’entreprises. Retrouvez la liste des postes ouverts sur: http://www.b-pack.fr/societe/carriere Paris Aix-en-provence Atlanta Immeuble Technologies 84-88 bd de la M° Marchand 92400 Courbevoie 220 Rue Denis Papin Héliosis Batiment A 13857 Aix-en-Provence 303 Perimeter Center North Suite 300 Atlanta, GA 30346 3 DPOUBDUFN!JMKPC!CQBDLDPN 9/2010 5/2011 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682 Varsovie, Pologne Tél. 0975180358, Fax. +48 22 244 24 59 www.phpsolmag.org TABLE DES MATIÈRES Président de Software Press Sp. z o.o. SK : Paweł Marciniak Directrice de la publication : Justyna Książek Dépôt légal : à parution ISSN : 1731-4593 Rédacteur en chef : Łukasz Bartoszewicz Couverture : Przemysław Banasiewicz DTP : Przemysław Banasiewicz [email protected] Composition : Przemysław Banasiewicz Correction : Valérie Viel, Thierry Borel, Barbara Bourdelles Bêta-testeurs : Brice Favre, Valérie Viel, Cyril David, Christophe Milhau, Alain Ribault, Stéphane Guedon, Eric Boulet, Mickael Puyfages, Christian Hernoux, Isabelle Lupi, Antoine Beluze, Timotée Neullas, Yann Faure, Adrien Mogenet, Jean-François Montgaillard, Turmeau Nicolas, Jonathan Marois, Wilfried Ceron, Wajih Letaief, François Van de Weerdt, Eric Vincent, Franck Michaël Assi, Francis Hulin-Hubard, Nicolas Dumas, David Michaud. Les personnes intéressées par la coopération sont priées de nous contacter : [email protected] Publicité : [email protected] Pour créer les diagrammes on a utilisé le programme AVERTISSEMENT Les techniques présentées dans les articles ne peuvent être utilisées qu’au sein des réseaux internes. La rédaction du magazine n’est pas responsable de l’utilisation incorrecte des techniques présentées. L’utilisation des techniques présentées peut 2 VARIA 6 Actualités Actualités du monde du développement. Christophe Villeneuve 8 Interview de François-Xavier Bois François-Xavier Bois, Directeur associé de Kernix Software 10 Interview de Florent Sabourin Florent Sabourin, Responsable de l’offre e-commerce chez Smile OUTILS 12 Les solutions Cloud à l’usage d’Ikoula Jules-Henri Gavetti Ikoula, hébergeur informatique depuis 1998, est le leader du Cloud Computing en France. Avec plus de 8 000 machines virtuelles en production et plusieurs années d’expérience dans la virtualisation, Ikoula développe des solutions de Public et de Private Cloud, comme la VM à 1€ et Hosted Exchange 2010, via un panneau de contrôle administré en toute liberté par le client... PROJETS 14 DOMPDF : créez des PDF à la volée à partir de HTML Yohann Poiron DOMPDF est une bibliothèque écrite en PHP qui permet de générer des documents PDF à partir de pages web au format HTML, mises en formes avec des feuilles de style CSS. Le respect des standards est le maître-mot de cet outil, qui évolue vers sa version 0.6. Le projet, très actif et hébergé sur Google Code est maintenu par des passionnés du web et des standards actuels. 5/2011 Table des matières DOSSIER 20 Mise en œuvre de XAMPP Olivier Heurtel XAMPP est un kit d’installation qui inclut entre autres Apache, PHP et MySQL, et qui permet de mettre en place très rapidement un environnement de développement Web. Dans cet article, vous apprendrez comment installer et administrer XAMPP pour Linux, mais aussi comment développer et déployer une petite application de test utilisant une base de données MySQL. PRATIQUE 30 SQL : les vues Cilia Mauro, Magali Contensin Savoir manipuler les vues permet de limiter l’accès à un sous-ensemble de données pour une catégorie d’utilisateurs, de simplifier l’interrogation de la base et d’être indépendant du schéma relationnel en cas de modification de ce dernier. 35 Créer son site internet avec le CMS eZ Publish Jean-Luc Nguyen Créer un site internet, qu’il soit à titre personnel ou professionnel, peut passer par le choix d’un CMS plutôt qu’un Framework. Que ce soit un blog sur un musicien qu’on apprécie, un portail institutionnel ou un site de vente de T-shirts en ligne, il est nécessaire de connaître les forces et faiblesses des CMS pour voir un jour son site internet en ligne sans problème. Dans ce cas, choisir EZ Publish peut être un choix judicieux. SÉCURITÉ 46 PF et OpenBSD adapté aux PME Beaucoup de PME ont en commun des besoins de sécurité et notamment en matière de pare-feu. Il existe de nombreux choix matériels sur le marché et les UTM ont depuis plusieurs années inondé le marché de la sécurité internet. Dans cette multitude de choix, il existe des outils Open Source en licence libre qui peuvent parfaitement convenir aux PME, couvrir 100% de leurs besoins, tout en étant simples à configurer. Actualités Tour PHP 2011 L’AFUP (Association française des Utilisateurs de PHP) ont annoncé le premier Tour PHP 2011 à Euratechnologie de Lille le 24 et 25 novembre 2011. A cette occasion, un appel à conférencier a été lancé avec comme thématique principale : le commerce en ligne, l’intégration d’applications hétérogènes au sein des systèmes d’informations, l’échelle du web. http://afup.org/pages/phptourlille2011/ Nginx 1.0 Nginx est un serveur HTTP libre, open source et haute performance, dont la version 1.0 vient de sortir après de nombreuses années de développements. Il permet de faire tourner de nombreux langage comme PHP. Certaines plateformes l’utilisent comme Wordpress, Github. Enfin, Nginx est classé en 3eme position au niveau des baromètre serveur. http://nginx.org/ Phrozn Phrozn est un projet PHP, dont le but est de vous permettre de générer un site statique en PHP. Il offre de nombreuses possibilités pour l’intégrer dans les moteurs de template comme Smarty, tout en gardant la main sur les fichier CSS, JS, HTML. http://www.phrozn.info/en/ PHPMyCom 2.0 MyPhpCom est une application réalisée en PHP, MySQL et Ajax. Il s’agit d’un système de gestion de commentaires. Cette version se veut la plus simple possible pour vous permettre de l’installer facilement dans votre projet web. Elle propose un captcha, un système de pagination, les URLs cliquables... http://www.phpcs.com/codes/MYPHPCOM-SYSTEME-COMMENTAIRE-PHPMYSQL_52995.aspx Dolibarr 3.0 La nouvelle version ERP/CRM Dolibarr, vient de sortir. Elle apporte de nombreuses évolutions et nouveautés comme l’amélioration de la sélection des plugins, de l’installation, de l’utilisation, et de la programmation. Par ailleurs, l’organisation des lignes a été modifiée et de nouveaux modules sont disponibles. http://www.dolibarr.org/ Sismo Le projet sismo est un serveur de tests en continu, écrit en Fabien Potencier (créateur du framework symfony) en PHP et nécessite une version PHP 5.3.3 minimum, pour vous permettre d’effectuer des tests. Par ailleurs, il a été optimisé pour fonctionner aussi bien sur un serveur local, que sur un serveur distant. Son but consiste àe vous aider dans la livraison de paquets de développement et sera un outil complémentaire à votre serveur d’intégration continue. Lors de son utilisation, vous pourrez l’associer à tous vos COMITs. La configuration nécessite juste de mettre le fichier dans le bon dossier de votre projet et il s’occupera d’effectuer le reste. L’interface web qui vous est proposée, vous sera utile, si vous le souhaitez, lors de son installation et de son utilisation. Le site officiel du projet propose un tutoriel et un exemple d’utilisation pour vous faciliter l’utilisation http://sismo-project.org/ Technologies utilisées Lors de la navigation, vous pouvez vous retrouver devant un site web qui vous impressionne. Un des premiers réflexes consistent à regarder et analyser les différentes pages par l’intermédiaire des fichiers sources. Mais souvent la technologie ou le langage utilisé n’est pas toujours évident à détecter. Wappalyzer est une extension compatible avec les navigateurs Mozilla Firefox et Google Chrome. Grâce à celle-ci, vous allez repérer facilement différents critères : • Le type de CMS utilisé, les webs frameworks ou JS, les vidéo players, des widgets, etc • Des logiciels applicatifs ou la présence d’applications extérieures ou webs services Bien sûr, vous pourrez aussi connaître d’autres secteurs comme le e-commerce, le type de javascript, les outils d’analyses, les bases de données et beaucoup d’autres informations utiles. L’ensemble du résultat est disponible directement dans votre navigateur et ainsi vous évitez des opérations manuelles. http://wappalyzer.com/ Rédaction des actualités : Christophe Villeneuve 6 5/2011 Premier intégrateur européen de solutions open source née l'an née l'an Élu Part en europée n re i a de européen re i a de Élu Part en Smile c'est aujourd'hui 500 collaborateurs, 11 agences et 18 domaines d'expertise. Spécialiste reconnu ! Spécialiste reconnu ! Smile recrute 200 personnes en 2011. Passionnés des technologies du web et de l’open source ? Rejoignez nous ! open source www.smile.fr Paris Lyon Nantes Bordeaux Montpellier Aix Barcelone Kiev Genève Casablanca Amsterdam Interview Interview de François-Xavier Bois, Directeur associé de Kernix Software François-Xavier Bois Directeur associé de Kernix Software PHP Solutions : Bonjour, pourriez-vous nous dire quelques mots sur vous et votre entreprise ? François-Xavier Bois : Je me présente, François-Xavier Bois, ingénieur en Sciences Cognitives et Intelligence Artificielle, dirigeant et co-fondateur de Kernix, société que j’ai créée avec mon associé, Fabrice Métayer, il y a 10 ans alors que nous étions tous 2 en dernière année à l’EPITA. Notre structure compte aujourd’hui une trentaine de collaborateurs tous spécialistes dans leur domaine. Notre parti pris a toujours été de maitriser à 100% nos réalisations en ne faisant appel ni au offshore ni à des profils indépendants. Nous disposons ainsi d’une structure à taille humaine solide en mesure de s’attaquer à tout projet web quelle que soit sa dimension et sa complexité. Alors que mon associé assure les directions financière et commerciale, je suis pour ma part responsable de la division R&D et ai obtenu que Kernix soit agréée Centre de Recherche par le Ministère de la Recherche. Au sein de ce pôle je suis l’architecte principal du framework web KWO (Kernix Web Object) que nous enrichissons à un rythme soutenu depuis la naissance de Kernix. Passionné par le web et son écosystème, j’ai eu l’occasion d’écrire 6 ouvrages consacrés au PHP et à MySQL. Le dernier en date, publié chez Eyrolles en décembre 2010, est consacré à WordPress3. PS : Quels sont aujourd’hui les services que Kernix proposent à ses clients ? FXB : Le cœur de notre activité est le développement d’applications web surmesure. Disposer de notre framework nous permet de coller au plus prés des besoins de nos clients tout en assurant des délais de réalisation les plus compacts possibles. Notre intervention ne se limite cependant pas au développement ; nous accompagnons le client durant toute la phase d’exploitation de son site en incluant dans notre offre l’hébergement, le référencement et la maintenance. Nous disposons également d’un studio de créa en interne et sommes ainsi en mesure de proposer le design du site. PS : Pourriez-vous raconter à nos lecteurs sur quels projets vous êtes en train de travailler ? FXB : Kernix intervient en ce moment sur trois typologies d’applications web : des réseaux sociaux, des moteurs de recherche, liés à géolocalisation et aux Google Maps, et des boutiques e-commerce. Lauréat en 2009 de l’appel à projet WEB2.0 organisé par le Secrétariat d’Etat chargé de la prospective et du développement de l’économie numérique, Kernix est également en train de réaliser un portail référençant tous les lieux disposant d’installations acces- 8 5/2011 Interview sibles aux handicapés en France. La base de données qu’exploitera ce site sera ouverte et accessible via des webservices. PS : Comment vous différenciez-vous ? FXB : En réalisant des sites et applications web depuis plus de 10 ans, Kernix a très vite pu détecter les véritables enjeux pour les sites web professionnels. Les notions de robustesse, de sécurité et d’évolutivité sont au cœur de nos développements. Un développeur ne conçoit pas de la même façon une interface qui liste quelques centaines d’éléments ou plusieurs dizaines de millions. De la même manière, un site disponible dans une seule langue ne pourra être conçu comme un site multilingue. Kernix dispose désormais d’une longue expérience dans la conception de sites critiques et complexes. Nos clients, dont l’activité repose de plus en plus souvent à 100% sur nos outils, peuvent compter sur nous et faire appel à tout moment à nos équipes pour faire évoluer l’applicatif ou l’infrastructure. PS : Quel est selon vous l’avenir de PHP dans le monde web ? FXB : Les qualités qui ont fait la force de PHP sont toujours présentes aujourd’hui, qu’il s’agisse de l’extrême simplicité du langage, de sa rapidité d’exécution, de sa stabilité ou de sa sécurité intrinsèque. Le tour de force est d’être parvenu à les maintenir tout en enrichissant le langage de fonctionnalités avancées telles que le Late State Binding, les closuresou les namespaces. Ces fonctionnalités permettent de concevoir des frameworks web (Zend, KWO, Symphony) de haut niveau qui sont désormais à la base de tout projet web d’envergure. PS : Aucun regret ? FXB : Le manque de visibilité sur les évolutions et l’avenir du langage à moyen et long terme est ma principale inquiétude vis-à-vis de PHP. Quelle solution va être proposée pour une gestion sérieusede l’unicode ? Quid de PDO qui devait être au cœur de tous les développements liés aux bases de données ? Quand pouvons-nous espérer voir le compilateur d’opcode APC faire son entrée dans le tronc commun des sources ? L’essentiel de l’énergie des développeurs semble désormais être consacré aux frameworks et autres outils utilisateurs. Bien que cela ne soit pas préjudiciable pour l’instant, je pense qu’il est important de rester vigilant et de ne pas se reposer trop longtemps sur ses lauriers. PS : Pourriez-vous raconter à nos lecteurs quels outils de développement vous utilisez ? FXB : Chez Kernix, les développeurs sont libres d’utiliser les outils qu’ils souhaitent du moment que la phpsolmag.org/fr norme interne d’indentation soit respectée (il y a des sujets avec lesquels on ne rigole vraiment pas !). La majorité des développeurs, aficionados de Linux, utilise des terminaux et emacs. Nous trouvons cependant d’autres IDE ou éditeurs tels que Dreamweaver CS5, IntelliJ, Zend Development Environment ou Notepad++. Kernix n’a pas résisté au tsunami Apple et les premiers OSX commencent à faire leur apparition dans l’openspace. PS : Quels sont les projets à venir de Kernix ? FXB : En modifiant notre baseline de web application provider à digital factory nous marquons le fait que Kernix est plus qu’une agence web. Nous disposons depuis prés d’un an d’un pôle développement mobile qui conçoit des applications iPhone et Android. Notre discours vis-à-vis de nos clients est maintenant le suivant : Kernix conçoit des solutions digitales complètes qui incluent le gestionnaire central de données (le backoffice) ainsi que les différentes applications de consultation que ce soit pour le web, le mobile ou les tablettes. L’idée est une nouvelle fois de simplifier la vie du client en facilitant la gestion de données tout en faisant en sorte que ces dernières soient diffusées de la manière la plus large possible. Le support de l’HTML5 par tous les navigateurs récents est une opportunité magnifique de proposer des interfaces plus ergonomiques à nos utilisateurs. Nous sommes à ce titre en train de finaliser la refonte complète de notre backoffice autour de cette technologie. PS : Quelles sont vos perspectives de recrutement cette année ? FXB : La croissance de Kernix s’est particulièrement accélérée ces deux dernières années. Nous sommes en permanence à la recherche de profils pointus dans le domaine du développement web et mobile. La maitrise de la programmation objet est essentielle. Une bonne connaissance du JavaScript est clairement un atout et le sera de plus en plus avec la montée en puissance de l’HTML5. Chefs de projets et ingénieurs avant-vente sont également des profils pour lesquels nous sommes en recherche active. Je profite également de cette tribune pour indiquer que nous sommes à la recherche d’un profil de type chercheur (postdoc) dans le domaine du datamining. PS : Merci beaucoup pour le temps que vous avez bien voulu nous accorder. FXB : Merci à PHP Solutions que j’ai le plaisir de lire tous les mois et longue vie au PHP ! 9 Interview Interview de Florent Sabourin, Responsable de l’offre e-commerce chez Smile Florent Sabourin Responsable de l’offre e-commerce chez Smile Contact : Smile 48 rue de Villiers 92300 Levallois-Perret Tél. 01 41 40 11 00 PHP Solutions : Quels sont les éléments clés à prendre en compte pour réaliser un bon site e-commerce ? Florent Sabourin : Se lancer dans l’e-commerce c’est un peu comme ouvrir un magasin, il faut étudier le marché, avoir des bons produits et les commercialiser auprès des clients. On peut regrouper tous ces aspects sous le terme «stratégie e-business», et nous pouvons assister nos clients dans ce sens pour élaborer leur stratégie, produire un cahier des charges. Une fois que les idées sont claires, vient le temps de la construction : imaginer le rayonnage, le placement des produits, les têtes de gondoles, les couleurs de l’enseigne... Sur le web nous avons des ergonomes, des graphistes et des consultants qui mettent en place ce merchandising et le valident par des tests utilisateurs. Nos ingénieurs intègrent les écrans et fonctionnalités imaginées, mettent en place des outils comme Magento qui permettront au marchand d’animer le catalogue, faire des promotions, gérer les ventes, la logistique, le paiement en ligne, le SAV... et bien entendu, connectent la plateforme Web au système d’information en place (ERP, CRM). Nous intervenons également pour former les utilisateurs, ou les développeurs à la plateforme ainsi construite. Malgré tout, la réussite d’un commerce en ligne n’est pas uniquement liée à sa bonne conception : il faut des clients, et des clients contents. Nos consultants en e-marketing appuyés par nos partenaires travaillent sur la médiatisation du site (affiliation, référencement, réseaux sociaux) et proposent des solutions pour améliorer la dimension sociale du shopping. Challenge réussi : vous avez des milliers ou millions de visiteurs... En pleine période de soldes, il faut aussi être certain que la quantité de clients attirés ne trouble pas la bonne marche de la boutique (on voit souvent aux JT des clients jouer des coudes pour rentrer le premier). Sur le web, le phénomène n’est pas visible mais la problématique reste la même : il faut absorber ce trafic. Notre pôle hébergement, surveillance et exploitation maitrise particulièrement bien ce sujet. Vient le temps de l’analyse, du pilotage : si les outils d’analyse sont excellents pour mesurer le comportement des internautes, nous proposons également de les coupler avec des solutions de Business Intelligence qui offrent une grande liberté dans l’analyse des données, des clients, des ventes, de la qualité de service... Et cela dans un but unique : améliorer en permanence la performance commerciale de la e-boutique. En synthèse nous aidons nos clients à lancer leur activité, mettre en place leur boutique, se faire connaitre et piloter ce canal de vente en vogue. PS : Pourquoi avoir fait le choix de l’Open Source ? FS : Les solutions open source, lorsqu’elles sont matures (et c’est le cas pour le e-commerce) offrent un très grand nombre d’avantages pour nos clients. On 10 5/2011 Interview parle souvent du prix qui est bien évidemment un critère de choix important. Mais s’il est vrai qu’une solution open source est très souvent moins couteuse qu’une solution propriétaire, ce n’est pas pour nous l’unique argument à retenir. Le monde du e-commerce va vite, très vite. Des nouveautés, il en sort tous les jours et les e-commerçants doivent se maintenir à la page pour rester concurrentiels. Prenons par exemple Google Shopping qui est arrivé en France cette année. Les premiers outils à avoir offert des fonctions d’export natives vers le moteur de Google étaient des solutions open source (Magento notamment). Et ce, grâce à la réactivité et à la taille de la communauté entourant l’outil. Pas question, sur ce genre de fonctionnalités valorisant les primo-entrants, d’attendre qu’un éditeur intègre cette fonctionnalité à sa roadmap et la publie deux, trois voire six mois plus tard ! Vient ensuite la question de la pérennité. L’émergence de solutions open source portées par des éditeurs (des sociétés à but lucratif donc) permettent aujourd’hui aux sociétés les plus réticentes de trouver un modèle alternatif combinant le meilleur des deux mondes : l’ouverture et le support communautaire d’un côté et la présence de forces de production dédiées à maintenir et à faire évoluer l’outil de l’autre. PS : Quelles sont les principales références clients de l’offre e-commerce Smile, les grands projets menés récemment ? FS : En 2009, nous avons mis en ligne le site marchand du Furet du Nord (www.furet.com), une des plus grandes librairies d’Europe basée dans le nord de la France. Cette boutique en ligne réunit plus de 1 400 000 références et reste encore aujourd’hui le plus gros catalogue jamais mis en ligne sous Magento. C’était un challenge technique passionnant ! Nous avons également accompagné dans la refonte de son site e-commerce le multi-spécialiste de l’équipement public camif-collectivites.fr. Fin 2010, nous avons mis en ligne le site des grandes marques comme La Halle, Minelli, le célèbre libraire Gibert Joseph ou encore le savoyard SnowLeader.com (matériels, vêtements et chaussures lifestyle). Début 2011 nous sommes fiers d’avoir mis en ligne le premier site marchand d’un réseau d’opticiens : Krys (www.krys.com). Nous venons également de sortir le nouveau site de la marque de lingerie Darjeeling (www. darjeeling.com). Beaucoup d’autres beaux projets sont à venir en 2011. PS : Quels outils préconisez-vous ? FS : Magento est le leader incontesté sur le marché des solutions e-commerce open source. Nous avons un excellent pôle de compétence sur ce produit et réalisons la plupart de nos sites avec cette solution. phpsolmag.org/fr Prestashop avec ses dernières versions devient une alternative très sérieuse, nous suivons ce produit de près depuis 2008 et commençons à l’intégrer. D’autres solutions comme RBSChange ou encore Drupal Commerce - sur lesquelles nous comptons à l’avenir - sont suivies par notre équipe de veille technologique. Pour en savoir plus vous pouvez télécharger gratuitement notre livre blanc sur le sujet sur www.smile.fr. PS : Comment expliquez-vous le succès de ces deux solutions ? FS : Les deux solutions sont sorties à peu près à la même époque (premier semestre 2008) et ont comblé un vide dans l’offre open source laissé par un OsCommerce techniquement en déclin et à la communauté déchirée entre un nombre incalculable de forks. Magento, lors de sa sortie a bénéficié d’un buzz absolument incroyable sans grands efforts de la part de Varien (éditeur de Magento). La qualité intrinsèque de l’outil, tant sur le plan ergonomique, technique et fonctionnel a permis à Magento de décoller instantanément et d’installer en un temps record une base d’utilisateurs suffisante pour attirer l’attention de sociétés plus importantes. En France, c’est Discounteo qui a franchit le pas en premier, ouvrant la voie à de nombreuses autres grandes implémentations. Prestashop a mis un peu plus de temps à démarrer. La solution est sortie légèrement après Magento et a longtemps souffert d’une image plus amateur à côté de son aîné américain. Mais l’éditeur français à déployé des efforts colossaux pour mettre à niveau sa solution et bénéficie aujourd’hui d’une incroyable base de boutiques installées dans le monde. S’il fallait désigner un vrai successeur à OsCommerce, c’est bien Prestashop ! PS : Quelles sont les perspectives pour l’année 2011 sur le marché de l’e-commerce et pour Smile en particulier ? FS : Smile travaille d’ores et déjà à la construction et à la refonte de e-boutiques pour des marques ou des distributeurs qui verront le jour d’ici les prochains mois. Nous pensons que le marché du m-commerce, via les smartphones, va continuer de croître et prendre une place importante dans les usages d’Internet. Nos équipes travaillent sur le développement d’applications mobiles et de sites mobiles pour accompagner les clients de nos clients. Comme j’ai pu en parler précédemment, le Social Shopping est clairement un axe de développement fort pour nos clients, notamment les marques. L’arrivée de la Freebox 6 baptisée Révolution et l’amélioration globale des boitiers TV rendent actif le consommateur et laisse penser que le T-commerce va être un concept à exploiter dans quelques années. 11 Outils Les solutions Cloud à l’usage d’Ikoula Ikoula, hébergeur informatique depuis 1998, est le leader du Cloud Computing en France. Avec plus de 8 000 machines virtuelles en production et plusieurs années d'expérience dans la virtualisation, Ikoula développe des solutions de Public et de Private Cloud, comme la VM à 1€ et Hosted Exchange 2010, via un panneau de contrôle administré en toute liberté par le client... La VM à 1€, un serveur dédié virtuel 100% flexible La VM à 1€ a été conçue pour apporter aux utilisateurs un maximum de flexibilité et d’élasticité dans la consommation de leurs ressources. Elle inclut une franchise à 1€ comprenant : o 512 Mo de RAM o ½ CPU o 40 Go d’espace disque o 240 Go de données entrée/sortie o 128 Kb/s de bande passante entrante et 512Kb/s de bande passante sortante Ce sont ces mêmes indicateurs qui sont ensuite facturés selon leur surconsommation ; chacun possédant son propre prix. La VM à 1€ : comment ça marche ? Avant de souscrire à la prestation, l’utilisateur a la possibilité d’estimer ces coûts de consommation mensuels via une calculatrice conçue spécialement pour cet usage (disponible sur http://express.ikoula.com/vm). Lors de sa souscription, l’utilisateur définit un plafond maximum de consommation pour deux indicateurs : la RAM (disponible en 512 Mo, 758 Mo, 1024 Mo ou 2048 Mo) et le disque dur (100 ou 200 Go). Si ces quantités sont dépassées dans le mois, la VM s’ajuste automatiquement d’elle-même, aucune manipulation n’est nécessaire. L’utilisateur choisit ensuite son système d’exploitation parmi les dernières versions disponibles sous Windows : Web Edition 2008 R2, Standard Edition 2008 R2, Data Center Edition 2008 R2, Enterprise Edition 2008 R2… Le coût des licences n’est pas facturé ! La VM est disponible en quelques minutes ! L’utilisateur a la possibilité de consulter ces en-cours de consommation en temps réel via une interface conçue spécialement pour les offres Cloud Computing d’Ikoula. La VM à 1€ : pour quel type d’utilisation ? La VM à 1€ est idéale pour des opérations ponctuelles du type événementiel, calculs intensifs, opérations marketing, web, jeux… Elle peut s'élargir sur la période correspondante et retrouver une taille plus "standard" à son échéance. Elle est donc totalement flexible et modulable. 12 5/2011 Les solutions Cloud à l’usage d’Ikoula Exchange 2010, la solution de messagerie pour les revendeurs L’offre Hosted Exchange 2010 d’Ikoula connaît une double particularité : la possibilité de revendre la solution en marque blanche et de se constituer des comptes sur-mesure. Avec la plate-forme EX10, vous êtes le seul maître à bord Pour permettre à ses clients de devenir eux-mêmes revendeurs de la solution, Ikoula a développé une interface de gestion facile d’utilisation et intuitive, à travers laquelle il est possible de gérer et de paramétrer l’ensemble des fonctionnalités proposées par Exchange 2010. Ainsi, création de comptes de messageries, d’utilisateurs, partage d’agendas, de calendriers, accès webmail… sont sous le contrôle du revendeur, qui a une utilisation illimitée des fonctionnalités selon le pack choisi chez l’hébergeur. Créez vos comptes sur-mesure Ikoula propose deux packs ayant chacun des fonctionnalités plus ou moins avancées ; l’utilisateur pouvant changer de pack comme il le souhaite ou payer uniquement les ressources dont il a besoin en supplément (espace de stockage et synchronisation mobile). Le Pack Pro : pour profiter des fonctions standards d’Exchange (POP, IMAP, partage des ressources…) tout en ayant la possibilité de souscrire à des options payantes comme MAPI ou la synchronisation mobile… A partir de 0,99€/compte. Le Pack Entreprise : pour utiliser la version complète d’Exchange 2010, avec toutes les fonctions indispensables permettant la délégation des ressources, la synchronisation mobile, ou encore l’utilisation du MAPI ou du mode déconnecté. A partir de 2,99€/compte. Sont respectivement inclus 1Go et 2Go de stockage, avec la possibilité d’augmenter l’espace à sa guise (coût au Go supplémentaire). « Exchange 2010 a été une réponse à un véritable besoin. Chaque personne a une utilisation bien spécifique de son compte de messagerie et n’a pas forcément besoin de 25 Go ! Grâce à EX10, les utilisateurs ne paie que le nécessaire et peuvent réajuster leur stockage à tout moment. » Jules-Henri Gavetti, Président d’Ikoula LES AVANTAGES IKOULA o o o o o Toutes les questions/réponses sur Exchange 2010 disponible en ligne Antispam et antivirus inclus Offre découverte : 1 mois d’Hosted SharePoint offert (100 Mo, 1 site, 1 utilisateur) Des vidéos et une documentation complète pour guider l’utilisateur dans la découverte et l’utilisation de l’interface de gestion EX10 Une infrastructure haute disponibilité avec des équipements redondants phpsolmag.org/fr 13 Projets dompdf : créez des PDF à la volée à partir de HTML DOMPDF est une bibliothèque écrite en PHP qui permet de générer des documents PDF à partir de pages web au format HTML, mises en formes avec des feuilles de style CSS. Le respect des standards est le maître mot de cet outil, qui évolue vers sa version 0.6. Le projet, très actif et hébergé sur Google Code est maintenu par des passionnés du web et des standards actuels. Cet article explique : Ce qu’il faut savoir : • • • • • • Des notions sur les technologies Web. • Des notions de Programmation Orientée Objet. La présentation du projet dompdf. Comment utiliser dompdf ? Fonctionnement de dompdf. Des exemples de productions PDF. dompdf et les CMS. d ompdf est un convertisseur de HTML vers PDF écrit en PHP, qui essaie de respecter au mieux les styles CSS tout en assurant des fonctionnalités utiles pour l’impression (saut de page, numéro de page, couleurs CMJN, formats de page, résolution des images, etc). Le principe de cette bibliothèque est de parcourir les feuilles de style externes ou inline, les balises, et les attributs des éléments HTML pour ensuite les insérer dans le document PDF résultant. Il supporte également la plupart des attributs de présentation pour rester com� patible avec les documents HTML sans styles CSS mais dont la mise en forme passe par des attributs HTML 4. Cette bibliothèque a longtemps été à l’abandon sur SourceForge, mais elle est depuis plus d’un an main� tenant hébergée sur Google Code (http://code.google. com/p/dompdf/) où elle est actuellement maintenue par de nouveaux développeurs. Ce projet s’adresse aux développeurs Web qui de pré� férence travaillent sur un projet libre en PHP, et qui veulent convertir des pages simples ou des documents complexes de manière à ce qu’ils respectent au mieux les standards du W3C. Je ne cache pas que DOMPDF comporte en� core quelques lacunes, du fait qu’il est encore jeune, no� tamment quelques problèmes de performances dans des documents trop complexes, mais la dernière version beta sortie il y a un mois en corrige une partie. Le projet étant Open Source, tout le monde peut l’inclure dans son projet et vendre son produit par la 14 suite. En effet, si ce dernier respecte la licence (GNU GPL) cela permet à l’auteur la vente de ses logiciels à����������������������������������������������������� condition de fournir aussi le code source, garantis� sant juste des libertés sur l’œuvre une fois celle-ci obtenue. Actuellement le développement du projet est assuré par deux personnes : Brian Sweeney et Fabien Ména� ger. Ryan Masten, qui a relancé le projet en 2009, n’est plus très actif, et c’est donc Fabien et Brian qui gèrent le projet. D’ailleurs ils aimeraient être plus nombreux pour accélérer le développement et la sortie des versions, car le travail fourni n’est qu’en partie dans un cadre pro� fessionnel, pour corriger seulement les bugs bloquants, le reste s’effectuant durant leur temps libre. Comment utiliser dompdf ? Nous allons voir pas ��������������������������������� à�������������������������������� pas comment réaliser la conver� sion d’un fichier HTML en PDF à l’aide du langage PHP et de la bibliothèque dompdf. Commencez par créer un fichier que l’on nomme test_dompdf.html. Nous allons y inclure le code du Listing 1. Ce fichier est très simple, c’est la partie visuelle du rendu. Ainsi nous déclarons seulement un paragraphe (<p>) avec un contenu, sans style pour le moment. Nous allons maintenant entrer dans le vif du sujet avec la création du fichier PHP. Pour cela, créez un fichier que l’on nomme test_dompdf.php. Dans celui-ci nous allons mettre le code du Listing 2. 5/2011 DOMPDF La premi����������������������������������������������� è���������������������������������������������� re ligne permet d’inclure le fichier de confi� guration de dompdf dompdf_config.inc.php. Il s’occupe� ra d’inclure les classes de dompdf. Puis, on instancie la classe DOMPDF et on charge le fichier HTML. Deux mé� thodes sont possibles : load_html_file ou load_html. La premi������������������������������������������� è������������������������������������������ re comme son nom l’indique permet de char� ger un fichier HTML en passant en argument le fichier. Quant à la seconde, elle charge directement le contenu HTML plutôt que le fichier lui-même. Ensuite il s’agit de la configuration du format de papier ($dompdf->set_paper(„a4”, „landscape”);) que l’on dé� sire. Ici j’ai choisi le format A4 avec une orientation en pay� sage. D’autres formats sont disponibles et il est également possible de définir votre propre format en pt (point). L’avant derni������������������������������������������� è������������������������������������������ re opération traite récursivement les dif� férents éléments de la DOM du fichier HTML. Pour finir, nous envoyons le flux PDF directement vers le navi� gateur. Pour cela, nous utilisons l’instruction suivante : $dompdf->stream(„document.pdf”, array(„Attachment” => true));. Bien s���������������������������������� û��������������������������������� r vous avez la possibilité de dé� poser le fichier directement sur un répertoire de votre serveur en utilisant le code suivant : file_put_ contents(„document.pdf”, $dompdf->output());. En effet, la méthode file_put_contents permet d’écrire le contenu passé en paramètre dans un fichier. Tout un tas d’options sont possibles, pour plus de détails : http://code.google.com/p/dompdf/wiki/ Usage#Using_the_dompdf_class_directly . Et voilà, votre PDF est généré, comme le montre la Figure 1. Rien de compliqué, n’est-ce pas ? Notez que si le docu� ment avait comporté des balises <style> ou des styles inline, ils auraient été pris en compte. Fonctionnement de dompdf dompdf étant en fait un moteur de rendu HTML avec comme support un document PDF, il suit les mêmes Listing 1. Document HTML à convertir <!DOCTYPE html> <html lang=”fr”> <head> <title>Page de Test HTML - dompdf, un outil puissant pour convertir de l’HTML vers PDF en PHP</title> </head> <body> <p> Cette page <em>HTML</em> va etre convertie a l’aide de <em>dompdf</em> en <em>PDF</em> </p> </body> </html> Listing 2. Instanciation de l’objet DOMPDF require(“repertoire/de/dompdf/dompdf_config.inc.php”); $dompdf = new DOMPDF(); $filename = “test_dompdf.html” $dompdf->load_html_file($filename); // OU si vous avez acces au contenu HTML plutot qu’au fichier HTML lui-meme //$dompdf->load_html($html); // d’autres formats sont dispo, il est aussi possible de définir un format en “pt” $dompdf->set_paper(“a4”, “landscape”); $dompdf->render(); // Si vous voulez le faire télécharger par le navigateur $dompdf->stream(“document.pdf”, array(“Attachment” => true)); // OU si vous voulez le mettre dans un ficher sur le serveur // file_put_contents(“document.pdf”, $dompdf->output()); phpsolmag.org/fr 15 Projets principes qu’un moteur de rendu HTML classique, tout en utilisant ce que PHP lui met à disposition. Le processus peut se résumer en quelques étapes malgré sa complexité : • le document HTML est chargé par l’extension DOM de PHP, un arbre DOM est alors construit, • un arbre de Frames est construit, à����������������� ������������������ l’image de l’ar� borescence des éléments de la DOM, ces Frames sont les briques de base de dompdf, et gardent un lien vers leur élément de DOM correspondant, • la feuille de style CSS par défaut (qui était d’ailleurs à la base une copie de celle de Mozilla Firefox 1.0) et toutes les feuilles de styles trouvées dans les do� cuments et les styles inline sont alors parcourus et analysés par un Parser de CSS, • une fois les feuilles de style analysées, tous les sélecteurs CSS sont transformés en expressions XPath pour créer un Style pour chaque Frame en passant par l’arbre DOM du tout départ et son mo� teur Xpath, • chaque Style permettra de définir à quel type de FrameReflower, FramePositioner et FrameDecorator seront associées chaque Frame. Ces trois élé� ments seront le ciment qui feront correspondre les briques Frame. Nous détaillerons un peu plus tard leurs différences, • tout est maintenant pr����������������������������� ê���������������������������� t pour laisser la magie opé� rer : on lance le reflow de la Frame racine, qui va récursivement lancer celui des autres Frames, • à la fin du reflow de chacune des Frames, un Renderer est créé en fonction encore une fois du style : c’est la peinture du mur de briques. C’est à������� �������� ce mo� ment là que dompdf écrit dans le fichier PDF, • à chaque changement de page, les Frames, leur élément de DOM et leur FrameReflower, FramePositioner, FrameDecorator et Renderer sont détruits pour récupérer des ressources. Une grande partie de ces principes provient du site du W3, notamment http://www.w3.org/TR/CSS2/visuren.html et http://www.w3.org/TR/CSS2/visudet.html. Nous avons vu que chaque Frame avait ces trois com� posants de ciment : FrameReflower, FramePositioner et FrameDecorator. Chacun d’entre eux a la même importance et forme un tout pour réaliser un rendu correct. Le choix de cha� cun de ses types est déterminé par le style qui leur est appliqué, notamment leur display. Plutôt qu’un long dis� cours, le Listing 3 présente une partie du code du FrameFactory de dompdf qui s’occupe de faire ces choix. Commençons par le Reflower. Celui-ci va définir comment chaque Frame va pousser ou encore faire descendre chacun de ses frères ou ses descendants. Par exemple un élément de type block ne prendra pas la même place qu’un élément de type inline. La largeur, la hauteur ou les marges par exemple seront des styles déterminants pour cet aspect du rendu. Ensuite vient le Positioner. Celui-ci définit où sera placé la Frame, par rapport à ses ancêtres et ses frères. Pour cet aspect du rendu, le style position ainsi que les top, right, bottom et left seront à prendre en compte, entre autres. Et le dernier composant du ciment : le Decorator, c’est lui qui contient par exemple les informations de disposition des lignes de texte d’un élément de type bloc, ou encore les fonctions de découpage des élé� ments inline ainsi ce que le soulignement des textes ou leur alignement. Ce composant agit au sein même de chaque Frame, à un niveau encore plus bas que la brique, pour obtenir un bon layout. Le Renderer quant ������������������������������� à������������������������������ lui va passer un coup de pin� ceau sur le mur. C’est par ce processus que sera des� siné le fond des éléments, leurs bords, les textes et les images. C’est aussi par lui que vont passer les balises JavaScript que l’on peut inclure, et aussi les scripts PHP inline (http://code.google.com/p/dompdf/wiki/ Usage#Inline_PHP_support). C’est lors du Rendering que l’écriture du document PDF est effectuée. Pour l’écriture du document PDF, dompdf propose une option qui permet de choisir quel moyen utiliser (nous appellerons ceci des backend). Trois choix sont disponibles actuellement : • la bibliothèque Cpdf, par défaut, qui est embarquée avec dompdf et écrite en pur PHP, Figure 1. Résultat de la conversion de l’HTML vers PDF 16 5/2011 DOMPDF Listing 1. Document HTML à convertir $style = $frame->get_style(); switch ($style->display) { case “block”: $positioner = “Block”; $decorator = “Block”; $reflower = “Block”; break; case “inline-block”: $positioner = “Inline”; $decorator = “Block”; $reflower = “Block”; break; case “inline”: $positioner = “Inline”; if ( $frame->get_node()->nodeName === “#text” ) { $decorator = “Text”; $reflower = “Text”; } else { if ( $style->float !== “none” ) { $decorator = “Block”; $reflower = “Block”; } else { $decorator = “Inline”; $reflower = “Inline”; } } break; case “table”: $positioner = “Block”; $decorator = “Table”; $reflower = “Table”; break; case “inline-table”: $positioner = “Inline”; $decorator = “Table”; $reflower = “Table”; break; case “table-row-group”: case “table-header-group”: case “table-footer-group”: $positioner = “Null”; $decorator = “Table_Row_Group”; $reflower = “Table_Row_Group”; break; case “table-row”: $positioner = “Null”; $decorator = “Table_Row”; $reflower = “Table_Row”; break; phpsolmag.org/fr case “table-cell”: $positioner = “Table_Cell”; $decorator = “Table_Cell”; $reflower = “Table_Cell”; break; case “list-item”: $positioner = “Block”; $decorator = “Block”; $reflower = “Block”; break; case “-dompdf-list-bullet”: if ( $style->list_style_position === “inside” ) $positioner = “Inline”; else $positioner = “List_Bullet”; if ( $style->list_style_image !== “none” ) $decorator = “List_Bullet_Image”; else $decorator = “List_Bullet”; $reflower = “List_Bullet”; break; case “-dompdf-image”: $positioner = “Inline”; $decorator = “Image”; $reflower = “Image”; break; case “-dompdf-br”: $positioner = “Inline”; $decorator = “Inline”; $reflower = “Inline”; break; default: case “none”: $positioner = “Null”; $decorator = “Null”; $reflower = “Null”; break; } $position = $style->position; if ( $position === “absolute” ) $positioner = “Absolute”; else if ( $position === “fixed” ) $positioner = “Fixed”; // Ensuite, les 3 variables $positioner, $decorator et $reflower sont utilisées pour instancier les objets 17 Projets Figure 2. Support des transformations 2D CSS Figure 3. Quelques types de border supportés 18 5/2011 DOMPDF Sur Internet • • • • • http://www.blog-nouvelles-technologies.fr/archives/2249 – Article complet sur dompdf, http://www.dompdf.com - Le site web du projet, http://code.google.com/p/dompdf/source/checkout – Fichiers source du projet, http://pxd.me/dompdf/www/examples.php – Démonstration en ligne, [email protected] – Adresse de l’auteur de l’article pour toutes questions ou remarques. • la PDFLib, gratuite et limitée ou payante et tr������ è����� s ra� pide (car c’est une extension PHP écrite en C), • ou bien GD, qui permet de faire le rendu sur une image (PNG, JPEG ou GIF). Ce choix limite le rendu à���������������������������������������� ����������������������������������������� 1 page cependant, et est encore expéri� mental. Dans la plupart des cas, Cpdf est suffisant, et c’est lui qui est le mieux maintenu. La PDFLib peut aussi être utilisée si le prix de la licence ne vous freine pas. Et voilà ! Le document est complètement écrit, et vous connaissez maintenant le fonctionnement de dompdf, dans les grandes lignes. A titre d’information, aujourd’hui, ce projet totalise plus de 28 000 lignes de code PHP (d’après les stats Ohloh : https://www.ohloh. net/p/dompdf/analyses/latest). Exemples de productions PDF Une page d’exemples est mise ��������������������� à�������������������� disposition par Fa� bien, vous permettant de tester tous les exemples four� nis avec la librairie dans la version du trunk svn. Voici deux exemples de PDF générés par la librairie dompdf : Conclusion La communauté de dompdf s’étend régulièrement, et le projet mûrit par la même occasion. La ligne de conduite principale de ce projet est de rester toujours le plus res� pectueux des recommandations du W3C, en utilisant tout ce qui est disponible tant au niveau des normes CSS que du format PDF pour donner un résultat im� peccable. Afin d’y arriver encore mieux et d’accélérer le rythme de développement, l’équipe est pr��������� ê�������� te à���� ����� ac� cueillir de nouveaux contributeurs. Bien sûr, si vous n’avez pas le courage de plonger dans le code de cette biblioth����������������������������������������� è���������������������������������������� que mais que vous voulez quand m�������� ê������� me don� ner un coup de pouce, toutes les remarques seront les bienvenues. D’ailleurs si vous voulez retrouver le live tweet du projet dompdf, ce dernier vient tout juste de s’inscrire sur Twitter. N’hésitez pas à������������������������������ ������������������������������� le suivre pour toute informa� tion : @dompdf. Je tiens à remercier Fabien Ménager, travaillant également à Openxtrem, geek à ses heures perdues, passionné du Web et de nombreux projets Web Open Source, qui m’a aidé à réaliser cet article. • Support des transformations 2D CSS (Figure 2). • Quelques types de border supportés (Figure 3). Dompdf et les CMS Une bibliothèque n’a que peu d’intérêt si elle n’est pas utilisable dans les systèmes de gestion de contenus, blogs, ou frameworks existants. C’est pour cela que des plugins sont disponibles pour quelques-uns de ces sys� tèmes : • Symfony : http://www.symfony-project.org/plugins/ sfDomPDFPlugin, • Drupal : http://drupal.org/project/print, • SPIP : http://www.spip-contrib.net/3719, • Typo3 : http://typo3.org/extensions/repository/view/ ke_dompdf/current/, • Code Ingniter : http://codeigniter.com/wiki/PDF_ge� neration_using_dompdf/. D’autres plugins sont sûrement disponibles pour le système que vous utilisez s’il n’est pas dans cette liste. Si un plugin n’existe pas, quelqu’un y a sûrement déjà pensé et peut-être écrit un article sur son blog ! phpsolmag.org/fr YOHANN POIRON Autodidacte en matière de développement de sites en PHP, j’ai toujours poussé ma curiosité sur les sujets et les actualités du Web. C’est ainsi que j’ai récemment créé un blog me permettant de parler de ma veille personnelle et de mon quotidien professionnel autour des réflexions et commentaires sur les thèmes des nouvelles technologies, des services innovant, du développement, de l’interopérabilité dans le domaine médical, des réseaux sociaux et du buzz marketing. http://www.blog-nouvelles-technologies.fr Je suis actuellement engagé en tant que responsable interopérabilité et développeur Web pour la société Openxtrem pour laquelle je réalise des développements permettant de commercialiser le système en tant que pur EAI (Enterprise Application Integration) pour les structures de santé, en faisant l’extraction des fonctionnalités ‚métier’ (bloc, plan de soins, etc...). http://www.openxtrem.com 19 Dossier Mise en œuvre de XAMPP XAMPP est un kit d’installation qui inclut entre autre Apache, PHP et MySQL, et qui permet de mettre en place très rapidement un environnement de développement Web. Dans cet article, vous apprendrez comment installer et administrer XAMPP pour Linux, mais aussi comment développer et déployer une petite application de test utilisant une base de données MySQL. Cet article explique : Ce qu’il faut savoir : • L’installation de XAMPP pour Linux. • L’administration de XAMPP pour Linux (démarrage, arrêt, sauvegarde). • Le développement d’une petite application qui accède à une base de données MySQL. • La sécurisation de XAMPP pour Linux. • Les commandes de base sous Linux. • Les base de la programmation HTML, PHP et SQL. Présentation de XAMPP Pour développer une application PHP, il est souvent nécessaire de disposer d’un environnement compor� tant au minimum Apache, MySQL et PHP, mais aussi d’autres briques logicielles pour la génération de do� cuments PDF, la manipulation de données XML ou le traitement d’images. M���������������������������������� ê��������������������������������� me si l’installation et la confi� guration de ces différents produits n’est pas difficile en soi cela nécessite un peu de temps. XAMPP est un kit d’installation d’Apache gratuit qui contient justement tous les produits nécessaires aux besoins les plus courants. Ce kit est diffusé par Apache Friends, un projet sans but lucratif destiné à promouvoir le serveur Web Apache. Figure 1. Le logo de XAMPP 20 XAMPP présente de nombreux atouts : • Il est très facile à installer (télécharger, décompres� ser, démarrer). • Il incorpore un très grand nombre de produits et d’outils utiles pour le développement. • Il propose quelques petits programmes d’exemples. • Le projet est vivant et propose très régulièrement de nouvelles versions incluant les mises à jours ré� centes des différents produits. XAMPP est formes : disponible pour plusieurs plates- Figure 2. Le répertoire d’installation 5/2011 XAMPP Figure 3. Démarrage de XAMPP pour Linux • Linux (testé sous Ubuntu, SuSE, RedHat, Mandriva et Debian), • Windows (2000, 2003, XP, Vista et 7), • Solaris SPARC (version 10), • Mac OS X (version 10.4 pour Intel & PPC), encore en version bêta. Dans cet article, nous nous intéresserons à la mise en œuvre de XAMPP pour Linux, et plus précisément la version 1.7.4 sortie fin janvier 2011. Cette derni������� è������ re in� clut notamment les produits suivants : • • • • • • • • • • • • • • • Apache 2.2.14 MySQL 5.1.41 PHP 5.3.1 Perl 5.10.1 ProFTPD 1.3.2c phpMyAdmin 3.2.4 OpenSSL 0.9.8l GD 2.0.1 Freetype 2.1.7 libjpeg 6b libpng 1.2.12 gdbm 1.8.0 zlib 1.2.3 expat 1.95.2 Sablotron 1.0 Figure 4. Démarrage de XAMPP pour Linux phpsolmag.org/fr • • • • • • • • • • • libxml 2.7.6 libxslt 1.1.26 Ming 0.4.2 Webalizer 2.21-02 pdf class 009e ncurses 5.3 mod_perl 2.0.4 FreeTDS 0.63 gettext 0.17 IMAP C-Client 2007e OpenLDAP (client) 2.3.11 Figure 5. La page d’accueil de XAMPP pour Linux Figure 6. La page de statut de XAMPP 21 Dossier Tableau 1. Liste des exemples Nom Produits utilisés Fichier source Collection de CD PHP + MySQL + PDF cds.php Biorythme PHP + GD biorhythm.php Guest Book Perl guestbook-fr.pl Instant Art PHP + GD + FreeType iart.php Répertoire Téléphonique PHP + SQLite phonebook.php phpinfo() PHP phpinfo.php • • • • • • • • mhash library 0.8.18 mcrypt library 2.5.7 cURL 7.19.6 SQLite 2.8.17 (for PHP4 + PHP5) SQLite 3.6.16 (for PHP5 PDO SQLite) eAccelerator 0.9.5.3 FPDF 1.6 bzip2 (library) 1.0.5 Sur le site Apache Friends (http://www.apachefriends.org/fr/xampp.html), vous pouvez trouver des infor� mations sur XAMPP, télécharger la dernière version, consulter une FAQ et participer ��������������������� à�������������������� un forum de discus� sion. La derni���������������������������������������� è��������������������������������������� re version de XAMPP, ainsi que les ver� sions précédentes, sont aussi disponibles sur Source� Forge (http://sourceforge.net/projects/xampp/). Installation sous Linux Pour installer XAMPP, nous devons nous connecter en tant qu’administrateur système (root) à notre serveur. LAMPP ou XAMPP ? Auparavant ce logiciel s’appelait LAMPP, mais il a été renommé „XAMPP pour Linux” en 2003. Cela explique pourquoi le répertoire d’installation et le script de contrôle de XAMPP s’appellent lampp. Figure 7. L’application de démonstration „Collection de CD” 22 Nous allons commencer par télécharger la version 1.7.4 de XAMPP à partir du site Apache Friends : wget http://www.apachefriends.org/download.php?xampplinux-1.7.4.tar.gz Un fois le téléchargement terminé, il suffit d’extraire l’archive pour installer le produit : tar xvzf xampp-linux-1.7.4.tar.gz -C /opt Sur cet exemple, l’option -C /opt permet d’installer XAMPP sur /opt. Vous devriez obtenir l’arborescence suivante sur /opt (voir Figure 2). Il ne reste plus qu’à démarrer XAMPP (voir Figure 3) : /opt/lampp/lampp start Et voilà, c’est (déjà) fini, il ne reste plus qu’à vérifier que tout fonctionne correctement en démarrant votre navigateur préféré et en saisissant l’URL http://localhost si vous êtes en local ou http://serveur à partir d’une autre machine. Vous devriez voir apparaître une page qui permet de choisir le langage à utiliser (voir Figure 4). Cette page est affichée uniquement lors du premier acc����������� è���������� s �������� à������� XAMPP ; ������������������������������������ le langage sélectionné est mémori� Figure 8. Exemple de résultat obtenu avec l’application de démonstration „Instant Art” 5/2011 XAMPP sé sur le serveur dans le fichier /opt/lampp/htdocs/xampp/lang.tmp. Une fois le choix de la langue effectué, la page d’accueil de XAMPP devrait s’afficher (Figure 5). C’est tout bon ! Petit tour du propriétaire La page d’accueil de XAMPP La page d’accueil de XAMPP contient plusieurs liens qui permettent de vérifier l’état du logiciel, de tester les Tableau 2. Principaux répertoires et fichiers Répertoire/Fichier Contenu /opt/lampp/backup/ Répertoire de destination des sauvegardes. opt/lampp/bin/ Répertoire des exécutables et fichiers de commandes fournis avec XAMPP. Vous y trouverez par exemple les utilitaires de MySQL (mysql, mysqldump, etc.), ceux d’Apache (apachectl, htpasswd, etc.), et bien d’autres. /opt/lampp/htdocs/ Répertoire racine du serveur Web Apache (DocumentRoot). /opt/lampp/etc/ Répertoire des fichiers de configuration des différents produits (voir ci-dessous). /opt/lampp/etc/httpd.conf Fichier de configuration d’Apache. /opt/lampp/etc/my.cnf Fichier de configuration de MySQL. /opt/lampp/etc/php.ini Fichier de configuration de PHP. /opt/lampp/etc/proftpd.conf Fichier de configuration du serveur FTP ProFTPD. /opt/lampp/phpmyadmin/config.inc.php Fichier de configuration de phpMyAdmin. /opt/lampp/lampp Utilitaire de contrôle de XAMPP (présenté dans la suite). Tableau 3. Actions possibles du script /opt/lampp/lampp Action Fonction start Démarrer XAMPP (Apache, MySQL, ProFTPD et éventuellement d’autres produits). startapache Démarrer uniquement Apache (avec PHP et le support SSL, sauf si ce dernier a été explicitement stoppé auparavant avec la commande stopssl). startssl Démarrer uniquement le support SSL (et PHP) ; si le serveur Apache est lancé, il est redémarré avec le support SSL. startmysql Démarrer uniquement MySQL. startftp Démarrer uniquement ProFTPD. stop Arrêter XAMPP (Apache, MySQL, ProFTPD et éventuellement d’autres produits) stopapache Arrêter uniquement Apache stopssl Arrêter uniquement le support SSL ; si le serveur Apache est lancé, il est redémarré sans le support SSL (mais avec PHP). stopmysql Arrêter uniquement MySQL. stopftp Arrêter uniquement ProFTPD. reload Recharger XAMPP (Apache, MySQL, ProFTPD et éventuellement d’autres produits) reloadapache Recharger uniquement Apache. reloadmysql Recharger uniquement MySQL. reloadftp Recharger uniquement ProFTPD. restart Redémarrer XAMPP (équivalent de stop puis start). restartapache Redémarrer uniquement Apache (équivalent de stopapache puis startapache). security Vérifier et configurer la sécurité de XAMPP (abordé ultérieurement). php5 Activer PHP5 (actuellement sans intérêt puisque PHP 5 est activé par défaut et que c’est la seule version disponible). phpstatus Afficher la version de PHP qui est active. backup Sauvegarder XAMPP (abordé ultérieurement). panel Démarrer le panneau de contrôle graphique de XAMPP (voir ci-dessous). status Afficher le statut de XAMPP (Apache, MySQL et ProFTPD). version Afficher la version de XAMPP. phpsolmag.org/fr 23 Dossier Tableau 4. Structure de la table livres Nom Type Null Index AUTO_INCREMENT id INT Non PRIMARY Oui isbn VARCHAR(20) Oui titre VARCHAR(100) Non petits programmes de démonstration ou d’accéder aux outils. Le lien Statut affiche une page qui permet de voir ce qui est démarré ou pas (Figure 6). Le lien Sécurité affiche une page qui permet de vé� rifier le niveau de sécurité de l’installation de XAM� PP ; nous y reviendrons ultérieurement. Le Lien Documentation affichage une page contenant elle-même plusieurs liens vers les documentations officielles des principaux produits (notamment Apache, PHP et MySQL ) et vers quelques tutoriels sur PHP, HTML et Perl. Le Lien Composants affiche une page donnant la liste de tous les logiciels inclus dans la distribution, avec pour chacun d’entre eux un lien vers leur site offi� ciel respectif. tite base de données utilisée dans notre application de test. Les applications de démonstration et les outils Le panneau de contrôle graphique de XAMPP per� met d’arrêter ou de démarrer XAMMP ou l’un des trois composants principaux (Apache, MySQL, ProFTPD) ; il a l’allure présentée dans la Figure 9. Ce panneau de contrôle nécessite un environnement graphique opé� rationnel (X Window, GTK) ainsi que Python (avec les modules PyGTK et ctypes). Si le lancement du panneau avec la commande / opt/lampp/lampp ne fonctionne pas (erreur du style undefined symbol: FT_GlyphSlot_Embolden), vous pou� vez essayer de la lancer directement avec la commande XAMPP présente six applications de démonstration. Les fichiers source de ces exemples sont stockés dans le répertoire /opt/lampp/htdocs/xampp. Le lien phpinfo() affiche le résultat de l’appel à la fonction PHP phpinfo() et permet donc de voir très précisément la configuration de PHP, et notamment les extensions disponibles. XAMPP propose aussi deux outils bien pratiques, phpMyAdmin, la célèbre application Web de gestion des bases de données MySQL, ainsi que Webalizer, la non moins célèbre application d’analyse du trafic d’un site Web. Dans la suite de cet article, nous ver� rons comment utiliser phpMyAdmin pour créer la pe� Emplacement des fichiers Tout ce qui est fourni avec XAMPP se trouve dans le répertoire d’installation (/opt/lampp en ce qui concerne cet article) ; vous y trouverez notamment les principaux répertoires et fichiers présentés dans le Tableau 2. Contrôler XAMPP Le script /opt/lampp/lampp permet de contrôler tr������� è������ s pré� cisément XAMPP. Son utilisation est très simple : /opt/lampp/lampp <action> Figure 10. Création de la base de données Figure 9. Panneau de contrôle graphique de XAMPP 24 Figure 11. Création de la table 5/2011 XAMPP /opt/lampp/share/xampp-control-panel/xamppcontrol-panel. Pour les amateurs, j’ai posté un mes� sage avec une autre solution de contournement sur le site du support Apache Friends (http://www.apachefriends.org/f/viewtopic.php?f=17&t=44645 ). Démarrer automatiquement XAMPP au démarrage du système dépend de la distribution Linux. Sur une distribution de type Red Hat ou Mandriva, vous pouvez procéder de la manière suivante dans une session root (testé avec succès sur une distribution Centos). Créez un lien symbolique vers /opt/lampp/lampp dans /etc/init.d : ln -s /opt/lampp/lampp /etc/init.d/lampp Ajouter le service lampp dans la configuration de dé� marrage : chkconfig --add lampp Pour information, le script /opt/lampp/lampp est confi� guré pour démarrer XAMPP dans les niveaux de dé� marrage 3, 4 et 5. Développer une petite application Maintenant que XAMPP est installé et démarré, nous al� lons pouvoir tester l’écriture et le déploiement d’une petite (toute petite !) application. Pour changer de la sempiter� nelle démonstration Hello World, nous allons développer Listing 1. Le script pub.inc.php <?php // Préparation de valeurs pour l’affichage. Figure 12. Définition des colonnes de la table function versPage($valeur) { return is_array($valeur) ? array_map(‘versPage’,$valeur) : nl2br(htmlentities($valeur,ENT_ QUOTES,’UTF-8’)); } // Connexion a la base de données. Figure 13. Saisie d’un premier livre function dbConnect() { $source = ‘mysql:host=localhost;dbname=pub’; $utilisateur = ‘root’; $motDePasse = ‘’; $db = new PDO($source, $utilisateur, $motDePasse); $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_ } return $db; EXCEPTION); // Exécution d’une requete. function dbExecute($db,$sql) { $requete = $db->prepare($sql); $arguments = func_get_args(); array_shift($arguments); Figure 14. Affichage initiale de la page array_shift($arguments); for ($i = 0; $i < count($arguments); $i++) { } $requete->bindParam(‘:p’ . $i,$arguments[$i]); $requete->execute(); } return $requete; // Lecture (fetch) du résultat d’une requete. function dbFetch($requete) { } Figure 15. Saisie d’un nouveau livre phpsolmag.org/fr return $requete->fetch(); ?> 25 Dossier une petit application qui affiche une liste de livres et per� met d’en ajouter et d’en supprimer. La liste des livres est stockée dans une table d’une base de données MySQL. Listing 2. Le script livres.php Pour commencer, nous allons donc utiliser phpMyAd� min pour créer notre base de données et notre table. Sur la page d’accueil de XAMPP, cliquez sur le lien php<table border=”1” cellpadding=”4” cellspacing=”0”> <tr align=”center”> <?php @include_once(‘pub.inc.php’); $message = null; try { // Se connecter a la base de données. <th>Identifiant</th><th>ISBN</th><th>Titre</ th><th>Action</th> </tr> <?php $supprimer = ‘<a onclick=”return confirm(\’Est-ce $db = dbConnect(); bien raisonnable ?\’);” ‘ . // Déterminer si une action particuliere est requise, ‘href=”livres.php?action=supprimer&a et si oui, mp;id=%s”>supprimer</a>’; // faire le nécessaire. while ($ligne = versPage(dbFetch($requete))) { // Ce serait une bonne idée de vérifier la validité printf des données en entrée ... ( switch (@$_GET[‘action’]) { ‘<tr><td>%s</td><td>%s</td><td>%s</ case ‘ajouter’: td><td>%s</td></tr>’, $sql = ‘INSERT INTO livres(isbn,titre) $ligne[‘id’],$ligne[‘isbn’],$ligne[‘titre’],s dbExecute($db,$sql,$_POST[‘isbn’],$_ ); VALUES(:p0,:p1)’; POST[‘titre’]); break; case ‘supprimer’: $sql = ‘DELETE FROM livres WHERE id = :p0’; dbExecute($db,$sql,$_GET[‘id’]); break; } // Exécuter la requete de sélection de tous les livres. $sql = ‘SELECT id,isbn,titre FROM livres’; $requete = dbExecute($db,$sql); } catch (PDOException $e) { // En cas d’erreur, préparer un message. // Peut mieux faire : le message n’est pas très convivial pour l’utilisateur ... } $message = sprintf(‘Erreur (%s).’,$e->getMessage()); ?> <?php echo ‘<?xml version=”1.0” encoding=”UTF8”?>’,”\n”; ?> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict// EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <title>Livres</title> <link href=”pub.css” rel=”stylesheet” type=”text/ </head> css” /> ?> } printf($supprimer,$ligne[‘id’]) </table> <p /> <!-- Formulaire d’ajout --> <form action=”livres.php?action=ajouter” method=”post”> <div> <table border=”0” cellpadding=”0” cellspacing=”2”> <tr><td>ISBN </td> <td><input type=”text” name=”isbn” size=”20” maxlength=”20” /></td></tr> <tr><td>Titre </td> <td><input type=”text” name=”titre” size=”75” maxlength=”75” /></td></tr> <tr><td></td><td><input type=”submit” name=”ok” </table> value=”Ajouter” /></td></tr> </div> </form> <?php else: ?> <!-- Message d’erreur éventuel --> <div class=”red”><?php echo versPage($message); <?php endif; ?> ?></div> </body> </html> <body> <?php if (empty($message)): ?> <!-- Liste des livres --> 26 5/2011 XAMPP MyAdmin. Sur la page d’accueil de phpMyAdmin, sai� sissez le nom de la nouvelle base de donnée (pub) puis cliquez sur le bouton Créer (Figure 10). Une fois que le base de données est créée, vous ac� cédez à la page d’administration de cette nouvelle base de données. Dans cette page, définissez une nouvelle table nommée livres et comportant trois colonnes puis cliquez sur le bouton Exécuter (Figure 11). Ensuite, définissez les trois colonnes de la table livres présentées dans le Tableau 4 (Figure 12). Saisissez les références de ce livre (recommandé par l’auteur ;-)), puis cliquez sur le bouton Exécuter (Figure 13). C’est fini pour la base de données. Nous allons maintenant passer à la partie PHP. Commençons par créer un script pub.inc.php contenant quelques définitions de fonctions utiles (voir Listing 1). Comme vous pouvez le constater, nous utilisons PDO pour accéder ������������������������������������� à������������������������������������ la base de données. Passons mainte� nant au script livres.php qui va se charger de toute la gestion de notre page (voir Listing 2). La premi�������� è������� re par� tie du script contient principalement du code PHP et se charge de gérer la logique applicative (plutôt simpliste !). La deuxième partie du script contient principalement du code HTML et se charge de l’affichage de la page. Pour terminer, nous allons définir la petite feuille de style pub.css utilisée dans la page (voir Listing 3). Notre application est prête ; il ne nous reste plus qu’à la déployer sur le serveur afin de la tester. Pour cela, nous allons créer un répertoire pub dans /opt/lampp/ htdocs et y copier nos trois fichiers pub.inc.php, pub.css et livres.php. Ouvrons maintenant notre navigateur pré� féré et saisissons l’URL de notre page (http://localhost/ pub/livres.php ou http://localhost/pub/livres.php) . Vous devriez obtenir le résultat montré dans la Figure 14. Pour tester l’ajout d’un nouveau livre, vous pouvez saisir les informations suivantes puis cliquer sur le bouton Ajouter (Figure 15). Vous devriez alors obtenir le résultat présenté dans la Figure 16. Je vous laisse tester la suppression. Sécurisation Par défaut, l’installation de XAMPP n’est pas du tout sé� curisée. Si cela peut ne pas poser de problème pour un Figure 16. Résultat de la saisie d’un nouveau livre Listing 3. La feuille de style pub.css body { font-family: verdana,helvetica; color: #000000; background-color: #ffffff; } font-size: 12px; td { font-family: verdana,helvetica; Figure 17. Le statut initial de sécurité de XAMPP color: #000000; } font-size: 12px; a { font-family: verdana,helvetica; } font-size: 12px; .red { font-family: verdana,helvetica; color: #df0000; font-weight: bold; } font-size: 12px; phpsolmag.org/fr Figure 18. Sécurisation de XAMPP 27 Dossier Figure 19. Authentification pour accéder aux pages de XAMPP Figure 20. Le statut de sécurité de XAMPP après correction environnement de développement, il n’en est évidem� ment pas de m������������������������������������ ê����������������������������������� me pour un environnement de produc� tion. Le statut de sécurité de XAMPP peut être vérifié en cliquant sur le lien Sécurité de la page d’accueil (voir Figure 17). Comme le montre cette page, il existe plusieurs pro� blèmes de sécurité : • L’administrateur de MySQL (root) n’a pas de mot de passe. • ��������������������������������������������������� Le mot de passe par défaut de l’utilisateur FTP no� body est inchangé. • Les pages de XAMPP (statut, exemples, outils) ne sont pas protégées et tout le monde peut y accé� der. • L’utilisateur pma de phpMyAdmin n’a pas de mot de passe. /opt/lampp/lampp security Pour corriger ces problèmes de sécurité, vous pouvez utiliser la commande suivante en tant que root : Cette commande exécute un petit utilitaire interactif qui vérifie le niveau de sécurité de l’installation et vous permet de résoudre les probl������������������������� è������������������������ mes signalés en définis� sant des mots de passe (voir Figure 18). Une fois l’opération terminée, vous devrez saisir le nom d’utilisateur lampp et le mot de passe que vous avez défini pour accéder aux pages de XAMPP : http://localhost/xampp/ ou http://serveur/xampp/ (voir Figure 19). Dans la page relative ��������������������������������� à�������������������������������� la sécurité, vous devriez main� tenant obtenir les statuts présentés dans la Figure 20. De même, pour accéder à phpMyAdmin (http://localhost/ phpmyadmin/ ou http://serveur/phpmyadmin/), il vous faudra dorénavant saisir un nom d’utilisateur (root par exemple) et le mot de passe associé (voir Figure 21). Par ailleurs, si le mot de passe de l’utilisateur root de MySQL a été défini, l’exemple Collection de CD ne fonctionne plus. Pour résoudre le probl����������������� è���������������� me, il faut édi� ter le fichier /opt/lampp/htdocs/xampp/cds.php et ajou� ter le mot de passe dans les appels à mysql_connect. Sauvegarde Figure 21. Authentification pour phpMyAdmin 28 L’utilitaire de contrôle de XAMPP permet de sauvegar� der tr����������������������������������������������� è���������������������������������������������� s facilement votre environnement (base de don� 5/2011 XAMPP Figure 22. Sauvegarde Figure 23. Restauration d’une sauvegarde nées, fichiers de configuration, fichiers htdocs). Pour cela, il suffit de saisir la commande suivante en tant que root : /opt/lampp/lampp backup Si un mot de passe a été défini pour l’utilisateur root de MySQL, vous devez l’ajouter à la fin de la ligne de commande. Malheureusement, dans la version 1.7.4, il y a un bug qui empêche la commande de fonctionner correctement et vous obtenez une erreur performance_ schema: FAILED. Ce probl���������������������������� è��������������������������� me peut ������������������� ê������������������ tre résolu en édi� tant le script /opt/lampp/share/lampp/backup et en ajou� tant la condition -o ‟$i” = ‟performance_schema” au test de la ligne 39 : # if test ‟$i” = ‟Database” -o ‟$i” = ‟information_ schema” if test ‟$i” = ‟Database” -o ‟$i” = ‟information_schema” -o ‟$i” = ‟performance_schema” Une fois cette correction effectuée, la sauvegarde fonctionne sans problème (Figure 22). La sauvegarde se matérialise par un script shell (original !) xamppbackup-dd-mm-yy.sh stocké dans le répertoire /opt/ lampp/backup/ ; ce fichier doit lui m���� ê�������������� me ����������� ê���������� tre sauve� gardé en lieu sûr ! En cas de besoin, il est possible de restaurer une sau� vegarde, sur la m��������������������������������� ê�������������������������������� me machine, ou sur une autre ma� chine, du moment que la version de XAMPP est exac� tement la même. Pour cela, en tant que root, il suffit d’exécuter le script qui correspond à la sauvegarde, par exemple sh xampp-backup-18-02-11.sh. Là encore, si phpsolmag.org/fr un mot de passe a été défini pour l’utilisateur root de MySQL, vous devez l’ajouter ���������������������������� à��������������������������� la fin de la ligne de com� mande. Comme vous le voyez, vous pouvez avoir besoin de redémarrer XAMPP. Petite précision trouvée sur le site Apache Friends, je cite : Tout devrait marcher parfaitement. Mais toujours penser que cette fonction est encore en développement et qu’elle n’est disponible qu’en version Bêta. A bon entendeur, salut ! Conclusion A travers cet article vous avez pu constater que XAMPP est un produit tr�������������������������������� è������������������������������� s facile à��������������������� ���������������������� installer et à������ ������� admi� nistrer, mais nous n’avons fait qu’entre-apercevoir toute sa richesse fonctionnelle. N’hésitez donc pas ����������� à���������� l’instal� ler pour voir tout ce qu’il propose. OLIVIER HEURTEL Après plus de huit ans passés en société de service, où il a successivement occupé les postes de développeur, chef de projet puis directeur de projet, l’auteur a démarré une activité de consultant/formateur indépendant spécialisé sur les bases de données (Oracle, MySQL) et le développement Web (PHP). Il est certifié Oracle Certified Professional et a rédigé plusieurs livres sur PHP et Oracle publiés aux Éditions ENI. 29 Pratique SQL : les vues Savoir manipuler les vues permet de limiter l’accès à un sous-ensemble de données pour une catégorie d’utilisateurs, de simplifier l’interrogation de la base et d’être indépendant du schéma relationnel en cas de modification de ce dernier. Cet article explique : Ce qu’il faut savoir : • L’intérêt des vues. • Comment les créer et les utiliser. • Bases de SQL : manipuler et interroger les données. I l peut s’avérer utile de ne montrer qu’un sous-ensemble de données à un utilisateur ou à un groupe d’utilisateurs. Cela permet de personnaliser l’apparence de la base en fonction de l’utilisateur : parce qu’il a des privilèges restreints, ou pour réduire la complexité d’utilisation. Ces opérations sont possibles grâce à la création de vues. Une vue est une table dérivée dynamiquement d’une ou plusieurs tables, ou d’autres vues. Pour un utilisateur, la vue est une table comme les autres, elle comporte un ensemble de colonnes et de lignes. Toute modification de données dans une des tables utilisées par la vue est immédiatement répercutée dans la vue. La vue peut être consultée comme une table de la base, et sous certaines conditions, ses données peuvent être modifiées avec les commandes INSERT, DELETE et UPDATE. Outre le fait que les vues permettent d’améliorer la sécurité en cachant des parties de la base à un utilisateur donné, elles simplifient le développement et la maintenance d’applications. Lorsque des traitements nécessitent l’interrogation de plusieurs tables, avec des jointures complexes, il peut être utile de fournir une vue qui sera utilisée par le développeur d’application. Celle-ci lui évitera l’écriture de jointures, en transformant une requête complexe sur plusieurs tables en une requête visant une unique table. En cas de réorganisation du schéma relationnel (ajout de colonnes dans des tables, tables scindées, ...), la création de vues permet de ne pas avoir à modifier les requêtes de l’application. Par exemple, si une table Y 30 est partagée en plusieurs tables, il suffit d’écrire une vue Y dont la structure est celle de l’ancienne table, pour que l’utilisateur puisse la manipuler comme avant. Cet article présente les commandes SQL de création, de suppression et d’interrogation d’une vue, ainsi que les conditions qu’une vue doit respecter pour que la mise à jour de ses données soit autorisée. La dernière partie explique les techniques utilisées par les SGBD pour gérer les vues. Afin d’exécuter les exemples, il est nécessaire que vous utilisiez l’environnement de travail présenté dans les articles précédents. Les requêtes proposées dans cet article sont appliquées à la base biblio présentée dans les numéros précédents. Créer une vue Cette partie présente la commande SQL de création de vue et ses options, et explique comment créer différents types de vues. Commande SQL La vue est créée par la commande SQL CREATE VIEW à partir d’une requête SELECT qui définit les données qui seront visibles : CREATE VIEW nom_vue [(nom_colonne1 [, nom_colonne2, ... ])] AS requete_select 5/2011 SQL : les vues [WITH [CASCADED|LOCAL] CHECK OPTION]; La clause optionnelle WITH CHECK OPTION définit le comportement en cas de mise à jour des données d’une vue. Elle sera décrite dans la partie intitulée Mettre à jour une vue. L’instruction ci-après crée une vue date_livre qui contient les titres et les dates de parution de tous les livres stockés dans la table livre : CREATE VIEW date_livre AS SELECT titre, date_parution FROM livre; Le nom donné à la vue doit être unique dans la base, utiliser un nom de table ou d’une autre vue provoquera un échec lors de la création. Nommer les colonnes Par défaut, les colonnes de la vue prennent le nom des colonnes de la requête SELECT. La vue date_livre comporte donc deux colonnes intitulées titre et date_ parution. Il est possible de définir le nom de chaque colonne de la vue. Pour ce faire, il faut placer la liste des noms de colonnes entre parenthèses, après le nom donné à la vue. Cette liste doit comporter le même nombre de colonnes que le résultat de la requête SELECT. S’il y a une ambiguïté dans les noms de colonnes retournées par la requête, il faut indiquer la liste des colonnes. Pour créer une vue date_livre comportant deux colonnes intitulées titre et date, il faut utiliser l’instruction : CREATE VIEW date_livre (titre, date) AS SELECT titre, date_parution FROM livre; Créer une vue horizontale La vue horizontale sélectionne des lignes d’une ou plusieurs tables. Un utilisateur qui a accès à la vue, ne verra donc qu’un sous-ensemble de lignes des tables d’origine. Ces vues utilisent une requête SELECT * avec une clause WHERE définissant la restriction. Ce type de vue permet de ne montrer que les lignes nécessaires à un groupe d’utilisateur. Par exemple, il est possible de scinder la table livre en plusieurs vues pour ne montrer aux vendeurs que les livres qui concernent leurs rayons. L’instruction ci-après crée une vue livre_ policier comportant toutes les informations nécessaires au vendeur du rayon policier : CREATE VIEW livre_policier AS SELECT * FROM livre WHERE genre = ‘policier’; phpsolmag.org/fr Créer une vue verticale La vue verticale sélectionne un sous-ensemble de colonnes d’une ou plusieurs tables. La requête SELECT comporte donc une liste de colonnes et éventuellement une restriction. Il est ainsi possible de fournir les données nécessaires à un groupe d’utilisateurs, tout en excluant celles superflues ou qui ne doivent pas être divulguées à ce groupe. Par exemple, un vendeur d’une librairie verra le prix, le titre et l’ISBN d’un livre, tandis qu’un magasinier verra l’ISBN, la zone de stockage et la quantité en stock. L’instruction ci-après crée une vue magasinier qui donne accès uniquement aux informations utiles à un magasinier pour tous les livres de la base : CREATE VIEW magasiner AS SELECT isbn, quantite, code_zone FROM livre; Créer une vue de jointure Les vues verticales et horizontales sont destinées à afficher les données nécessaires à un groupe d’utilisateurs. C’està-dire que les données qui ne les concernent pas ne leur seront pas accessibles. La vue de jointure, quant à elle, est utilisée pour simplifier l’accès à des données stockées dans plusieurs tables. Si une vue de jointure est créée, un développeur d’applications pourra interroger cette vue plutôt que de devoir écrire des jointures complexes. L’exemple ci-dessous crée la vue info_livre qui comporte quatre colonnes : le titre du livre, sa date de parution, le nom et le prénom de l’auteur. Pour extraire ce résultat, il faut joindre les tables livre, ecrit et auteur : CREATE VIEW info_livre AS SELECT L.titre, L.date_parution, A.nom, A.prenom FROM livre L NATURAL JOIN ecrit NATURAL JOIN auteur A; Une fois cette vue créée, un utilisateur obtiendra le titre et le nom des auteurs avec une requête simple, sans jointure : SELECT titre, nom FROM info_livre; Créer une vue de groupe La vue de groupe, comme celle de jointure, simplifie l’écriture ultérieure de requêtes. Elle consiste à stocker le résultat d’une ou plusieurs opérations de groupe (GROUP BY). Créer une vue de vue La syntaxe de création de vue reste identique si l’on souhaite créer une vue à partir d’une table ou à partir d’une vue déjà existante. Pour créer une seconde vue titre_nom contenant deux colonnes (le titre du livre et le nom de l’auteur) à partir de la vue info_livre : 31 Pratique CREATE VIEW titre_nom AS SELECT titre, nom FROM info_livre; Interroger une vue Une fois créée, il est possible d’interroger une vue de la même manière qu’une table normale, avec la commande SELECT. La requête suivante affiche tous les titres des livres présents dans la vue info_livre : SELECT titre FROM info_livre; Les modifications dans la structure d’une table utilisée par une vue, ne sont pas répercutées dans la vue. En cas d’ajout d’une colonne dans la table sous-jacente, une vue horizontale créée avec un SELECT * n’affichera pas les données de cette nouvelle colonne. De plus, la suppression d’une colonne utilisée dans une vue verticale provoquera une erreur. Par exemple, si la colonne quantite est supprimée de la table livre, la vue verticale magasinier ne fonctionnera plus. L’interrogation de la vue produira l’erreur : View magasinier references invalid table(s) or column(s). Il faut donc penser à modifier les vues pour qu’elles prennent en compte les changements de structure de leurs tables sous-jacentes. Pour ce faire, il faut supprimer la vue et la recréer. Mettre à jour les données d’une vue Les vues sont généralement utilisées pour extraire des informations de la base, mais il est possible, sous certaines conditions, de modifier les données à travers la vue. Si le SGBD est capable de retrouver la ligne dans la table d’origine et d’identifier les colonnes et les valeurs à leur affecter, alors la vue acceptera les modifications de données. Vérifier si la mise à jour est possible Lors de la création d’une vue, MySQL indique dans le dictionnaire des données si celle-ci peut être mise à jour. L’information est stockée dans la table VIEWS du dictionnaire (base information_schema). Cette table comporte les informations sur les vues créées (nom de la vue, requête de création, mise à jour possible, ...). Si le champ IS_UPDATABLE contient la valeur NO, les requêtes INSERT, DELETE et UPDATE seront rejetées. La valeur de ce champ peut-être obtenue avec la requête : SELECT * FROM information_schema.VIEWS; Conditions de mise à jour Pour permettre la modification de données (insertion, suppression, mise à jour), une vue doit respecter les conditions suivantes : 32 • les doublons ne sont pas éliminés (ne pas utiliser DISTINCT), • la requête n’utilise pas de fonction d’agrégation (SUM, COUNT, MAX, MIN, AVG), • la requête ne fait pas d’opération sur les groupes (pas de GROUP BY ni de HAVING), • un même nom de colonne n’apparaît pas deux fois, • il n’y a pas de colonne dérivée (pour un UPDATE il suffit qu’il ne porte pas sur une colonne dérivée), • dans le cas d’une suppression : pas de jointure, • dans le cas d’une insertion ou d’une mise à jour : la vue porte sur une table ou sur une jointure interne (pas de jointure externe) et la requête de modification ne porte que sur une table sousjacente, • le SGBD est capable de retrouver la ligne dans la table source et les colonnes, • il n’y a pas de sous-requête corrélée dans le WHERE, • dans le cas d’une insertion : toutes les colonnes qui n’ont pas de valeur par défaut et qui sont NOT NULL doivent être renseignées, • la création de vue n’utilise pas ALGORITHM = TEMPTABLE (uniquement avec MySQL, cf Résolution versus matérialisation). Par exemple, dans une vue info _ livre _ policier constituée de trois colonnes (isbn, titre et date_parution), il est possible d’insérer un nouveau livre : CREATE VIEW info_livre_policier AS SELECT isbn, titre, date_parution FROM livre WHERE genre = ‘policier’; INSERT INTO info_livre_policier VALUES (‘125-9-124981’,’Le Sauveur’,2005); L’insertion est autorisée et répercutée sur la table livre. Si le champ genre est défini comme NOT NULL dans la table livre et que la valeur par défaut est fixée au genre policier, alors ce livre prendra la valeur ‘policier’ lors de l’insertion. La modification du prénom d’un auteur dans la vue de jointure info_livre est acceptée par MySQL car cette modification ne porte que sur une table sous-jacente à la vue. La requête suivante modifie le prénom de l’auteur Baudelaire, la modification est réalisée automatiquement dans la table auteur : UPDATE info_livre SET prenom=’C.’ WHERE nom=’Baudelaire’; Par contre, la modification suivante est refusée : UPDATE info_livre SET titre = ‘Les Fleurs du Mal’, prenom = ‘C.’ 5/2011 SQL : les vues WHERE titre = ‘fleurs du mal’ AND nom = ‘Baudelaire’; MySQL affiche un message indiquant que la modification porte sur plus d’une table de la vue de jointure (table livre pour le titre et auteur pour le prénom) : Can not modify more than one base table through a join view info_livre. Interdire la migration de données Les lignes d’une vue font partie de la vue parce qu’elles satisfont la condition WHERE de la requête de définition. Lors d’une mise à jour de données dans la vue, une ligne modifiée peut ne plus satisfaire la condition, dans ce cas elle disparaît de la vue. Par exemple, changer le genre d’un livre d’une ligne de la vue horizontale livre_policier provoquerait la migration de la ligne en dehors de la vue (cette vue n’affiche que les livres dont le genre est policier). Si on insère un nouveau livre dans la vue en lui mettant un genre poésie, la ligne insérée est immédiatement supprimée de la vue car elle ne respecte pas le WHERE de la requête de définition. La clause WITH [LOCAL|CASCADED] CHECK OPTION, disponible depuis MySQL 5.0.2 dans la commande de création de la vue, interdit toute modification de ligne de la vue ou toute insertion, si elle provoque une migration de données. C’est-à-dire que l’opération est interdite si la ligne modifiée ou insérée au travers de la vue, ne peut pas être visualisée par la vue. La ligne ne sera modifiée ou insérée dans une table sous-jacente que si elle satisfait la condition du WHERE. Cette clause ne peut être utilisée que dans une vue qui accepte les mises à jour. Les mots clés CASCADED et LOCAL indiquent la portée de la vérification dans le cas de hiérarchies de vues, c’est-à-dire de vues définies à partir d’autres vues. Le mot-clé LOCAL indique que la vérification s’applique uniquement à la vue courante. Le mot-clé CASCADED indique que la vérification s’applique à la hiérarchie de vue (valeur par défaut). Par exemple, la vue vue_livre retient tous les livres publiés avant 1900 : CREATE VIEW vue_livre AS SELECT * FROM livre WHERE date_ parution < 1900 WITH CHECK OPTION; Les vues vue _ livre2 et rapport à vue _ livre : vue _ livre3 sont définies par CREATE VIEW vue_livre2 AS SELECT * FROM vue_livre WHERE date_ parution > 1600 WITH LOCAL CHECK phpsolmag.org/fr OPTION; CREATE VIEW vue_livre3 AS SELECT * FROM vue_livre WHERE date_ parution > 1600 WITH CASCADED CHECK OPTION; Pour la deuxième vue, l’insertion ne sera testée que sur la vue courante grâce à l’utilisation du mot-clé LOCAL. Il est possible d’insérer un livre dont l’année est postérieure à 1900 : INSERT INTO vue_livre2 (isbn, titre, genre, date_ parution, prix) VALUES (‘254-16589-5’, ‘L etoile du diable’, ‘policier’, 2003, 12); 1 row OK L’insertion est acceptée car l’année de parution étant supérieure à 1600, la restriction de vue _ livre2 est vérifiée. La donnée insérée dans la table livre ne sera pas visible dans vue _ livre, vue _ livre2 et vue _ livre3 car la vue vue _ livre exclut les livres parus après 1900. Par contre, l’insertion dans la troisième vue est rejetée car elle est testée par rapport aux restrictions des vues de la hiérarchie (échec dans vue _ livre car 2003 > 1900) : INSERT INTO vue_livre3 (isbn, titre, genre, date_ parution, prix) VALUES (‘254-16589-6’, ‘L etoile du diable’, ‘policier’, 2003, 12); CHECK OPTION failed vue_livre Supprimer une vue La commande SQL DROP la vue : VIEW supprime la définition de DROP VIEW nom_vue [RESTRICT|CASCADE] Lorsque CASCADE est précisé, les objets qui en dépendent sont supprimés (toute vue qui utiliserait cette vue serait effacée). La clause RESTRICT bloque la suppression de la vue si des objets en dépendent, c’est l’option par défaut. Les vues ont été implémentées dans la version 5 de MySQL. Dans la version actuelle (5.5), RESTRICT et CASCADE sont ignorés. La suppression d’une vue sera réalisée même si d’autres vues en dépendent. La commande suivante supprime la vue info_livre : DROP VIEW info_livre; Résolution versus matérialisation Lorsque le SGBD rencontre une référence à une vue dans une requête, il utilise la définition de la vue pour 33 Sur Internet • http://dev.mysql.com/doc/refman/5.0/fr/views.html transformer la requête en une requête équivalente sur les tables sous-jacentes. Cette technique est appelée résolution de vue. Elle est coûteuse lorsque la requête de définition utilise des jointures complexes car cellesci doivent être calculées à chaque appel de la vue. Les SGBD proposent une technique alternative : la matérialisation de vue. Celle-ci consiste à stocker la vue comme une table temporaire dans la base de données. Lorsque la vue est appelée la première fois, les données sont stockées dans la table temporaire. A chaque modification d’une des tables sous-jacente, la table temporaire doit être mise à jour. La matérialisation de vue est donc efficace lorsque de nombreuses requêtes sont effectuées sur une vue complexe et que les données d’origine ne sont pas souvent modifiées. MySQL définit une clause optionnelle ALGORITHM dans la commande de création de la vue (elle n’existe pas dans le standard SQL). Celle-ci prend trois valeurs : MERGE (résolution de vue), TEMPTABLE (matérialisation dans une table temporaire), ou UNDEFINED (MySQL choisit l’algorithme à utiliser). La valeur par défaut, s’il n’y a pas de clause, est UNDEFINED. MySQL tend à privilégier la résolution de vues plutôt que la matérialisation car dans MySQL la vue ne peut pas être mise à jour quand elle utilise une table temporaire. MySQL utilise toujours des tables temporaires lorsque la définition de la vue contient des fonctions d’agrégation, DISTINCT, GROUP BY, HAVING, LIMIT ou UNION. Conclusion Dans cet article, vous avez appris à créer et à utiliser des vues. Celles-ci vous permettront d’améliorer la sécurité, de réduire la complexité d’accès aux données, et de rendre les applications indépendantes du schéma relationnel. CILIA MAURO, MAGALI CONTENSIN Cilia Mauro est gestionnaire de bases de données et développeur d’applications web au CNRS. Elle enseigne les bases de données et PHP à l’université. Contact : [email protected] Magali Contensin est chef de projet en développement d’applications au CNRS. Elle enseigne depuis plus de dix ans le développement d’applications web à l’université et est l’auteur de nombreux articles sur le développement web en PHP. Contact : http://magali.contensin.online.fr 34 eZ Publish Créer son site internet avec le CMS eZ Publish Créer un site internet, qu’il soit à titre personnel ou professionnel, peut passer par le choix d’un CMS (Content Management System ou Système de Gestion de Contenu) plutôt qu’un Framework. Que ce soit un blog sur un musicien qu’on apprécie, un portail institutionnel ou un site de vente de t-shirts en ligne, il est nécessaire de connaître les forces et faiblesses des CMS pour voir un jour son site internet en ligne sans problème. Dans ce cas, choisir EZ Publish peut être un choix judicieux. Cet article explique : Ce qu’il faut savoir : • Après lecture de cet article, vous aurez une vision théorique et pratique des points importants à assimiler pour vous lancer dans l’installation et la programmation sur eZ Publish. Des exemples concrets viendront corroborer les concepts de ce CMS. • Pour comprendre cet article, il est souhaitable de posséder des connaissances basiques sur Linux, Apache, MySQL, ainsi que de solides compétences en programmation PHP5. P our la petite histoire, eZ Publish est un CMS (Système de Gestion) édité par la société norvégienne eZ Systems. La dernière version stable publiée est eZ Publish 4.4.X, lancée fin 2010. eZ Publish fonctionne principalement avec le langage de programmation PHP5, une base de données SQL, un serveur Apache et un système d’exploitation Linux (LAMP). D’autres configurations de serveur sont également possibles, voir les liens utiles. Pourquoi et quand utiliser eZ Publish ? Lorsque l’idée de choisir un framework (CakePHP, Symfony, etc...) est écartée parce qu’il est nécessaire de développer un back-office, ou que repartir d’un développement spécifique from scratch nécessite de réinventer la roue, le choix d’un CMS peut s’imposer facilement. Côté pratique, le choix d’un CMS se fait sur les fonctionnalités correspondant, ou pas, aux besoins du cahier des charges du projet. Il peut également se baser sur l’expérience utilisateur du back-office. Côté technique, le choix d’un CMS se fait sur les arguments spécifiques qu’il propose, c’est-à-dire principalement le langage de programmation sur lequel il est basé, les extensions ou plugins que la communauté ou la société éditrice propose, toujours nécessairement en rapport aux besoins fonctionnels, sa communauté de développeurs experts, et éventuellement et surtout son coût. Lorsque les fonctionnalités d’un CMS lambda répondent au plus proche aux besoins fonctionnels et phpsolmag.org/fr techniques d’un projet, c’est lambda qu’il faut choisir. Encore faut-il connaître lambda par rapport à d’autres CMS. Sur le marché actuellement, différents CMS issus du monde du logiciel libre sont proposés au téléchargement. Les principaux logiciels concurrents d’eZ Publish sont Drupal, Typo3, Joomla, SPIP, voire même Wordpress. La solution eZ Publish est tout d’abord et surtout puissante par sa flexibilité; De manière générale, un site internet dont le contenu est géré dynamiquement affiche du contenu de différentes façons, ou vues. Ce contenu doit donc être structuré, mais également et surtout typé. Un contenu peut être par exemple un produit (possédant un titre, deux visuels, une description et un prix) ou également un article (possédant un titre, une introduction, un texte). Dans eZ Publish, la structure décrivant un produit ou un article correspond au concept de classe de contenu (content class en anglais). De même, le type d’un attribut d’une classe de contenu, comme un titre, est un datatype. Dans ce cas, le datatype est une ligne de texte. eZ Publish fournit par défaut une pléthore de datatypes, ces derniers étant extensibles. Le titre d’un article Le dernier produit sorti de notre gamme est donc un attribut de la classe produit. Le schéma suivant résume ces concepts : http://doc.ez.no/var/doc/storage/images /ez_ publish/technical_manual/4_0/images/concepts_and_ 35 Pratique basics/datatypes_attributes_content_class_and_ objects/565-8-eng-GB/datatypes_attributes_content_ class_and_objects_doc.png. Nous pouvons également étendre ces concepts pour un site multilingue ou multisite sans pour autant ajouter une extension ou un plugin comme le nécessiteraient certains CMS. De même, le système de versionning d’eZ Publish est inclus par défaut dans son noyau. Conclusion eZ Publish est un CMS parmi tant d’autres, il possède ses forces et ses faiblesses, nombreux sont les comparatifs sur l’internet, encore faut-il avoir eu une réelle expérience pour en juger. Liens utiles : • http://ez.no - Le portail officiel du produit, • http://ez.no/eZPublish/Requirements - Les besoins logiciels pour installer eZ Publish, • http://alpha.benchmarkr.com/benchmarkrs/11 Benchmark fonctionnel précis mais datant un peu de 4 CMS, • http://www.cmsmatrix.org - Le comparatif de tous les CMS existants, • http://www.journaldunet.com/developpeur/tutoriel/ out/040510-10-cms-open-source.shtml - Un autre comparatif de certains CMS sur le journal du net, • http://share.ez.no/forums/general/ezpublish-vs-drupal-vs-joomla-and-typo3 - Discussion des différents CMS sur le forum officiel d’eZ Publish, • http://phpsolmag.org/fr/magazine/1629-ez-publishguide-de-developpement - Article sur le concept de datatype sur eZ Publish, • http://doc.ez.no/eZ-Publish/Technical-manual/4.4/ Concepts-and-basics/Content-management/Mul- tiple-languages - Le concept de classes de contenu multilingues. Configuration serveur Avant de commencer à modifier la configuration serveur, il est nécessaire au préalable d’avoir correctement installé les éléments logiciels d’un site internet sous LAMP : Linux (dans notre cas, Ubuntu pour l’environnement local), Apache, MySQL et PHP. Les chapitres suivants donnent des exemples basés sur un site internet dont le nom de domaine www.nounours.com, serait un portail proposant un catalogue de peluches (Les produits) groupées par catégorie, ainsi que des pages simples contenant du texte (Page de présentation de la société, mentions légales, etc...). Linux Bien sûr, nous n’allons pas détailler et expliquer l’installation d’un système d’exploitation Linux, mais plutôt la raison pour laquelle nous choisissons cet OS pour notre machine de développement en local, ainsi que le serveur de production sur lequel nous allons faire tourner le site. Choisir le bon environnement de développement évite bien des désagréments. La question que l’on se pose est : développer sous un environnement Windows (avec WAMP par exemple) ou Linux (Ubuntu par exemple) ? Mis à part la disponibilité des éditeurs de programmation sur chacun de ces OS, le choix est propre au développeur ou au pôle technique (éditeur rapide avec simple coloration syntaxique ou éditeur tournant sous JAVA avec auto-complétion). Il ne faut pas oublier, qu’en plus des bugs et contraintes sur Windows, comme la limitation du nombre de caractères d’un fichier (très vite atteint sur eZ Publish), la lenteur d’exécution d’eZ Publish avec un système de fichiers NTFS, un environnement de développement doit tout d’abord être proche Figure 1. L’interface du back-office eZ Publish sur les dernières versions 36 5/2011 Pratique d’un environnement de production. Sans oublier la base même des concepts de logiciels libres. # Exécutons la commande suivante pour prendre en compte la nouvelle configuration $ /etc/init.d/apache2 reload Apache Avant de nous lancer dans la configuration Apache, il est nécessaire de créer le répertoire dans lequel nous allons installer le site dans notre environnement local. Par exemple : Bien sûr, n’oublions pas de déclarer les 2 URLs (frontoffice et back-office) définies dans le virtual host, dans notre fichier hosts : $ sudo gedit /etc/hosts /var/www/nounours. → fichier hosts.conf Les commandes suivantes sont à exécuter sur un OS Ubuntu sur notre environnement local avec l’utilisateur root (préfixées par le mot-clé sudo) : # Allons dans le répertoire des virtual hosts en local En testant les URLs http://nounours.local et http://admin.nounours.local/ dans notre navigateur préféré, et en ayant au préalable créé un fichier vide index.php, nous arrivons bien sur une page blanche, ne générant aucune erreur dans nos fichiers de logs. $ cd /etc/apache2/sites-available/ MySQL # Créons notre virtual host avec l’éditeur gedit $ sudo gedit nounours.conf → fichier nounours.conf # Créons un lien symbolique de fichier de sites-available vers sites-enabled $ sudo a2ensite nounours.conf Nous allons donc créer notre base de données vide nommée s_nounours à travers l’interface locale de phpMyAdmin, ou pour les puristes, en ligne de commande, et y associer un utilisateur MySQL ayant tous les droits sur cette base de données : # Créons la base de données s_nounours CREATE DATABASE `s_nounours` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; # Créons notre utilisateur user_nounours CREATE USER ‘user_nounours’@’localhost’ IDENTIFIED BY ‘***’; # Donnons-lui tous les droits sur la base de données user_nounours GRANT ALL PRIVILEGES ON * . * TO ‘user_ nounours’@’localhost’ IDENTIFIED BY ‘***’ WITH GRANT OPTION MAX_QUERIES_ PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_ CONNECTIONS 0 ; # Testons notre utilisateur en ligne de commande $ sudo mysql -u user_nounours -p s_nounours PHP Les dernières versions d’eZ Publish requierent une version récente de PHP, de préférence PHP 5.2.X ou PHP 5.3.X. # Cette commande permet de connaître la version de PHP $ php -v Figure 2. Le panneau de configuration du mode DEBUG 38 installée De plus, eZ Publish permet le redimensionnement d’image, il est donc nécessaire d’installer, si ce n’est déjà fait, le logiciel libre ImageMagick. 5/2011 eZ Publish # Cette commande permet de connaître la version $ convert -version d’ImageMagick installée Conclusion Nombre de configurations logicielles sont possibles, mais optimiser son environnement de développement permet de gagner en temps, en confort de programmation, et bien sûr en argent. • Nous créons les identifiants du compte super administrateur du back-office, que nous gardons bien en mémoire. • Nous arrivons donc sur les pages d’accueil du front-office et du back-office : Liens utiles : • http://doc.ez.no/eZ-Publish/Technical-manual/4.4/ Installation/Virtual-host-setup/Virtual-host-example - Documentation officielle sur la configuration du virtual host, • http://ez.no/eZPublish/Requirements - Les besoins logiciels pour installer eZ Publish. Installation, installer le CMS Il existe deux versions de téléchargement du CMS : une version entreprise et une version communauté. Nous allons télécharger et installer la version 4.4 – Fuji d’eZ Publish sous Linux, incluant la librairie PHP eZ Components. Cette dernière a d’ailleurs été soumise à et validée par la communauté Apache, sous le nom de Zeta Components. Après avoir donc téléchargé le fichier, décompressé dans le répertoire /var/www/nounours, puis vérifié que les répertoires et fichiers possèdent les bons droits, nous arrivons donc, en lançant dans notre navigateur favori, l’interface suivante : → fichier install_ez_4_4.png • En cliquant sur le bouton Paramétrage fin, nous vérifions les éventuels logiciels ou configurations manquants. • Nous suivons donc les étapes, jusqu’à celle où nous saisissons les paramètres de connexion à la base de données définie plus tôt. • Nous allons nous contenter d’un site en français uniquement, en laissant la valeur par défaut. • Nous arrivons sur l’étape du package (paquetage) : ce sont des thèmes prédéfinis. Nous choisissons le package le plus simple : Plain site. • Nous faisons correspondre la langue anglaise au français : Map to French. • Nous arrivons à la page Site details, où nous saisissons donc le Titre (correspondant au title du site, bien sûr modifiable ensuite), l’URL du site (http:// nounours.local), ce que nous appellerons les siteaccess du front-office (plain _ site) et du backoffice (plain _ site _ admin), et nous sélectionnons bien sûr la base de données nommée s_nounours.. phpsolmag.org/fr Figure 3. En mode édition, nous avons accès à diverses informations du contenu édité 39 Pratique → fichier backoffice_accueil.png → fichier frontoffice_accueil.png Conclusion Installer la base d’eZ Publish est rapide et simple, les chapitres suivants vont donc demander toute l’attention du développeur. Liens utiles : • http://ez.no/Requests/eZ-Publish-Enterprise-4.4 Tester la version Entreprise, • http://share.ez.no/download-develop/downloads Télécharger la version Communauté, • http://ezcomponents.org - La librairie PHP eZ Components, • http://incubator.apache.org/zetacomponents Apache Zeta Components, • http://ez.no/Demos-videos - Tutoriel et démonstration en vidéo. Comprendre et configurer eZ Publish, le contenu Avant de nous lancer dans le développement pur et dur, nous allons tout d’abord créer notre contenu en back- office, plus précisément créer les classes de contenu, ainsi que l’arborescence du site. Il est utile également de naviguer dans le back-office pour y trouver et comprendre les nombreuses fonctionnalités possibles, en cliquant sur les cinq onglets principaux. Avant ceci, nous allons faire correspondre l’URL http:// admin.nounours.local à http://nounours.local/plain_ site_admin. Dans le fichier RACINE_DU_SITE/settings/ override/site.ini.append.php, nous éditons le bloc [SiteAccessSettings], en le remplaçant par : [SiteAccessSettings] ForceVirtualHost=true CheckValidity=false AvailableSiteAccessList[]=plain_site AvailableSiteAccessList[]=plain_site_admin MatchOrder=host HostMatchMapItems[]=nounours.local;plain_site HostMatchMapItems[]=admin.nounours.local;plain_site_ admin Nous allons créer nos trois classes de contenu : produit, catégorie et page. En allant dans Administration > Figure 4. Page d’accueil après l’installation 40 5/2011 eZ Publish Classes > Content, nous remarquons que l’installation basique d’eZ Publish fournit par défaut des classes à titre d’exemple, que nous n’allons pas réutiliser. En cliquant sur le bouton Nouvelle classe, nous arrivons sur l’interface d’édition d’une classe, sur laquelle nous allons saisir les informations suivantes. Exemple sur la classe produit : # Ceci est le nom de la classe au format humain produits) et page. Après avoir créé nos classes de contenu, nous allons donc créer l’arborescence du site, en créant les instances de ces classes : les objets. Voici l’arborescence que nous créons, à partir de la racine (Nom, puis entre parenthèses, la classe de contenu). Nom : produit → EZ Publish Identifiant : product → La peluche Mickey Mouse (Produit) → La peluche Donald Duck # Ceci est le nom de la classe au format informatique # Description de la classe, nous laissons vide Description : vide # Ceci va générer le libellé affiché en back-office du contenu, nous choisissons l’attribut title créé après Modèle de nom d’objet : <title> # Ceci va générer automatiquement l’URL en back-office et en front-office. Nous choisissons (Catégorie) → La peluche Minnie Mouse → Poupées (Folder) → Peluches (Catégorie) → Mélanie → Arthur (Produit) (Produit) (Produit) (Produit) → Mentions légales (Page) → La société (Page) donc qu’eZ Publish permet de Chaque nœud de l’arborescence se crée de la manière suivante : créant par exemple un autre attribut > Contenu > Sélection de la classe > l’attribut title, mais remarquons personnaliser l’URL d’un contenu en nommé url. Modèle de génération de l’URL : <title>. Le Tableau 1 récapitule la structure de la classe produit. Il n’affiche pas les valeurs des propriétés par défaut. Nous obtenons donc (16 est le numéro identifiant de la classe produit) : http://admin.nounours.local/class/view/16. Nous faisons de même pour les classes catégorie (en cochant conteneur, les catégories ayant des Créer un nouvel objet > Saisie du contenu de chaque attribut > Publier Après la publication d’un objet, notons que ce dernier possède, entre autres, les propriétés suivantes : un contentobject _ id et un node _ id. Le contentobject _ id est l’entier identifiant unique associé à l’objet, alors que le node _ id est l’identifiant associé à l’objet, sur l’arborescence. Nous en déduisons donc qu’un objet peut posséder plusieurs node_id, à différents endroits de l’arborescence, ce qui traduit la notion de multi-emplacements d’eZ Publish. Figure 5. Fiche produit d’un objet en front-office phpsolmag.org/fr 41 Pratique En mode édition, nous pouvons voir, sur la colonne de gauche, les différentes informations et fonctionnalités propres à un objet. → colonne_gauche_edition.png Les fichiers de configuration Comme tout CMS, eZ Publish possède nombre de propriétés configurables possibles. Ces variables sont éditables dans des fichiers de configuration : les fichiers .ini. Ces fichiers sont situés dans le répertoire RACINE_DU_SITE/settings. Chacun de ces fichiers possède les valeurs par défaut des variables modifiables via le back-office, ou de préférence en les éditant manuellement. Plus précisément, ces fichiers ne sont pas à modifier, car faisant partie du noyau d’eZ Publish, nous créons un nouveau fichier en les surchargeant. Une surcharge d’une valeur est un nouveau fichier dans lequel nous écrivons la nouvelle valeur, qui prend la priorité sur la valeur par défaut. Chaque valeur est associée à une variable, faisant partie d’un bloc. Au même titre que nous avons surchargé le bloc [SiteAccessSettings], nous pouvons également surcharger d’autres variables de bloc. Exemple Le fichier des valeurs par défaut de la connexion à la base de données se trouve dans le fichier RACINE_DU_ SITE/settings/site.ini, dans le bloc DatabaseSettings : [DatabaseSettings] Server=localhost User=root Password= Database=nextgen Lors de l’installation, eZ Publish a automatiquement créé un nouveau fichier surchargeant ces valeurs, le fichier qui prend désormais le pas, se trouve dans RACINE _ DU _ SITE/settings/siteaccess/plain _ site/ site.ini.append.php. [DatabaseSettings] Server=localhost User=user_nounours Password=YvJq7ou3VVu5 Database=s_nounours Ceci est donc valable pour le (siteaccess du front-office). siteaccess plain _ site Parallèlement, dans le Figure 6. L’interface d’installation d’eZ Publish 42 5/2011 eZ Publish répertoire RACINE _ DU _ SITE/settings/siteaccess/ plain _ site _ admin/, nous remarquons qu’un même fichier existe, possédant les mêmes valeurs. Ceci est donc également valable pour le siteaccess plain _ site _ admin (siteacces du back-office). Nous regroupons donc ces valeurs dans le fichier RACINE _ DU _ SITE/settings/override/site.ini.append.php. Ceci est donc désormais valable pour les deux siteaccesses du front-office et du back-office. De manière générale, ce type de fichier doit être nommé fichier.ini.append.php pour la surcharge du fichier fichier.ini. Suivant sa portée, il est placé soit dans RACINE_DU_SITE/settings/override, soit dans soit DU_SITE/settings/siteaccess/plain_site, RACINE_ RACINE_ DU_SITE/settings/siteaccess/plain_site_admin. Dans les chapitres suivants, nous définirons les siteaccesses (front-office et back-office) par le mot-clé ###SITEACCESS###. Conclusion La notion de surcharge d’un siteaccess est une fonctionnalité propre à eZ Publish. Elle permet s’associer une valeur de variable de configuration propre à un siteaccess uniquement, ou de l’étendre à tous les siteac- Figure 7. Ce que le mode DEBUG ON affiche en front-office phpsolmag.org/fr 43 Pratique cesses, ce qui permet une grande flexibilité. Ceci étant dit, elle requiert de la part du développeur une grande rigueur dans la gestion des variables. Nous verrons de même, que le concept de surcharge s’applique également à d’autres répertoires et fichiers. Liens utiles : • http://doc.ez.no/eZ-Publish/User-manual/4.x/Dailytasks/Publishing-at-multiple-locations - La notion de multi-emplacements, • http://doc.ez.no/eZ-Publish/User-manual/4.x/Theadministration-interface/The-Object-edit-interface - Édition d’un objet, • http://doc.ez.no/eZ-Publish/Technical-manual/4.x/ Concepts-and-basics/Configuration - Siteaccess et configuration. Développement, le langage de templates Un fichier template est un fichier texte dont l’extension est .tpl. Il définit la vue d’un objet sur le front-office ou le back-office. Il contient du code HTML ainsi que du code de templating eZ Publish. Il ne contient en aucun cas de PHP comme d’autres CMS le permettent. Un objet, ainsi que ses attributs, peut être donc affiché de différentes façons. Un fichier template se trouve par défaut dans le répertoire RACINE_DU_SITE/design. De même que les fichiers de configuration précédemment définis, ces fichiers ne sont pas à modifier, car faisant partie du noyau. Ces fichiers sont également à surcharger. De manière plus générale, à l’exception des fichiers de configuration se trouvant dans les sous-répertoires RACINE_DU_SITE/settings/, nous créons nos fichiers dans des sous-répertoires se trouvant uniquement sous RACINE_DU_SITE/extension. Tout comme le typoscript à Typo3 ou les boucles à SPIP, le langage de templating eZ Publish est uniquement propre au CMS. De la documentation est disponible sur ce lien : → http://doc.ez.no/eZ-Publish/Technical-manual/4.x/Templates. Surcharge d’un template Avant de nous lancer dans la programmation d’un template, il nous faut le créer. Nous allons donc créer l’extension de notre projet nounours et l’activer, en supposant que nous travaillons dans la société Tartepempion. Comme dans tout projet web ou informatique, il est vivement recommandé de suivre des best practices lors de la création de répertoires. Nous allons créer l’arborescence des sous-répertoires suivants : RACINE_DU_SITE > extension # Nous préfixons notre extension par la première lettre 44 de notre société > t_nounours (1) # Répertoire contenant les templates et autres fichiers statiques (css, javascript, images, etc...) > design (2) # Répertoire contenant les fichiers définissant l’affichage du siteaccess du front-office > nounours_front (3) # Répertoire contenant les fichiers templates > templates (4) Nous copions ensuite le fichier RACINE _ DU _ SITE/ vers (4). Ce nouveau fichier template surcharge donc celui définissant l’affichage par défaut, mais surtout il contient le code contenu dans chaque page affichée en front-office : c’est le template conteneur principal. Pour le prendre en compte, il est nécessaire de définir dans un fichier de configuration l’existence du répertoire (2). Nous créons le fichier design.ini.append.php sous RACINE_DU_SITE/extension/t_nounours/settings/. design/standard/templates/pagelayout.tpl → RACINE_DU_SITE/extension/t_nounours/settings/design. ini.append.php De même, nous définissons également (3) en créant le fichier site.ini.append.php sous RACINE _ DU _ SITE/ extension/t _ nounours/settings/siteaccess/plain _ site/. → RACINE_DU_SITE/extension/t_nounours/settings/ siteaccess/plain_site/site.ini. append.php Nous activons notre nouvelle extension en ajoutant la ligne suivante au fichier RACINE _ DU _ SITE/settings/ override/site.ini.append.php. [ExtensionSettings] ActiveExtensions[] ActiveExtensions[]=ezjscore ActiveExtensions[]=ezie ActiveExtensions[]=ezoe ActiveExtensions[]=ezodf # Activation de la nouvelle extension ActiveExtensions[]=t_nounours Enfin, nous vérifions que tous les fichiers et répertoires nouvellement créés possèdent les bons droits serveur, et purgeons les caches, avec la ligne de commande suivante : $ cd RACINE_DU_SITE $ php bin/php/ezcache.php --clear-all --purge 5/2011 eZ Publish Pour afficher notre nouveau fichier template pagelayout.tpl en front-office, nous allons donc sur la page d’accueil http://nounours.local. Deux solutions s’offrent à nous : • Nous modifions ce fichier en ajoutant par exemple un texte lambda, et vérifions que ce dernier s’affiche bien. • Nous activons le debug et vérifions que le fichier est bien pris en compte : connectons-nous dans le back-office, puis dans la colonne de droite, activons le mode de débogage du siteaccess du frontoffice uniquement. → capture d’écran colonne_droite_activation_debug_plain_ site.png → capture d’écran mode_debug_on_front-office.png De manière générale, nous pouvons également visualiser tous les autres fichiers templates (inclus ou pas) pris en compte sur la page d’accueil du site. Nous allons maintenant nous atteler à créer la page en front-office d’un produit. Nous allons donc écrire le fichier template correspondant en le créant dans l’arborescence des fichiers dans notre extension et le rendre actif. Créons les répertoires conteneurs et le fichier, pour obtenir l’arborescence suivante : RACINE_DU_SITE/extension/t_nounours/design/nounours_ front/override/templates/full/ product.tpl Nous éditons ce fichier en affichant les attributs de la classe produit : → extension/t_nounours/design/nounours_front/override/ templates/full/full_product.tpl Pour activer ce fichier et lui faire correspondre la vue full à chaque contenu de type produit, nous éditons le fichier RACINE _ DU _ SITE/extension/t _ nounours/ s ett i n gs/site ac c ess/pla i n _ site/ov errid e.i n i. (surchargeant donc override.ini) en y ajoutant le code suivant en début de fichier : append.php → full_produit_mickey.png Bien sûr l’affichage est rustique, nous ne détaillerons pas le métier de webdesign dans cet article. Pour connaître les nombreuses possibilités de configuration, vous pouvez consulter le contenu des liens utiles de ce chapitre. Conclusion Bien sûr l’exemple donné n’est qu’un affichage simple de données simples, basé sur une configuration simple. Pour plus d’informations sur les possibilités de configurations, nous pouvons consulter la documentation en ligne : http://doc.ez.no. Liens utiles : • http://doc.ez.no/eZ-Publish/Technical-manual/4.x/ Reference/Scripts/Generic/ezcache.php - La documentation sur le script de gestion du cache eZ Publish, • http://doc.ez.no/eZ-Publish/Technical-manual/4.x/ Reference/Configuration-files/override.ini - Le système de surcharge. En savoir plus Lorsque vous aurez créé votre site internet, il vous sera utile et intéressant d’approfondir les notions suivantes : • • • • • • • • • • • L’écriture d’un workflow. L’écriture d’un module. L’écriture d’un datatype. L’écriture d’un cronjob. La configuration multilingue ou multisite. Le versionning. La fonctionnalité d’e-commerce. Les rôles et droits. L’extension eZ Find. La gestion poussée du cache. Bien d’autres encore... Vous avez accès en ligne à la documentation en ligne http://doc.ez.no, le site communautaire http://share. ez.no, les flux http://www.planet-ezpublish.fr et http:// www.planetezpublish.org, ainsi que bien d’autres sites. [full_product] Source=node/view/full.tpl MatchFile=full/full_product.tpl Subdir=templates Match[class_identifier]=product En ayant au préalable vidé le cache pour prendre en compte cette nouvelle configuration ainsi que le template ajouté, nous avons en front-office http://nounours.local/Peluches/La-peluche-Mickey-Mouse : phpsolmag.org/fr JEAN-LUC NGUYEN Jean-Luc NGUYEN développe depuis plus de 8 ans en langage PHP. Il a débuté sur eZ Publish 3.6, et est développeur certifié eZ Publish. Il travaille actuellement au sein de la société Publicis Modem, à Paris. Son site internet : www.acidre.com. 45 Sécurité PF et OpenBSD adapté aux PME Beaucoup de PME ont en commun des besoins de sécurité et notamment en matière de pare-feu. Il existe de nombreux choix matériels sur le marché et les UTM ont depuis plusieurs années inondés le marché de la sécurité internet. Dans cette multitude de choix, il existe des outils Open Source en licence libre qui peuvent parfaitement convenir aux PME, couvrir 100% de leurs besoins, tout en étant simple à configurer. Cet article explique : Ce qu’il faut savoir : • OpenBSD - système d’exploitation libre, sous licence BSD. • Packetfilter - pare-feu logiciel. • Notions de sécurité. O penBSD est un système d’exploitation libre, sous licence BSD, dérivé de la famille Berkeley System Distribution. C’est un système de type Unix dérivé directement du code de celui-ci. Plus précisément, OpenBSD comme la plupart des autres systèmes d’exploitation BSD est dérivé de la version 4.4 de BSD. Il existe aujourd’hui plusieurs variantes du système BSD, parmi celles-ci OpenBSD est celle qui est la plus reconnu dans le domaine de la sécurité. Ceci tout d’abord grâce à l’incorporation dans le système de base d’un grand nombre d’outils de sécurité, d’autre part pour la politique adopté par les développeurs, avec notamment de nombreuses phases d’audit de code. La famille BSD et la famille Linux sont différent techniquement. En effet, les noyaux BSD offre moins de fonctionnalité que les noyaux Linux permettant en contrepartie une stabilité, une performance et une sécurité bien supérieure. Côté licence, la famille BSD est soumis à la licence BSD permettant d’utiliser les logiciel sans restriction. effet l’état des connections (TCP par exemple) et agit en conséquence à l’arrivé d’un nouveau paquet. Il s’accompagne d’un outil de contrôle pfctl permettant d’interagir avec PF. Bien souvent imaginé comme obscur, il existe des produits packagés tels que pfsense issue de l’autre grand produit phare de la famille BSD : FreeBSD. Ce système permet de s’affranchir de la ligne de commande et de configurer l’ensemble de la sécurité sur une interface web. Descriptif PF Packetfilter (PF) est le pare-feu logiciel embarqué dès l’installation dans les systèmes OpenBSD. Au même titre que Netfilter, il est stateful et capable de réaliser un certain nombre d’opérations sur les paquets durant leurs traitement. Concrètement cela signifie que PF garde en mémoire dans des tables prévues à cet 46 Figure 1. Schéma d’architecture 5/2011 OpenBSD Ce qu’il faut savoir PF est activé et stateful par défaut sur les systèmes OpenBSD. Il est capable de base de faire de la translation d’adresse, du filtrage, de la normalisation, de la gestion de QoS ou encore de la haute disponibilité native, etc …Et, last but not least…. PF fonctionne selon le principe du last matching rule wins autrement dit et pour un paquet, les règles sont analysées une à une, et la dernière qui concerne le paquet l’emporte… OpenBSD étant un produit de sécurité, il est livré de base avec les principaux modules de chiffrement tel que le 3DES et l’AES. L’outil pfctl permet d’effectuer des actions telles que : Pfctl –e # Active le filtrage Pfctl –d # Désactive le filtrage Pfctl –ss # Affiche la table d’état Pfctl –sr # Affiche les règles actives Et bien d’autres choses encore… Les possibilités de PF et outils annexes Grâce à ses tables d’état internes, PF a été prévu pour se coupler avec de nombreux outils tels que spamd fournit nativement sur OpenBSD, ou les IPS comme snort. Au final, tous outils qui lors d’un évènement sont capables d’effectuer une commande peuvent potentiellement interagir avec PF. CARP est l’outil qui permet de réaliser de manière simple de la redondance en Actif/Passif. L’outil couplé avec pfsync permet de préserver les tables de session pendant le temps de basculement. Toutefois, il n’est pas possible avec CARP d’effectuer de l’Actif/ Actif. OpenBSD et squid sont totalement compatible et peuvent apporter une brique de filtrage URL et proxy web à l’entreprise. Ipsecctl est capable de créer des tunnels IPsec site à site, et est interopérable avec des implémentations constructrices telles que Cisco ou Checkpoint. Il est également possible dans le cadre de la haute disponibilité de synchroniser les Security Associations (SA) et les Security Policy Database (SPD) à l’aide de sasyncd. D’autre part, vous pourrez configurer un remote accès utilisateur à partir d’OpenBSD. OpenVPN peut être très utile à OpenBSD pour effectuer du VPNSSL. Grâce à authpf il est possible de modifier dynamiquement les règles de filtrage en fonction de l’adresse IP d’un utilisateur. Cela permet alors de donner un accès privilégier tant qu’il reste authentifier sur le pare feu. OpenBSD est également interopérable avec Kerberos/LDAP permettant de mettre en place une authentification forte. On regrette que la connexion ne puisse se faire que par rapport à un compte LDAP et non un groupe de plusieurs utilisateurs. Toutefois, OpenBSD est assez puissant pour positionné la granularité des accès et des règles PF au niveau de l’utilisateur. Enfin, OpenBSD a fait le choix, pour des raisons de sécurité, de ne pas faire d’inspection de paquet et ne peut donc pas servir de proxy pour la Visio ou pour la voix sur IP. Pf et OpenBSDadapté au besoin d’une PME Pour illustrer (voir Figure 1) notre propos, prenons l’exemple d’une société qui souhaite mettre en place une solution pare-feu. Pour une PME les besoins sont souvent récurrents, leurs objectifs sont avant tout d’avoir une fonction de pare-feu qui ne régule que certains flux et de pouvoir partager la connexion internet. Pour plus de sécurité, certaines PME ont besoin d’une haute disponibilité ou encore de connecter plusieurs sites en IPSEC. Dans notre cas, nous prendrons en compte que l’interface vic1 est sur le LAN et l’interface vic0 sur le WAN. Le NAT Tout d’abord nous allons fournir une connectivité internet au membre de l’entreprise. Nous allons faire du PAT sur l’adresse publique du pare-feu et nous n’auto- Figure 2. Resultat pfsync firewall 1 Figure 3. Résultat pfsync firewall 2 phpsolmag.org/fr 47 Sécurité riserons aux résidents que les ports les plus communs (http, https, smtp, dns, …). Editons donc le fichier /etc/pf.conf #Déclaration des interfaces ext = “vic0” lan = “vic1” #Regles ## Blocagede tousblock in block out all all #Tout d’abord nous activerons sortant le NAT pour les flux match out on vic0 inet from $lan:network to any nat-to $ext #Nous autorisons ici le protocol icmp en sortie pass out on $ext proto icmp from $lan:network to any #Enfin nous autorisons les requetes DNS et les flux précédement cité pass out on $ext proto udp from $lan:network to any pass out on $ext proto tcp from $lan:network to any port domain port {80,443,25,110,143,993,995} Bien sûr, cette configuration reste perfectible, mais elle est néanmoins efficace pour fournir un accès internet à notre PME. Nous avons ici et en quelques lignes créer un ensemble de règle permettant une connectivité internet basique. La documentation d’OpenBSD, étant très claire et exhaustive, nous ne détaillerons la syntaxe. Notons tout de même l’effort mis par les développeurs afin que l’outil bénéficie d’une syntaxe pratique (avec l’utilisation de tableau et de variable) et lisible facilement. Enfin vous remarquerez que le principe du last matching rule wins est ici appliqué : on met les règles par défaut en début de fichier. La syntaxe est assez similaire à celle de pfctl. Ici nous avons créer en quelques ligne une configuration permettant un tunnel IPSec de type Site à site utilisant un chiffrement reconnu tel que AES. Bien sûr comme dit précédemment ce système est interopérable avec plusieurs implémentations IPSec constructeurs. Il faut ensuite démarrer isakmpd et appliquer les changements grâce à l’outil ipsecctl. isakmpd –K ipsecctl Haute disponibilité Pour sécuriser l’architecture, nous allons secourir le pare-feu en actif/passif à l’aide d’une seconde machine et effectuer de la redondance. Nous nous appuierons sur les outils CARP et Pfsync fournit de base avec OpenBSD. Côté CARP pour la redondance, nous allons secourir l’interface Lan de notre firewall : # sur f w 1 #Creation de l’interface carp (interface virtuelle) 172.16.235.253:root#Ifconfig carp1 create #Configuration # on configure une interface afin de mettre en place le protocol Carp #Nous protegerons les communication à l’aide d’un mot de passe : pass4carp1 172.16.235.253:root#Ifconfig carp1 vhid 235 pass pass4carp1 carpdev vic1 advbase 0 advskew3 state master 172.16.235.254 netmask 255.255.255.0 #Creation de l’interface carp 172.16.235.252:root#Ifconfig carp1 create #Configuration 172.16.235.252:root#Ifconfig carp1 vhid 235 pass pass4carp1 carpdev vic1 advbase IpSEC Nous utiliserons un outil fourni de base avec les systèmes openBSD : ipsecctl qui permet de contrôler l’établissement de tunnel IPSEC. Pour cela rien de plus simple : 3 advskew30 statebackup 172.16.235.254 netmask 255.255.255.0 Main auth hmac-sha1 enc aes group modp1024 \ Ceci suffit à mettre en place la redondance sur l’interface LAN (vic1) du pare-feu. Il suffit alors en se reportant à la documentation de faire en sorte que ces changements soient persistants. On peut également mettre en place la même chose sur les interfaces Wan s’il n’existe qu’une sortie internet. Côté Pfsync pour la synchronisation des tables d’états pare-feu : psk “H@kin9” !Sur fw1 # Sur notre pare-feu Ike esp from 172.16.235.0/24 to 10.0.0.0/24 peer 192.168.100.36 \ Quick auth hmac-sha1 enc aes \ # Sur la machine distante (ici une openBSD) Ike esp from 10.0.0.0/24 to 172.16.235.0/24 peer 192.168.100.38 \ main auth hmac-sha1 enc aes group modp1024 \ quick auth hmac-sha1 enc aes \ psk “H@kin9” 48 -f /etc.ipsec.conf Ifconfig pfsync0 syncdev vic0 syncpeer 172.16.235.252 !sur fw2 Ifconfig pfsync0 syncdev vic0 syncpeer 172.16.235.253 Ceci suffit à mettre en place une synchronisation des tables d’état, c’est-à-dire synchronyser les informa- 5/2011 Sur Internet • • • • http://www.openbsd.org http://www.openbsd.org/faq/pf/fr/index.html http://www.frameip.com http://www.pfsense.org/ tions sur le flux circulant au travers du pare feu afin de garantir un arrêt minimum pour les utilisateurs en cas de bascule. Cette fonction remplace aisément un boitier propriétaire qui nécessitera souvent pour faire la même chose, l’achat d’une licence supplémentaire pour accomplir une haute disponibilité avec synchronisation des tables d’états. Nous visualisons alors le résultat (voir Figure 2). Attention, il est important de noter que pfsync ne synchronise pas les règles de filtrage, mais seulement la table des états. Pour cela, des outils tels que rsync ou dsh peuvent vous aider effectuer ce travail. Conclusion Pf et OpenBSD sont des outils très puissants permettant de gérer les mêmes fonctionnalités qu’un boitier constructeur et pour la plupart de ses besoins, de manière native. De plus le mode de développement centralisé assure une cohérence et une interactivité très poussée des outils de base de la distribution. L’outil packet filter seul est un outil puissant qui couplé avec les autres outils d’OpenBSD permet de réaliser facilement un grand nombre de fonction qui ne sont parfois disponible qu’en option sur le UTM destiné au PME. Grâce à sa syntaxe, le produit est simple à maitriser, mais pour plus de facilité, les PME peuvent utiliser un système dédié comme PFsense et ainsi bénéficier d’une interface graphique et des mêmes fonctionnalités qu’OpenBSD. DAMIEN BOLUS : EXPERT TECHNIQUE FRAMEIP Consultant réseau sécurité ToIP au sein de FrameIP. J’ai mené à bien un grand nombre de mission tels que des intégrations diverses de pare-feu ou des audits de sécurité. Cette diversité dans les missions m’a permis de prendre en main beaucoup de solution du marché, incluant des solutions Open Source, et de me confronter au besoin de clients. CLÉMENT SANNIER : CHEF DE PROJET FRAMEIP En tant que chef de projet chez FrameIP, ma mission principale est de conseiller les clients sur des solutions de sécurité. J’aime pouvoir leurs proposés diverses solutions que ce soit constructeur ou Open Source afin de répondre au mieux à leurs besoins et leurs philosophies. phpsolmag.org/fr