Kévin Subileau

Espace personnel

DSC01131_thumb

Autopsie d'un disque dur

Il y a quelques semaines, j'ai malencontreusement fait chuter un de mes disques durs sur le carrelage... Évidemment ça ne pardonne pas, et immédiatement des sifflements, des claquements et la disparition du volume sous Windows m'ont fait comprendre que je pouvais craindre le pire pour mes données.

On ne sait jamais, j'ai quand même tenté de le passer au congélateur. Cette technique un peu risquée peut fonctionner certaines fois, mais ce ne fut pas mon cas. J'ai alors décidé de l'ouvrir pour voir ce qu'il s'était passé exactement à l'intérieur du disque au moment du choc. L'occasion également d'observer de manière concrète le fonctionnement d'un disque dur, et de faire cette petite vidéo pour vous montrer tout cela :

On voit tout d'abord que ce disque dur de 500 Go (un Toshiba MK5059GSXP) est composé de 2 plateaux et donc 4 têtes de lecture/écriture. Malgré le choc, tous les éléments semblent en bon état à première vue. Mais en y regardant de plus près, on remarque qu'une des têtes s'est décrochée de son support, comme on peut le voir dans la vidéo et sur la photo ci-dessous. Lire la suite →

wordpress-hack

Vulnérabilité mfunc dans W3 Total Cache et WP Super Cache

Le week-end dernier, j'ai reçu simultanément trois commentaires plutôt originaux à modérer sur ce site. En effet, ces derniers tentaient d'exploiter une vulnérabilité connue sur les deux plugins de cache les plus populaires, W3 Total Cache et WP Super Cache. Cette faille de sécurité a été reportée il y a un an environ par kisscsaby sur le forum WordPress, et a fort heureusement été totalement corrigée depuis. J'ai tout de même souhaité vous en parler car je l'ai trouvée intéressante à étudier et aussi parce qu'elle reste active sur les nombreux sites non mis à jour...

wp_mfunc_vulnerability

Voilà un commentaire plus que suspect...

Cette attaque s'appuie sur plusieurs fonctions (mfunc, mclude, et dynamic-cached-content) présentes sur les versions vulnérables (W3TC ≤ 0.9.2.8 ou WPSC ≤ 1.2), et permet d'exécuter un code PHP arbitraire sur le serveur. Autant dire que l'on peut tout faire ! Pour comprendre, il faut savoir qu'un site WordPress avec une version vulnérable d'un de ces plugins va exécuter le code PHP situé à l'intérieur de la balise ouvrante mfunc. Par exemple, le code <!--mfunc echo PHP_VERSION; -–><!–-/mfunc-–> va afficher la version de PHP utilisé.

Cette fonctionnalité permet initialement au développeur du site d'indiquer les éléments qui ne doivent pas être mis en cache par le plugin, comme par exemple la date ou le temps de génération de la page. Le code compris dans cette balise est alors exécuté à chaque fois, tandis que le reste de la page est mis en cache.

Lire la suite →

windows-network

Supprimer les anciennes connexions réseau de Windows

Au fur et à mesure que vous ajoutez des connexions réseau (carte réseau, clé USB Wi-Fi) de même type, Windows ajoute un numéro à la fin du nom de la connexion réseau afin que ce nom soit unique. Par exemple, si vous connectez une première clé Wi-Fi, Windows la baptisera probablement Connexion réseau sans fil (ou Wi-Fi sous Windows 8). Si par exemple cette clé tombe en panne et que vous en brancher une seconde pour la remplacer, Windows la nommera Connexion réseau sans fil 2, et ainsi de suite.

Si vous souhaitez renommer cette nouvelle connexion pour lui donner le nom de l'ancienne (c'est à dire retirer le chiffre), Windows le refusera en indiquant qu'une connexion avec le nom spécifié existe déjà. En fait, Windows ne sait pas que l'ancienne connexion ne sera plus jamais utilisée, et la garde donc en mémoire à vie afin de lui attribuer le même nom dans l'hypothèse où elle serait à nouveau utilisée.

connexions_reseau_windows

Pour pouvoir attribuer à nouveau un nom précédemment utilisé pour une autre carte réseau, il faut donc indiquer à Windows que cette carte ne sera plus jamais utilisée en la désinstallant. Pour cela, ouvrez une fenêtre d'invite de commande (Menu Démarrer/Tous les programmes/Accessoires/Invite de commandes), puis tapez les commandes suivantes :

set DEVMGR_SHOW_NONPRESENT_DEVICES=1
devmgmt.msc

Dans la fenêtre du gestionnaire de périphérique qui s'affiche alors, cliquez sur Affichage puis Afficher les périphériques cachés. Cela permet d'afficher les cartes réseau déconnectées mais toujours installées. Dans la liste des périphériques, déroulez la rubrique Cartes réseau, puis supprimer les cartes qui ne vous sont plus utiles en effectuant un clic droit puis Désinstaller. Attention toutefois à ne pas désinstaller une carte encore utilisée sous peine de devoir la réinstaller ! Pour vous y retrouver, sachez que la petite icône à gauche du nom de la carte réseau apparait légèrement plus claire si cette carte n'est pas physiquement connectée à l'ordinateur.

Une fois ce nettoyage correctement effectué, vous devriez désormais pouvoir renommer vos connexions réseau en attribuant des noms précédemment utilisés.

eduroam_trans_200pix

Se connecter à Eduroam, le réseau Wi-Fi universitaire

Eduroam est un réseau sans fil accessible gratuitement à la plupart des étudiants, enseignants et chercheurs des universités françaises (y compris les DOM/TOM), dont l'Université d'Auvergne et l'Université Blaise Pascal à Clermont-Ferrand.

Par rapport aux autres réseaux Wi-Fi universitaires, comme Auversup Sans Fil, Eduroam présente plusieurs avantages. Il offre tout d'abord un débit symétrique généralement plus élevé (autour de 7 Mb/s à Clermont-Ferrand). Ensuite, la connexion se fait automatiquement, sans avoir à saisir son mot de passe à chaque connexion, et est totalement sécurisée et cryptée, contrairement à Auversup Sans Fil où il est possible d'intercepter en clair toutes les communications. Enfin, il est possible de se connecter en déplacement dans une autre université que celle où l'on est inscrit.

Toutefois, la méthode de connexion et de cryptage employée complique un peu le paramétrage initial de la connexion Wi-Fi. Je vous donc propose ce petit guide pour vous aider à configurer correctement la connexion. Ce guide est plus particulièrement destiné aux étudiants et personnels des deux universités clermontoises. Pour les autres universités, certains paramètres peuvent être différents.

Liens rapides : Windows 7 et 8 | Linux (Ubuntu) | Android Lire la suite →

tux-disc

Images disques sous Linux en ligne de commande

Aujourd'hui je vous propose ce petit mémo des différentes commandes utiles à la création et à la gravure des fichiers ISO sous Linux, qui, contrairement à d'autres (suivez mon regard...), dispose à portée de main de tous les outils utiles pour gérer les images disques !

Création d'un ISO à partir d'un disque physique

Tout d'abord, insérez le disque dans le lecteur :P (non je ne suis pas en train de me moquez de vous...), puis tapez la commande suivante :

dd if=/dev/cdrom of=~/image.iso

La commande dd permet simplement d'effectuer une copie brute des données d'un point à un autre. Ici, on indique comme source (if pour input file) le fichier représentant le lecteur de DVD. Au passage, ajustez ce paramètre en fonction de votre distribution Linux. Sur certaines d’entre elles, ce fichier peut se nommer cdrom0, cdrom1, sr0 ou sr1 par exemple. Enfin, le paramètre of (pour output file) permet d'indiquer le chemin du fichier ISO de sortie. Là encore, adaptez ce chemin en fonction de ce que vous souhaitez.

Simplissime, non ? :D

Création d'un ISO à partir d'un dossier

La création d'une image disque à partir d'un dossier de fichiers est tout aussi simple. Cela s'effectue à l'aide de la commande mkisofs. Toutefois, sur certaines distributions, cette commande s’appelle désormais genisoimage suite à des problèmes de licences. Adaptez donc selon votre cas. Si aucune des deux commandes n'est présente, installez le paquet genisoimage.

Voici la syntaxe de la commande :

mkisofs -o ~/image.iso ~/dossier_source

Il vous suffit donc d'indiquer le chemin du fichier ISO en sortie ainsi que le chemin du dossier contenant les éléments à inclure dans l'image disque. La syntaxe de la commande genisoimage est identique, il vous suffit donc de remplacer le nom de la commande.

Monter une image

Pas besoin d'un Daemon tools vérolé pour monter une image disque sous Linux. Il vous suffit pour cela d'utiliser la commande.... mount bien sûr ! Voici la syntaxe à utiliser :

mount -t iso9660 -o loop image.iso /mnt/point_de_montage

On utilise ici le montage en boucle locale (loop), qui doit être activé dans les options de compilation du noyau pour que cette commande fonctionne, ce qui est fort heureusement le cas dans la plupart des distributions.

Gravure d'un ISO

La gravure est une opération un  peu plus délicate car il faut contrôler correctement les paramètres du graveur. Pour cette opération, il faut utiliser la commande wodim, fournie par le paquet du même nom. Pour les mêmes raisons que la commande mkisofs, cette commande se nomme cdrecord sur certaines distributions. Encore une fois, c'est à vous d'adapter. Voici la ligne de commande à utiliser :

wodim -v speed=4 dev=/dev/cdrom image.iso

Ici encore il faut modifier le nom du pseudo-fichier représentant votre graveur en fonction de votre système. Sachez également que la commande wodim permet également d'obtenir des informations sur votre graveur, de graver un CD audio ou encore d'effacer un DVD-RW. Consulter votre meilleur ami le man pour en savoir plus, ou votre second meilleur ami Google :D .

Convertir une image Nero (NRG) en ISO

Les précédentes astuces ne fonctionnent qu'avec des images au format ISO. Si vous avez des images disques issues de Nero au format propriétaire NRG, vous pouvez toutefois les convertir en ISO par deux méthodes. La méthode fainéante consiste à utiliser la commande nrg2iso du paquet éponyme.

nrg2iso image.nrg image.iso

La méthode un peu plus élaborée, mais qui reste assez simple, utilise la commande dd pour retirer simplement l'en-tête que Nero ajoute (c'est exactement ce que fait la commande nrg2iso, et rien de plus !) :

dd if=image.nrg of=image.iso bs=2048 skip=150

A noter que l'utilitaire nrg2iso existe aussi sous une version graphique pour Windows sur ce site.

Voilà, j'espère que ce mémo vous sera utile ! N'hésitez pas à le partager et à le commenter en ajoutant vos propres astuces autour de ce sujet :D

C++

C++ : Déclarer une variable dans un switch

En C++, il est possible de déclarer une nouvelle variable à tout moment dans le code... ou presque !

Ainsi, l'extrait de code ci-dessous est évidemment parfaitement valide et compile sans erreur :

for (int i = 0; i < 10; ++i) {
    std::cout << "Itération n°" << i << std::endl;
    int dummy;
    dummy = i * i;
    std::cout << "Le carré de " << i << " est " << dummy  << std::endl;
}

On note que la variable dummy est définie au milieu du code, sans que cela ne pose problème. Partant de ce constat, on pourrait croire que le code suivant compile également sans problème (en supposant que la variable choix est définie) :

switch (choix) {
    case 1:
        std::cout << "Choix 1." << std::endl;
        int dummy = time(NULL); // Erreur !!
        std::cout << "Il est " << dummy << std::endl;
        break;
    default:
        std::cout << "Choix inconnu." << std::endl;
        // std::cout << "Il est " << dummy << std::endl;
        break;
}

Et bien non ! Si vous compiler un code de ce genre, le compilateur le refusera en indiquant une erreur du type :

error: jump to case label
   crosses initialization of 'int dummy'

ou encore, selon les cas :

error: initialization of 'dummy' is skipped by 'case' label

La raison de cette erreur est que la portée de la variable définie à l'intérieur d'un case s'étend à l'ensemble du switch, et pas seulement à ce case. Le case n'est qu'un label, et ne limite pas la portée de la variable, qui n'est limitée que par les accolades englobantes du switch. Que se passerait il alors si le compilateur ne disait rien et que je décommentais la ligne 9 du code précédent ? Et bien, dans le cas où choix serait différent de 1, l'initialisation de la variable faite à la ligne 4 serait sautée puisque seul le bloc default serait exécuté. La variable dummy serait donc définie (puisque sa portée est globale à tout le switch) mais non initialisée (puisque l'initialisation n'a pas été exécutée). Dans cet exemple, dummy est un entier, il contiendrait simplement une valeur indéterminée. Mais ce pourrait tout aussi bien être un objet, et dans ce cas, le constructeur ne serait pas appelé si choix est différent de 1 ! Ce comportement risqué est donc interdit par le compilateur.

Pour résoudre ce problème, il faut explicitement limiter la portée de la variable en entourant le code du case par une paire d'accolades, comme ci-dessous :

switch (choix) {
    case 1:
    {
        std::cout << "Choix 1." << std::endl;
        int dummy = time(NULL); // Ok !!
        std::cout << "Il est " << dummy << std::endl;
        break;
    }
    default:
        std::cout << "Choix inconnu." << std::endl;
        // Désormais interdit car la variable est hors de portée !
        // std::cout << "Il est " << dummy << std::endl;
        break;
}

La portée de la variable dummy est ainsi limitée au case, et il devient impossible de l'utiliser dans un autre case.

Voilà pour cette petite astuce de programmation en C++ assez simple, il suffit juste d'y penser ! A noter que ce problème et sa solution s'applique aussi lorsque l'on déclare une variable entre un goto et le label ciblé par ce goto. Mais bon, c'est bien connu, plus personne n'utilise le goto de nos jours...

Source

lorem-ipsum

Générer un faux texte en une ligne de PHP

Lorsque l'on développe un site ou une application Web, il est souvent très utile de pouvoir remplir la base de données ou la page Web de faux texte, de type Lorem ipsum. En effet, cela permet de se concentrer sur le design et la mise en page sans pour autant avoir le contenu final de la page et sans que ce contenu ne détourne notre attention.

Mais plutôt que de copier/coller ces faux paragraphes sans cesse, saviez-vous qu'il est possible de le "générer" facilement avec une ligne de code PHP ? C'est plus classe, ça prend moins de place dans le code côté serveur, et surtout vous pouvez l'utiliser pour remplir la base de données et pas seulement pour l'afficher directement !

Le suspens a assez duré, voici le code en question :

$lipsum = simplexml_load_file('http://www.lipsum.com/feed/xml?amount=1&what=paras&start=0')->lipsum;

Bon, ok, j'ai un peu triché. En réalité, on ne génère pas réellement le lipsum en PHP, mais on utilise plutôt l'API du site lipsum.com. Mais peu importe, le but principal est atteint, on a un faux texte en une ligne de PHP !

Pour allez plus loin, vous pouvez transformer cette simple ligne en une fonction un peu plus évoluée qui vous permettra de contrôler un peu plus de paramètres sur le texte généré :

function generer_lipsum($quantite = 1, $type = 'paras', $lorem = false) {
    $url = "http://www.lipsum.com/feed/xml?amount=$quantite&what=$type&start=".($lorem?'yes':'no');
    return simplexml_load_file($url)->lipsum;
}

Où les paramètres sont :

  • $quantite : la quantité de texte à générer.
  • $type : l'unité de comptage de la quantité de texte : paras pour paragraphes, words pour mots, bytes pour octets ou lists pour des listes HTML. Ainsi, si vous définissez $quantite à 5 et $type à words, vous allez générer une phrase aléatoire de 5 mots.
  • $lorem : Si vrai, force le texte généré à débuter par "Lorem ipsum dolor sit amet...".

Voilà pour cette petite astuce qui me plait beaucoup et qui, je l'espère, vous plaira tout autant ! Et si vous en connaissez d'autres de ce style, n’hésitez pas à les partager en commentaire de cet article :D .

Octocat

GitHub offre 5 dépots privés aux étudiants

GitHub est sans doute le service d'hébergement et de gestion de code source le plus populaire du Web. Par défaut, lorsque vous créez votre compte, vous disposez gratuitement d'autant de dépôts (repository) que vous souhaitez, à condition que ces dépôts soient publics. Si vous ne souhaitez pas publier le code source ou limiter son accès à certaines personnes, vous devez mettre la main à la poche et choisir un des forfaits proposés en fonction du nombre de dépôts privés dont vous avez besoins.

Sauf si, tout comme moi, vous avez toujours la chance toute relative d'être encore étudiant ! En effet, GitHub offre sur simple demande 5 dépôts privés durant 2 ans à tous les étudiants inscrits au service.

Pour cela, après vous être connecté sur la plateforme avec vos identifiants habituels, rendez-vous simplement à l'adresse https://github.com/edu, cliquez sur "I'm a student", et remplissez le court formulaire en indiquant notamment votre nom, votre adresse email, et une courte description de votre besoin. Utilisez de préférence l'adresse email fournie par votre université afin de faciliter le traitement de votre demande. Si cette adresse n'est pas dans la liste déroulante, faites un détour par la page https://github.com/settings/emails pour l'ajouter et la vérifier. Si votre université ne vous fournit pas d'email, vous pouvez utiliser une autre adresse mais il est possible que GitHub vous demande des scans de documents permettant de justifier de votre statut d'étudiant.

Sous réserve que votre demande soit accordée, vous recevrez sous 24 heures environ un email très sympathique à l'adresse que vous avez renseigné pour vous indiquer que votre compte a été mis à jour, vous faisant ainsi économiser près de $170 !

github-free-student-micro-account

Vous pourrez ensuite contrôler l'accès à vos dépôts privés et ajouter si nécessaire votre binôme de projet ou tout autres collaborateurs, étudiants ou non, sans que ces derniers n'aient à payer quoi que ce soit !

Enfin, si vous avez besoin de plus de 5 dépôts privés et que vous ne souhaitez pas débourser un centime, vous pouvez également vous tourner vers d'autres services similaires, comme BitBucket, qui propose un nombre illimité de dépôts privés limités à un quota de contributeurs. Mais vous ne profiterez pas de la grande popularité et de la dimension sociale de GitHub...