sommaire N°167 éditorial « Bah ! Je n’ai rien à me news reprocher moi » 04 Les nouveautés de PHP 5.5 Voici généralement l’ar- gument largement entendu netadmin de ceux qui n’ont pas d’avis ou sont potentiellement 08 Tu deviendras web designer, mon fils favorables à la surveillance 12 Vos applications web temps réel facilement avec MeteorJS globale et systématique : « De toute façon, on nous surveille déjà et je m’en fiche parce que, En couverture moi, je ne fais rien de mal, je n’ai rien à cacher ».

24 Ceci peut sembler être un argument impa- Administrez et configurez LE KERNEL rable si on retire purement et simplement l’as- Compilez un noyau : Le but de cet article sera de pect moral de la question. Pourtant, c’est un comprendre en détail comment générer un noyau GNU/Linux raisonnement totalement faux. En effet, dans la personnalisé. Chaque étape sera reprise et détaillée avec des société telle qu’elle existe, ce n’est pas un individu outils de façon à maîtriser au final l'ensemble. qui détermine ce qui est bien ou mal, juste ou A la découverte de DKMS : Qui n'a jamais eu des problèmes de injuste, normal ou déviant, entendu ou inaccep- version de drivers après la mise à jour de son noyau GNU/Linux ? table... Ce sont les normes dictées par la société Ce problème est lié principalement à la désynchronisation entre les sources elle-même. Ces notions sont donc parfaitement du noyau et celles utilisées pour générer le driver. hors de contrôle pour l’individu isolé, variables géographiquement et promptes à changer dans le temps. Repères Ainsi, l’argument qui consiste à dire qu’on n’a 42 Correction géométrique d’images prises en vue oblique – projection rien à se reprocher ne peut être valable qu’accom- sur modèle numérique d’élévation pour exploitation quantitative de pagné des mots « maintenant », « ici » et « selon photographies numériques moi-même ». En d’autres termes, ce n’est pas vous Code(s) qui décidez si vous faites quelque chose de mal ou non, mais la société, selon les normes et les 58 log4php : adoptez une méthodologie rigoureuse pour les logs de votre lois établies par et pour la société (en principe). application web Mais la surveillance globale, au cœur de 63 Abus, un autre bus light toutes les inquiétudes actuellement, implique mobilité d’autres risques, découlant de l’interprétation des informations. Lorsqu’on peut collecter toutes 78 Réutiliser du code C/C++ natif sous Android avec le Native Development les données que l’on souhaite sur « une cible », Kit (NDK) on peut littéralement faire dire tout ce que l’on Abonnements souhaite à ces mêmes données. Pire encore, si l’analyse est faite par un ensemble d’algorithmes, 21/22/29 Bons d'abonnement et de commande le risque de faux positifs est bel et bien présent. Même s’il ne s’agit que d’un faible pourcentage, Les abonnements numériques et les anciens numéros classer automatiquement une personne dans Nouveau ! sont désormais disponibles sur : les « individus à risque » ou les « possibles ter- roristes » n’a rien à voir avec le fait de placer un fichier en quarantaine ou un mail dans les en version PDF : en version papier : « spams probables ». numerique.ed-diamond.com boutique.ed-diamond.com À l’heure où je rédige cet édito, le Conseil Constitutionnel n’a pas été saisi concernant la GNU/Linux Magazine France Responsable publicité : Valérie Fréchard, Tél. : 03 67 10 00 27 est édité par Les Éditions Diamond [email protected] loi de programmation militaire (LPM) et son Service abonnement : Tél. : 03 67 10 00 20 Impression : pva, Druck und Medien-Dienstleistungen GmbH, Landau, Allemagne fameux article 13 (devenu 20). Lorsque vous Distribution France : (uniquement pour les dépositaires de presse) lirez ceci, il est donc possible que cette loi soit MLP Réassort : Plate-forme de Saint-Barthélemy-d’Anjou. Tél. : 02 41 27 53 12 Plate-forme de Saint-Quentin-Fallavier. Tél. : 04 74 82 63 04 appliquée (décrets d’application) et si tel est le B.P. 20142 – 67603 Sélestat Cedex Imprimé en Allemagne - PRINTED in Germany cas, je pense qu’il peut être tout à fait raison- Tél. : 03 67 10 00 20 – Fax : 03 67 10 00 21 E-mail : [email protected] Dépôt légal : À parution, N° ISSN : 1291-78 34 nable de commencer à réviser vos classiques, Service commercial : [email protected] Commission paritaire : K78 976 Sites : www.gnulinuxmag.com – Périodicité : Mensuel en commençant par Orwell... boutique.ed-diamond.com Prix de vente : 7,90 € Directeur de publication : Arnaud Metzler Rédacteur en chef : Denis Bodor Bonne année 1984^W2014 ! Secrétaire de rédaction : Véronique Sittler Réalisation graphique : Jérémy Gall

La rédaction n’est pas responsable des textes, illustrations et photos qui lui sont communiqués par leurs auteurs. La reproduction totale ou partielle des articles publiés dans GNU/Linux Magazine France est interdite sans accord écrit de la société Les éditions Diamond. Sauf accord particulier, les manuscrits, photos et dessins adressés à GNU/Linux Magazine France, publiés ou non, ne sont ni rendus, ni renvoyés. Les indications de prix et d’adresses figurant dans les pages rédactionnelles sont données à titre d’information, sans aucun but publicitaire. Toutes les marques citées dans ce numéro sont déposées par leur propriétaire respectif. Tous les logos représentés dans le magazine sont la propriété de leur ayant droit respectif. GNU/Linux Magazine France N°167 3 News Les nouveautés de PHP 5.5

Les nouveautés de PHP 5.5 par Stéphane Mourey [Taohacker]

Il y a quelques mois, la version 5.5 de PHP est sortie de son état de Release Candidate pour devenir la dernière version officielle. Moins attendue sans doute que la version 5.4 (qui offrait enfin une solution au problème de l’héritage multiple), la nouvelle version n’en offre pas moins quelques nouveautés intéressantes que nous allons découvrir dans cet article.

mais le suspend. La fonction reprend exac- l’empreinte mémoire de votre script. Pour 1 Les générateurs tement là où elle en était lorsqu’on lui de- ce faire, vous procédez comme pour les mande un nouvel élément de l’ensemble. autres fonctions, en précédant leur nom Depuis la version 5, PHP fournit du signe esperluette « & », tant dans sa une interface Iterator qui permet de Imaginons par exemple que vous vou- déclaration que dans son utilisation : construire des itérateurs. Les itérateurs liez parcourir les résultats d’une fonction sont des objets qui permettent d’accéder sur un intervalle donné d’entiers. Comme function &gererateurIntervalleDEntiers($debut,$fin) { à un ensemble de données, d’objets ou peu importe la fonction dans notre for ($i=$debut;$i<=$fin;$i++) { yield $i; de ce que vous voulez, pour pouvoir le exemple, nous l’appellerons fonction(). } parcourir comme un tableau. Cette possi- Nous pouvons donc construire un gé- } bilité, très intéressante et très puissante, nérateur de la façon suivante : foreach (&gererateurIntervalleDEntiers(1,10) as est toutefois un peu complexe à implé- $valeur) { function gererateurPourFonction($debut,$fin) { echo $valeur."\n"; menter : il y a cinq méthodes à écrire for ($i=$debut;$i<=$fin;$i++) { } pour remplir les exigences de l’interface, yield fonction($i); current key next rewind } à savoir , , , } Enfin, pour conclure sur les généra- et valid. Ces méthodes permettent de teurs, si réellement vous avez besoin de s’assurer que l’itérateur se comportera Ensuite, nous pouvons utiliser ce revenir en arrière dans votre parcours, comme un tableau dans les différentes générateur dans une boucle foreach, la seule solution que vous avez est de situations où il aura à le faire. éventuellement après lui avoir donné cloner votre objet générateur à l’aide un nom de variable pour la lisibilité : de l’instruction clone. Vous obtiendrez Il se peut toutefois que, tout en vou- alors un générateur identique, mais lant parcourir votre ensemble comme $monGenerateur = generateurPourFonction(1,10); réinitialisé : vous pourrez à nouveau un tableau, vous n’ayez pas besoin de foreach ($monGenerateur as $valeur) { echo $valeur."\n"; le parcourir, mais en partant du début. toute la souplesse que cela implique. Si } vous avez simplement besoin d’avancer dans votre ensemble, sans avoir jamais Si vous souhaitez que votre généra- 2 besoin de le réinitialiser ou d’aller en teur retourne une paire clé / valeur à OPcache arrière, vous pourrez utiliser un généra- chaque itération, et vous permette du Déjà disponible depuis la version 5.2, teur. Celui-ci est beaucoup plus simple à coup de construire un tableau associa- l’extension OPcache est maintenant pré- mettre en œuvre. En effet, pour créer un tif, vous utiliserez l’instruction yield en sente par défaut dans PHP 5.5. Cette ex- générateur, vous n’avez besoin d’écrire utilisant la syntaxe suivante : tension vise à stocker en cache le bycode qu’une seule fonction... des scripts précompilés dans la mémoire yield $clef => $valeur; partagée, de sorte qu’il n’est plus néces- Dans cette fonction, vous allez parcourir saire à PHP de charger et d’analyser les votre ensemble et à chaque fois que vous Si vous souhaitez renvoyer une va- scripts à chaque demande. Il en résulte disposerez d’un élément de votre ensemble leur nulle, utilisez yield sans paramètre : un gain de performance non négligeable. sur lequel vous voulez travailler, vous le yield; renverrez à l’aide de l’instruction yield Si vous utilisez l’extension Xdebug au lieu de return. La différence entre Enfin, il est possible que votre géné­ conjointement à celle-ci, il vous fau- yield et return est que yield ne ter- rateur renvoie ses valeurs par référence, dra pren­dre garde à charger OPcache mine pas le fonctionnement de la fonction ce qui est intéressant pour limiter en premier.

4 GNU/Linux Magazine France N°167 www.gnulinuxmag.com News Les nouveautés de PHP 5.5

Pour bénéficier de cette extension, il n’y a rien à faire de particulier au niveau pratiques en ce domaine. Ce n’est que du code, tout se fait au niveau du fichierphp.ini . Il faut ajouter (ou dé-commenter) dans la douleur et suite à de nombreuses les lignes suivantes : attaques que la communauté des déve- loppeurs PHP a pris conscience de l’im- [opcache] opcache.enable=1 portance de l’enjeu, même si beaucoup de sonnettes d’alarme avaient été tirées D’autres directives ont été rajoutées dans la configuration, et, curieusement, depuis longtemps. certaines des valeurs par défaut (du moins avec ma distribution Arm Arch Linux) ne correspondent pas à celles recommandées dans la documentation. J’ai résumé L’un de ces faiblesses était le stoc- les différences dans le tableau ci-dessous : kage des mots des passe utilisateurs. Trop souvent stockés en clair, simple- Directive Valeur par défaut Valeur recommandée ment hachés grâce à une fonction md5 opcache.memory_consumption 64 128 défectueuse dans certains cas, de mau- opcache.interned_strings_buffer 4 8 vaises pratiques de cryptage, il y a bien opcache.max_accelerated_files 2000 4000 des raisons expliquant les faiblesses opcache.revalidate_freq 2 60 des applications PHP. Avec la version opcache.fast_shutdown 0 1 5.5, l’équipe de PHP tente de résoudre opcache.enable_cli 0 1 le problème en proposant une nouvelle API de hachage de mots de passe qui Personnellement, je diverge de la configuration recommandée au moins sur prend en charge toute la complexité né- opcache.enable_cli : j’utilise en général PHP en ligne de commande avec divers cessaire à la sécurité requise pour une outils de développement (PHPUnit, PHPSniffer...) ou pour des tests, beaucoup plus telle tâche, et ce, de façon transparente rarement pour réaliser des scripts que j’utiliserai ensuite (bash est quand même pour le développeur. Pour ceux qui plus adapté pour ça, vous ne croyez pas ?). Du coup, il n’y a pas d’intérêt à conser- seraient sensibles à la question mais qui ver ce code en cache, puisqu’il sera rarement exécuté à l’identique. n’auraient pas la possibilité de migrer tout de suite, sachez qu’au départ cette 3 finally API a été implémentée en PHP (version supérieure ou égale à 5.3.7) et peut fonc- Une nouvelle instruction apparaît, permettant d’améliorer le traitement des ex- tionner dans l’espace utilisateur. Vous ceptions, il s’agit de finally. Cette instruction ouvre un bloc de code après les blocs trouverez les sources de cette dernière try et catch. Ce bloc finally sera toujours exécuté qu’une exception ait été levée à cette adresse : https://github.com/ ou pas, y compris si une instruction return se produit dans les blocs try et catch. ircmaxell/password_compat. Les deux Cela permet de garantir que le code sera toujours exécuté, quel que soit le résultat versions sont compatibles. de l’essai. Il est même possible d’y intercepter l’exception pour en lever une autre... Mais avant d’étudier les nouvelles function test() { try { fonctions proposées par cette API, lais- $mysqli = new mysqli(‘localhost’, ‘my_user’, ‘my_password’, ‘my_db’); sez-moi vous rappeler un point de la if ($mysqli->connect_error) throw new \Exception("Impossible de connecter !"); législation française qu’il est important } catch (\Exception $e) { echo $e->getMessage()."\n"; de connaître si vous offrez un service } finally { en ligne accessible au grand public. Le echo "Ce code sera toujours exécuté!"; throw $e; Décret n° 2011-219 du 25 février 2011 } relatif à la conservation et à la commu- } nication des données permettant d’iden- L’intérêt de finally est principalement de s’assurer que la levée d’une excep- tifier toute personne ayant contribué à tion n’empêche pas une remise en ordre nécessaire avant une éventuelle inter- la création d’un contenu mis en ligne ruption du traitement en cours. (consultable ici : http://www.legifrance. gouv.fr/affichTexte.do?cidTexte= JORFTEXT000023646013&dateTexte= 4 Nouvelle API de hachage de mots 20130822), décret d’application de la fameuse Loi sur la Confiance en de passe l’Économie Numérique (LCEN, http:// Bien souvent, on reproche à PHP ses faiblesses du côté de la sécurité. Et il faut www.legifrance.gouv.fr/affichTexte.do bien avouer ce qui est, PHP réserve quelques mauvaises surprises de ce côté-là. ?cidTexte=JORFTEXT000000801164 Mais plus grave encore que la conception du langage, le fait est que beaucoup de &dateTexte=20130822), mentionnait programmeurs PHP écrivent leur code sans avoir même connaissance des bonnes l’obligation pour les personnes offrant

www.gnulinuxmag.com GNU/Linux Magazine France N°167 5 News Les nouveautés de PHP 5.5

un service en ligne de conserver le mot des résultats différents par défaut. Dès ressources. Si vous ne renseignez pas de passe des utilisateurs en clair. Ce lors, vous pourriez craindre que vos ces options, un grain de sel aléatoire est qui était, du point de vue de la sécuri- utilisateurs ne puissent plus s’identi- utilisé pour chaque hachage et 10 est té informatique, une véritable aberra- fier. Cette crainte, bien que légitime, le cost par défaut. tion : un administrateur (sauf s’il tra- n’est pas fondée. En effet, la signature Voici donc la ligne de code recom- vaille avec Windows;)) n’a pas besoin produite par la fonction de hachage mandée pour effectuer un hachage de de connaître les mots de passe de ses contient l’indication de l’algorithme mot de passe : utilisateurs et des mots de passe cor- utilisé, de même que les options avec rectement cryptés garantissent que si lesquelles il a été utilisé (grain de sel, $hash = password_hash($password, PASSWORD_ la base de données qui les contient a coût). Vous pouvez donc à tout moment DEFAULT); été compromise, ceux-ci ne pourront changer l’algorithme de cryptage, de pas être utilisés facilement. Nombre même que ces options, sans craindre Pour vérifier l’exactitude d’un mot de prestataires ont refusé de se plier une incompatibilité avec les anciennes de passe fourni par un utilisateur, vous à la loi sur ce point et certains, dont signatures. Personnellement, bien que utiliserez password_verify() : Google et Facebook ont fait pression je n’ai pas suivi les débats qui ont me- if (password_verify($password,$hash) sur le Gouvernement pour la modifier. nés à ce choix, et bien que je n’aie pas { Il semble qu’ils aient eu gain de cause, analysé comment ces informations sont echo "Mot de passe correct !"; car le 1er avril 2012, le décret a été stockées dans la signature, j’ai le senti- }else{ modifié (http://www.legifrance.gouv. ment que l’intérêt du grain de sel et du echo "Erreur de mot de passe !"; fr/affichTexte.do?cidTexte=JORFTEXT0 changement d’algorithme est grande- } 00023646013&dateTexte=20130822). ment limité : si PHP est en mesure d’y Cette fonction est simple à utiliser : Il n’est maintenant plus question que de retrouver ces informations, un attaquant elle reçoit comme arguments d’abord conserver « les données permettant de le sera également... j’aurai tendance à le mot de passe tel qu’il a été saisi par vérifier le mot de passe ou de le modi- vouloir rajouter mon grain de sel par l’utilisateur, puis le hachage que vous fier, dans leur dernière version mise à dessus celui de PHP ! Je me contente- aurez stocké lors de la création du jour ». Autrement dit, uniquement des rai toutefois ici de montrer comment compte ou du dernier changement de informations que nous avons de toute la documentation recommande d’uti- mot de passe. façon besoin de connaître. Nous pou- liser cette API. vons donc utiliser cette nouvelle API La nouvelle API fournit encore deux Pour hacher un mot de passe, il faut sereinement, ce qui n’était pas le cas il autres fonctions : utiliser la fonction password_hash. y a quelques mois seulement... Celle-ci accepte trois arguments : le pre- - password_get_info : cette fonc- Passons maintenant à l’aspect concret. mier, obligatoire, est le mot de passe à tion prend en argument un hachage La première chose à savoir sur cette hacher ; le second, obligatoire, est une de mot de passe et retourne des nouvelle API est que l’algorithme uti- constante prédéfinie indiquant l’algo- informations sur la méthode utili- lisé pour effectuer le hachage recom- rithme à utiliser, PASSWORD_DEFAULT sée pour le produire, à savoir l’al- mandé est déterminé par une nou- est recommandé par défaut; le dernier gorithme utilisé et les options avec velle constante prédéfinie, à savoir est un tableau contenant des arguments lesquelles il a été appelé, PASSWORD_DEFAULT, dont la valeur est nommés destinés à l’algorithme de - password_needs_rehash : cette aujourd’hui la même que celle d’une cryptage (ce fonctionnement permet fonction analyse un hachage de autre constante prédéfinie, à savoir à la fonction de conserver la même mot de passe et vérifie s’il a été ef- PASSWORD_BCRYPT, indiquant que signature quel que soit l’algorithme fectué avec un algorithme et ses l’algorithme CRYPT_BLOWFISH sera à utiliser). options définis en paramètres ; utilisé par les fonctions de hachage. En principe, vous n’avez pas à vous l’idée est de permettre une migra- Aujourd’hui, il est le seul algorithme occuper des arguments optionnels, le tion progressive d’un algorithme à supporté, et on pourrait être tenté de fonctionnement par défaut étant satis- un autre plus performant : lorsque négliger cet aspect de la question. faisant. Pour informations, sachez qu’en l’utilisateur s’identifie, vous vérifier De nouveaux algorithmes, supposés utilisant l’algorithme CRYPT_BLOWFISH, si l’algorithme de hachage utilisé plus performants, sont amenés à être le tableau d’options peut en contenir est à jour, si non, vous utilisez le ajoutés et l’un d’entre eux pourrait un deux, à savoir salt, le grain de sel qui mot de passe qui vient d’être saisi jour remplacer CRYPT_BLOWFISH comme vient rendre le hachage plus compliqué pour mettre à jour le hachage avec algorithme par défaut dans une version à casser, et cost, qui définit le nombre le nouvel algorithme. Bien sûr, tout future de PHP. Le jour où cela se pro- d’itérations effectuées par l’algorithme, ceci n’est à effectuer que si le mot duira, la fonction de hachage fournira et, par conséquent son coût en terme de de passe correspond.

6 GNU/Linux Magazine France N°167 www.gnulinuxmag.com News Les nouveautés de PHP 5.5

affichera : 5 Nouveautés à connaître taophp\test0 taophp\test0 Passons maintenant rapidement en revue quelques nou- taophp\test1 veautés moins essentielles, mais qui peuvent tout de même se révéler utiles. 5.3 empty() 5.1 Déréférencement des tableaux L’instruction empty() n’acceptait jusqu’alors comme ar- et des chaînes gument que des variables. Aujourd’hui, ce n’est plus le cas et il est possible de lui passer une expression arbitraire, Le déréférencement est une notion venue du C et qui n’avait comme une fonction : jusqu’alors pas lieu d’être en PHP. En C, le déréférencement désigne la possibilité d’accéder au contenu pointé par un poin- empty(ma_fonction()); // maintenant, cette ligne de code est valide ! teur, à l’aide de l’opérateur « * »... Mais, hors une certaine parenté conceptuelle, le déréférencement en C n’a que peu de choses 5.4 Parcours de tableau de tableaux en commun avec cette nouvelle possibilité offerte par PHP. avec foreach Pour le développeur PHP, le déréférencement des tableaux Enfin, PHP 5.5 apporte la possibilité de parcourir les et des chaînes de caractères consiste simplement en une nou- valeurs de tableaux contenus dans un autre tableau direc- velle syntaxe, plus brève, permettant d’accéder plus facile- tement en permettant l’utilisation de la fonction list dans ment à un élément du tableau ou de la chaîne, sans passer l’initialisation d’un boucle foreach. Le plus simple est sans par une variable les contenant. aucun doute d’examiner un exemple :

Concrètement, il est maintenant possible d’écrire : $tableaux = [ [1,2,3], echo ["GNU/Linux Magazine","Linux Pratique","Linux Pratique Essentiel"][0]."\n"; [4,5,6], echo "GNU/Linux Magazine"[2]."\n"; ]; foreach ($tableaux as list($a,$b)) { echo "A : $a; B : $b\n"; ce qui affichera : }

GNU/Linux Magazine Ce script va produire la sortie suivante : U A : 1; B : 2; Rien de révolutionnaire là-dedans, j’imagine toutefois que A : 4; B : 5; cela peut se révéler pratique pour élaborer des chaînes des caractères destinées à l’instruction honnie eval(). Cette nouvelle possibilité n’est pas révolutionnaire, sans aucun doute, mais peu se révéler bien pratique à l’occasion. 5.2 ::class Il est maintenant possible d’accéder au nom complet d’une Conclusion classe, y compris son espace de nom, à travers le la propriété statique réservée class. Le résultat sera le même que Nous avons consacré cet article aux nouvelles fonctionnali- celui donné par la fonction get_class. Ce qui signifie que tés les plus remarquables pour vous donner un avant-goût de si vous utilisez self::class, vous obtiendrez le nom de la cette version et pour vous motiver à migrer. Toutefois, nous classe dans laquelle la méthode a été définie, et non le nom n’avons pas pour autant fait le tour de toute la question, et nous d’une éventuelle classe qui aurait hérité de cette méthode. ne pouvons que vous recommander de lire attentivement les Pour obtenir le nom de la classe actuellement utilisée dans notes officielles de migration (http://fr.php.net/migration55) une méthode dont elle aurait hérité, il faut utiliser la fonc- si vous vous décidez à franchir le pas. Bien que la plupart des tion get_called_class. Ainsi le code : scripts fonctionnant en PHP 5.4 ne devraient pas rencontrer de difficultés, certaines incompatibilités existent tout de même,

www.gnulinuxmag.com GNU/Linux Magazine France N°167 7 Netadmin Tu deviendras web designer, mon fils

Tu deviendras web designer, mon fils par Emile iMil Heitor [pour GCU canal historique]

Nous avons récemment [GLMF 166] vu comment créer facilement une application Web avec Flask. S’il s’avère relativement simple, muni de quelques connaissances python, de produire un Web Service fonctionnel, réaliser une application moderne, responsive, mais surtout jolie, peut se transformer en véritable cauchemar pour le quidam dont les connaissances en web design se limitent au strict minimum .

Fort heureusement, il existe de nos jours de nombreuses

béquilles qui aident les déficients de l’ergonomie que nous
sommes et, parmi elles, le module python WTForms et le

framework Bootstrap qui nous permettrons respective-
ment de générer des formulaires propres et de produire une
1 Au début était le moche