jeudi 14 décembre 2017

[SI] Modèle Entité/Association : quelques notes

Le modèle Entité/Association est très répondu dans le domaine des Systèmes d'Information. Il permet de modéliser la partie statique (les données) d'un Système d'Information. Il est souvent utilisé comme un Modèle Conceptuel des Données (MCD) pour l'approche Merise.

Contrairement au diagramme de classes, le modèle Entité/Association se concentre sur les données seulement ce qui permet un passage plus précis et plus facile vers une base de données relationnelle au niveau physique.
Le modèle Entité/Association repose sur quatre notions de base :

  1. Entité : tout objet manipulé dans le système.
  2. Association : les liens entre les entités.
  3. Propriété : les attributs des entités et des associations.
  4. Cardinalité : l'aspect quantitatif d'une association.
Il évident que ces définitions sont très simplifiés et très simplistes. Notre objectif, dans cet article, n'est pas de présenter un cours en Système d'Information mais de donner des points essentiels à ne pas oublier durant l'élaboration d'un diagramme Entité/Association :

1. Chaque entité doit avoir des propriétés. Elle doit avoir au moins une propriété qui sera la clé.

2. Une entité est une représentation d'un ensemble d'instances qui partagent les mêmes propriétés. Ainsi, l'entité Etudiant (le nom d'une entité doit être toujours au singulier) est une représentation de plusieurs instances (plusieurs personnes) qui ont le même rôle et qui partage les mêmes attributs dans un établissement d'enseignement. Ainsi, si nous avons des informations constantes (qui ne changent pas dans le temps) et uniques (absence de la notion d'instance), ces informations ne sont pas représentées dans le modèle Entité/Association. Par exemple, si nous avons une seule salle machine, il est évident que toutes les séances de TP seront organisées dans cette salle et il n'y a aucun besoin pour créer une entité Salle Machine, ni pour créer l'association Se Déroule A.

L'entité Salle Machine n'est pas nécessaire parce qu'il existe une seule Salle Machine


3. Le système ne doit pas figurer comme entité. Mettre le système étudié comme entité représente une grosse erreur qui falsifier complètement le modèle et cela est pour les raisons suivantes :

    a. Il n'existe qu'un seul système, ainsi, la notion d'instance est absente.
    b. Toutes les entités sont manipulées à l'intérieur du système et toutes les associations sont créées à l'intérieur du système. Si nous le mettons comme entité alors nous devons le lier à toutes les entités et à toutes les associations.
    c. Les liaisons du point b ci-dessus, même créées, ne portent aucune information additionnelle. Nous savons déjà que toutes les entités et toutes associations existent à l'intérieur du système.

4. Le modèle doit être connexe, c'est à dire, nous ne devons pas avoir deux sous ensembles des entités S1 et S2 où quelques soit x de S1 et quelque soit y de S2 il n'y a aucune association entre x et y.

5. Il n'y a aucune condition sur le nombre des associations entre deux entités. Nous mettons autant que le système voit comme association entre les deux entités.

6. Il n'y a aucune condition sur les cardinalités aux deux côtés d'une association entre deux entités A et B sauf l'interdiction d'un couple particulier (1, 1) et (1, 1) ( (1, 1) dans les deux côtés de la même association). Ce couple veut dire que ne pouvons pas avoir une instance de A sans une instance de B comme nous ne pouvons pas avoir une instance de B sans une instance de A. Ainsi, nous nous trouvons dans une situation d'interblocage et nous ne pouvons pas créer ni des instances de A, ni des instances de B. Sur le plan conceptuel, ce couple de cardinalités veut dire que les deux instances existent ensembles, par conséquence, elles doivent être fusionnées pour éviter le problème.

Cardinalités intérdites : (1, 1) et (1, 1) dans la même association.


Le modèle Entité/Association est très utile pour débuter en systèmes d'information. Comprendre les deux dimensions statique/dynamique du système et pourvoir les séparer sont très essentiel pour tout future concepteur des Systèmes d'Information.

[SI] Diagramme des flux d'information : quelques notes

Le diagramme des flux d'information tente de représenter les différents flux d'information dans une organisation durant une activité donnée. Le diagramme se base sur deux notions :

1. Acteur : tout entité qui peut émettre ou recevoir un flux d'information. On distingue les acteurs externes et les acteurs internes (selon les frontière du système). Un acteur est représenté par une forme ovale.

2. Un flux d'information : un déplacement d'information entre un émetteur et un récepteur. Un flux est représenté par une flèche (arc orienté) de l'émetteur vers le récepteur.

En préparant un diagramme des flux d'information, nus devons garder en esprit les points suivants :
1. On ne s'intéresse qu'aux flux d'information. Ainsi, les flux des biens (produits finis, matière première, matériel, etc..) et les flux monétaires (paiement) sont ignorés. Néanmoins, si l'un de ces flux est associé à un document qui le justifie, ce document doit être pris en considération.

2. Les flux sont numérotés dans un ordre chronologique (le premier flux prend le numéro 1, le deuxième flux le numéro 2, etc..). Nous pouvons désigner que deux flux s'effectue en même temps en donnant le même numéro aux deux.

3. Un flux peut être associé à une condition s'il n'arrive pas toujours.

4. Nous ne considérons pas tout message échangé comme un flux d'information. Si le message ne change pas entre les différentes instances des acteurs impliqués ou bien entre les différentes activités de l'organisation, ce message n'est pas une information.

5. Les processus métier (activités) présentés dans les diagrammes des flux d'information sont (généralement) logiques et organisés. Ainsi, une activité est déclenchée par un seul acteur qui génère le premier flux d'information. Par la suite, nous ne pouvons pas imaginer un autre acteur qui émis un flux sans recevoir au préalable un autre flux précédent. Il est même très souvent de voir que si le flux "n" est émis d'un acteur A vers un acteur B, le flux "n + 1" sera émis de l'un des deux acteurs.

6. Suivant la règle 5, un diagramme de flux d'information doit être connexe, c'est à dire, nous ne devons pas avoir deux sous-ensemble S1 et S2 tels que quelque soit l'acteur x de S1 et quelque soit l'acteur y de S2, il n'y a pas de flux entre x et y.

7. Un flux 'information ne concerne qu'une seule activité, ainsi, si la description donnée commence à décrire les étapes d'une autre activité, vous devez lui attribuer un deuxième diagramme des flux d'information.

8. Les description donnée en langue naturelle sont affectée par cette dernière. En effet, la langue humaine (langue naturelle) n'est pas exacte, ambiguë et cache des informations implicites. Ainsi, il faut garder en esprit les notions sur la gestion et l'organisation des entreprises. A titre d'exemple, si le flux "n" est une demande, il faut s'attendre à ce qu'il y aura un flux "n + d" (tel que d ≠ 0) comme réponse à la demande émise.

Le diagramme des flux d'information est l'un des plus anciens diagrammes utilisés pour modéliser l'aspect informationnel des activités de l'entreprise. Comprendre ce diagramme est essentiel pour chaque débutant dans le domaine des Systèmes d'Information. Cette compréhension permet de mieux cerner la notion d'information et du rôle d'un système d'information. Cette compréhension est importante, aussi, pour une meilleure saisie des notions plus récentes telles que le Workflow et ses technologies.

mercredi 6 décembre 2017

[SIAD][GOE] L'application des idées de l'école des relations humaines

Dans la théorie des Organisations, l'école des Relations Humaines insiste sur la prise en compte de l'aspect humain des employés par les managers. Une dimension complètement ignorée par l'école classique qui essayait de bâtir l'industrie en se focalisant entièrement sur l'aspect technique et en faisant face à l'absence de ma main d'oeuvre qualifiée.

L'école des Relations Humaines exploite les différentes propositions dans le domaine social et psychologique pour améliorer les conditions de travail. Cette amélioration en veut pas dire forcément un changement technique ou une modification des processus métiers.

Dans cette vidéo, nous pouvons voir les différents efforts fournis par l'entreprise pour pouvoir améliorer la qualité de vie dans l'entreprise. Il est claire que ces efforts reposent sur la pyramide de Maslow : ils visent à rendre l'entreprise plus qu'une simple source pour la satisfaction des besoins  de base (physiologique et sécurité). L'objectif est d'atteindre un niveau plus haut de la pyramide en créant un lien d'appartenance entre l'employé et l'entreprise.
Pyramide de Maslow des besoins humaines

Le sport entre collègues, les activités en équipes et les sorties collectives ne réduisent pas le temps de travail et ne représentent pas un coût très cher, mais, leur gain est inestimable. L'employé se sent respecté et estimé pour sa personne, indépendamment de sa position dans l'entreprise. Il se sent aussi comme faisant partie d'une chose plus grande et qu'il grandit avec elle. Les liens d'amitié limitent les conflits et améliorent la communication entre les membres d'équipe. L'entreprise devient la deuxième famille de l'employé.

A ce stade, il est naturel de voir des employés qui innovent pour leur entreprise et qui tente d'améliorer les choses même si cela n'est pas de leur obligation. En se sentant entendus et respectés par les managers, ils peuvent fournir des efforts supplémentaires, même non rémunérés, pour le bien de l'entreprise.



Exercice Corrigé : Diagramme des flux d'informations (Fromation des employés)


Exercice

Chaque année, une entreprise de fabrication des équipements électroniques fait des formation pour une partie de ses employés pour rester à jour avec les avancées technologiques.
Après la réception du budget réservé aux formation, le service de gestion des ressources humaines contacte les différents départements pour recenser les besoins de chaque département. Après la réception des réponses, le service prépare une liste des employés et des formations qu'ils vont suivre. Il contacte chaque employé pour lui informer du dossier à fournir. L'employé prépare le dossier et le dépose au niveau de son département. Chaque département vérifie les dossiers qu'il reçoit et les envoie par la suite au service de gestion des ressources humaines. Ce dernier prépare les documents nécessaires pour chaque employé (autorisation d'absence, ordre de mission, justificatif de paiement) et les envoie aux employés concernés.


Exercice Corrigé : Diagramme des flux d'informations (Justification d'une absence)


Exercice

Un étudiant est autorisé à manquer ses séances à l'université si sa santé ne lui permet pas d'assister. Néanmoins, il doit justifier son absence.
Dans un délai de 48h, l'étudiant dépose une demande et les documents médicaux (ordonnance, certificat médical) au niveau du secrétariat de son département. Les secretaires vérifient les documents déposés. S'ils présentent un problème (traitement non suivi, dépacement du délai), la demande est rejetée et les documents sont retournés à l'étudiant. Sinon, les secrétaires vérifient l'emploi du temps de l'étudiant et préparent la liste des séances à justifier (séances des travaux dirigés et des travaux pratiques). Sur ce, un justificatif d'absence est préparé et envoyé au chef de département pour validation et signature. Après récupération, le justificatif est livré à l'étudiant qui le présente en cas de demande des enseignants.


Exercice Corrigé : Diagramme des flux d'informations (Inscription bourse universitaire)


Exercice

Au début de chaque année, les étudiants désirant bénéficier de la bourse universitaire doivent s'inscrire.
L'étudiant dépose le dossier demandé au niveau du bureau d'inscription. L'agent vérifie les documents présentés (liste et validité). Si un document manque, le dossier est retourné à l'étudiant sur place. Les dossiers acceptés sont envoyés par la suite au siège des oeuvres universitaires où une vérification de conformité est effectuée. Si des pièces ont été trouvées invalides, une liste de ces pièces est envoyée à l'étudiant pour ramener de nouvelles copies. Après le dépôt de ces pièces et la compléter du dossier, une lettre qui confirme l'inscription au service de la bourse universitaire est envoyée à l'étudiant.


Exercice Corrigé : Diagramme des flux d'informations (Maintenance de SONELGAZ)


Exercice

L'entreprise SONELGAZ garantit la maintenance des équipements électriques installés chez les clients.
En cas de panne, le client dépose une demande de maintenance au niveau du service commercial le plus proche de son domicile. Après vérification du contenu de la demande, le service commercial confirme la demande et l'envoie au service technique. Une équipe du service technique se déplace au domicile du client pour vérifier la panne et déterminer les équipements nécessaires pour la réparer. L'équipe retourne ensuite au siège pour récupérer les équipements nécessaires et revient plus tard pour réparer la panne. Après la fin de la réparation, un PV (procès verbal) qui confirme la réparation est préparé en deux copies et donné au client pour vérification et signature. Le client signe les deux copies, il garde une et retourne la deuxième à l'équipe de réparation. Cette dernière renvoie la copie signée au service commercial qui inscrit les frais de réparation dans la prochaine facture. 


Exercice Corrigé : Diagramme des flux d'information (Certificat de travail)


Exercice

Pour récupérer une copie du certificat de travail, l'employé se rapproche du service du personnel pour déposer une demande qui contient ses informations personnelles. L'employé au service personnel fait une vérification dans les dossiers des employés. Si aucune erreur n'est présente, elle prépare une copie du certificat de travail et l'envie au doyen de la faculté pour signature. Après sa récupération, le certificat est remis à l'employé concerné. Si une erreur est détectée, une réponse est rédigée par l'employé du service du personnel et remise à l'employé concerné pour qu'il puisse entamer une procédure de correction des données du dossier.


Exercice Corrigé : Diagramme des flux d'informations (Relevé de notes)

Exercice

Pour récupérer une copie du relevé de notes, l'étudiant se présente au secrétariat de son département et dépose une demande qui mentionne l'année d'études, l'année universitaire et le type du relevé qu'il désire récupérer. La secrétaire fait une vérification au niveau des archives du département. Si aucun problème n'est présent, elle prépare le relevé et l'envoie au chef de département pour la signature. Le relevé est remis à l'étudiant après sa récupération. Si un problème est détecté (une erreur des données, dossier introuvable, etc.), la demande est remise à l'étudiant avec le motif de refus.


Exercice Corrigé : Diagramme des flux d'informations (Paiement au trésor public)


Exercice

Pour effectuer des paiements envers les institutions publiques, il faut passer par le trésor public de la wilaya. L'administration concernée par le paiement doit fournir au citoyen un bon de paiement qui contient les informations sur cette administration, le motif de l'opération et le montant à payer. Le citoyen doit se présenter au guichet de réception au trésor public de la Wilaya. L'employé lui prépare, en se basant sur le bon de paiement, un reçu de paiement en deux copies. Le citoyen se dirige, ensuite, vers la caisse et effectue le paiement nécessaire. Sur ce, le caissier signe et vise les deux copies; il garde une copie et rend l'autre au citoyen comme preuve de paiement à remettre à l'administration concernée.


Exercice Corrigé : Diagramme des flux d'informations (Achat des matériaux de construction)


Exercice

Un magasin de vente des matériaux de construction dispose d'un point de vente (showroom) et d'un magasin de stock (qui se situe en dehors de la ville). Pour acheter des produits, le client doit se présenter au point de vente et présenter un bon de commande détaillé avec le paiement nécessaire (en espèce ou par chèque bancaire). Le responsable des ventes lui donne, en contrepartie, une facture signée. Le client se dirige, ensuite, vers le magasin de stock. En recevant la facture, le responsable des stocks fournit au client les produits mentionnés ainsi que la facture avec la mention "Livrée".


Exercice Corrigé : Diagramme des flux d'informations (Etat Civile)


Exercice

Pour pouvoir récupérer un document de l'état civil, un citoyen doit se présenter au siège de mairie le plus proche de son domicile. Il doit s'orienter vers le guichet chargé du document voulu et présenter sa carte d'identité. Après vérification de son identité, l'employé du guichet demande au citoyen de préciser le document qu'il veut récupérer et le nombre des copies. Suivant la réponse donnée, l'employé préparer les documents en question et les rend au citoyen. Ce dernier se dirige vers le guichet du chef du service pour vérification et signature des documents tirés.




mercredi 29 novembre 2017

Position du module "Système d'Information" dans la formation Licence Informatique

Le module "Système d'Information" est un module enseigné pour les étudiant en 2ème année Licence Informatique à travers le territoire national. Ce module est enseigné dans l'université pour plusieurs autres spécialités et depuis des dizaines d'années. Une bonne partie du cours n'est pas mise à jour et enseignée telle qu'elle l'était depuis plus de 20 ans. Par rapport aux nouvelles technologies et nouvelles approches (Cloud Computing, No SQL, reactive programming, etc..), ce module semble bien dépassé et expiré.

Mais, la réalité est bien le contraire. Le module "Système d'Information" n'a jamais était à propos d'une technologie et ne le sera jamais. Ce module vise à faire comprendre des notions abstraites, présentes dans toutes les organisations et nécessaires pour pouvoir comprendre les enjeux à faire face durant la conception d'un "Système d'Information". Comme la notion de variable qui existe depuis 60 ans dans les programmes d'enseignement, la notion "Système" doit être présentée comme elle l'était depuis toujours.

Malgré que le module est généralement doté d'une partie pratique attachée à une méthode ou approche particulière, cette dernière n'a jamais été son objectif. Ainsi, si nous donnons Merise (on l'utilise encore pour enseigner) comme un exemple d'application, c'est pour pouvoir donner des exemples sur les notions théoriques que l'étudiant doit saisir. L'objectif n'est jamais le MCD, MCT ou MOT.

L'importance de ces notions réside dans leur niveau d'abstraction très élevé. En effet, elles sont indépendantes de toute technologie, de toute approche et de toute forme d'organisation. Elles sont si abstraites qu'elles englobent toutes ces notions. Les notions abstraites données en "Système d'Information" définissent les positions de ces derniers éléments, leurs rôles, les exigences qu'ils doivent respecter et leur dimension fonctionnelle.

Sur le plan pratique, le module vise à introduire les étudiants à cette idée de reprendre une organisation, de comprendre son fonctionnement et de proposer une solution d'automatisation. Cette activité de modélisation doit être comprise, non pas dans le cadre de l'approche choisie comme champs d'application, mais dans son principe de base et sa philosophie générale.

Ainsi, ce module marque les frontières entre les spécialistes et les amateurs. Ceux sont ces notions qui permettent aux professionnels de choisir la bonne solution pour le bon problème. Et par bonne solution, je veux dire sur le plan technique, conceptuel et organisationnel. Ainsi, on ne trouvera jamais un professionnel qui construit une solution pour une grande organisation en utilisant une API JavaScript proposée depuis un mois juste parce que c'est la mode.

En terme de formation, ce module est lié à d'autres modules dont il représente une introduction. Le module Base de Données repose sur les notions acquises pour justifier la construction des applications autour des données centralisées dans des bases de données. Par la suite, le module Adminsitration des Bases de Données continuera sur la même voie et nécessitera la compréhension de la notion de charge et une imagination de la taille des données dans une organisation donnée. Le module Génie logiciel nécessite aussi la compréhension des notions du SI; comprendre les enjeux des ressources, des délais et de déploiement nécessitent la compréhension de la notion d'organisation et du système. Finalement, le module IHM nécessite la compréhension de la notion de scénario métier pour pouvoir définir les actions prévues par l'utilisateur et les lier aux données modelées.

Le Système d'Information est le niveau abstrait d'un ensemble de spécialités et d'approches. Il est indépendant de toute technologie et de toute approche. Mais, sa compréhension est nécessaire pour une meilleure utilisation de ces technologies et de ces approches dans le contexte professionnel.

lundi 27 novembre 2017

[DEI] SQL Injection exemple

"La faille SQLi, abréviation de SQL Injection, soit injection SQL en français, est un groupe de méthodes d'exploitation de faille de sécurité d'une application interagissant avec une base de données. Elle permet d'injecter dans la requête SQL en cours un morceau de requête non prévu par le système et pouvant en compromettre la sécurité." (Wikipedia)

Pour démontrer cette attaque, il nous faut un système qui interagit avec une base de données. Ainsi, nous prennons la base de données simple suivants :

Create Database SQLInjection;

Create Table User (
    id char(100) Primary Key,
    password char(100) Not Null
);

Insert into User Values ('admin', 'admin');

Le code ci-dessus devrait fonctionner sur tous les SGBD-R (ou au moins la plus part). Nous créons, ainsi, une seule table qui sert à authenrifier les utilisateurs. L'objectif de l'attaque sera, dans ce cad, de réussir l'authentification sans avoir un id et un password valides.

L'application victime se compose de deux classes. La première classe garantir l'accès à la base de données. La méthode qui nous intéresse est la méthode "verifierUser()" qui retroune Vrai si l'authentification a réussi, c'est à dire, s'il existe au moins un utilisateur avec le id et le password saisis (le SGBD utilisé est MySQL) :

package bdd;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author Tarek Boutefara <t_boutefara@esi.dz>
 */
public class AccesBDD {
    
    public static Connection connexion;
    
    public static Connection getConnexion() throws ClassNotFoundException, SQLException{
        if(connexion == null){
            Class.forName("com.mysql.jdbc.Driver");
            connexion = DriverManager.getConnection("jdbc:mysql://localhost/SQLInjection", "tarek", "");
        }
        return connexion;
    }
    
    public static boolean verifierUser(String user, String password) throws ClassNotFoundException, SQLException{
        String requete = "Select * from User Where id = '" + user + "' and password = '" + password + "';";
        System.out.println(requete);
        Statement statement = getConnexion().createStatement();
        ResultSet resultat = statement.executeQuery(requete);
        return resultat.next();
    }
    
}

La requête utilisé pour extraire l'utilisateur est une requête simple. Si les paramètres "user" et "password" ont les valeurs "admin" et "admin, la requête générée sera :

Select * from User Where id = 'admin' and password = 'admin';

La deuxième classe est une JFrame qui permet la saisie des deux valeurs à passer pour la méthode "verifierUSer()" citée ci-dessus. Elle affiche un message de confirmation en cas de réussite de l'authentification et un message d'erreur dans le cas contraire :

   private void btnLogInActionPerformed(ActionEvent evt) {                                         
        try {
            if(AccesBDD.verifierUser(txtUser.getText(), txtPassword.getText())){
                JOptionPane.showMessageDialog(this, "Login avec succès", "Succès", JOptionPane.INFORMATION_MESSAGE);
            }else{
                JOptionPane.showMessageDialog(this, "Login a échoué", "Echec", JOptionPane.ERROR_MESSAGE);
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }              

La saisie des paramètres corrects

Le message au cas du succès

Saisie des paramètres incorrects

Message en cas d'échec
Jusqu'à maintenant, l'exécution semble normale parce que les valeur saisies ont été prévues par le développeur. LE problème se pose lorsqu'on commence à saisir non pas des valeurs simples mais des codes SQL. Par exemple, la saisie de la valeur suivante comme mot de passe :
' or '1' = '1
Permet de s'authentifier avec succès :



Pour comprendre la raison, il faut jeter un coup d'oeil sur la requête SQL générée après la saisie de cette valeur :


Select * from User Where id = '' and password = '' or '1' = '1';

Ainsi, al avleur saisie a permis de modifier le code de la requête et de changer sa signification.

Ce type d'attaque nécessite la vérification de toutes les données saisies comme il est possible d'utiliser des méthodes de connexion à la base plus sûres telles que l'utilisation de preparedStatement au lieu de Statement sous Java.


    public static boolean verifierUserSecurisee(String user, String password) throws ClassNotFoundException, SQLException{
        String requete = "Select * from User Where id = ? and password = ?;";
        PreparedStatement pstatement = getConnexion().prepareStatement(requete);
        pstatement.setString(1, user);
        pstatement.setString(2, password);
        ResultSet resultat = pstatement.executeQuery();
        return resultat.next();
    }

dimanche 26 novembre 2017

[DEI] XSS exemple

"Le cross-site scripting (abrégé XSS) est un type de faille de sécurité des sites web permettant d'injecter du contenu dans une page, provoquant ainsi des actions sur les navigateurs web visitant la page. Les possibilités des XSS sont très larges puisque l'attaquant peut utiliser tous les langages pris en charge par le navigateur (JavaScript, Java, Flash, etc.) et de nouvelles possibilités sont régulièrement découvertes notamment avec l'arrivée de nouvelles technologies comme HTML5." (Wikipedia)

Pour démontrer cette attaque, nous avons créé l'exemple le plus simple en utilisatant J2EE comme technologie côté serveur. L'application web Java est constituée de deux pages :
  1. Une page HTML qui contient le formulaire qui permet la saisie des données non-vérifiée.
  2. Une page JSP, la page cible qui affiche naïvement un contenu prevenant d'une autre page.
index.html
<html>
    <head>
        <title>Formulaire</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <h1>Exemple attaque XSS :</h1>
        <form action="welcome.jsp" method="post">
            <label>Login : </label>
            <input type="text" name="login" placeholder="Votre login..."/>
            <br />
            <input type="submit" value="Se connecter" />
        </form>
    </body>
</html>

welcome.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Page d'affichage</title>
    </head>
    <body>
        <h1>Exemple attaque XSS :</h1>
        Bienvenue <% out.print(request.getParameter("login")); %>
    </body>
</html>

Il est évident qu'une saisie "normale" (attendue par le développeur) ne causera aucun problème : l'utilisateur saisit son nom sur une page et reçoit un message de bienvenue sur une deuxième page (après authentification par exemple).





Le problème se pose lorsque l'utilisateur introduit un code exécutable. Ce code sera repris par la deuxième page et inséré comme un élément de la page. Sans un contrôle des données, le code exécutable, s'il est bien fait, sera considéré comme un élément ordinaire de la page et exécuté. Le code peut même ajouter des biliothèque de tracking ou bien récupérer des données (Cookies du site actuel) et les envoyer à d'autres serveurs.

A titre d'exemple, si la valeur donnée à l'information "login" dans l'exemple ci-dessus est :
<script language="javascript">(function(){alert("Hello");})();</script>

Le résultat obtenu est le suivant :


Le problème sera mieux compris si nous jetons un coup d'oeil sur le code source de la page :


Nous pouvons constater que le "login" saisi n'est plus une chaîne simple mais il est considéré comme une balise html valide. Etant de type script, la méthode contenue dans l'élément est exécutée et le message "Hello" est affiché.

Le problème peut être résolu par plusieurs méthode. L'idée est de modifier le code saisi pour qu'il ne soit plus exécutable.

dimanche 5 novembre 2017

[GOE] Survivre à la concurrence : l'industrie automobile en Grande Bretagne.

Malgré que le secteur en relation avec les automobiles est actif en Grande Bretagne, il pourrait être encore plus puissant si les managers ont su survivre à la concurrence.
En effet, ce secteur, qui emploie plus de 600 milles personnes et qui génère un chiffre d'affaire de plus de 65 Milliards d'Euro, produit généralement des moteurs et des véhicules utilitaires. La plus part des marques ont été soit mises en faillite ou bien achetées par des entreprises étrangères.
Ainsi, on a vu la Grande Bretagne passe de la 2ème position (après les Etats Unies) comme producteur des automobiles à la 12 ème place en moins de 20 ans.
Les conurrences qui pu remplacer la Grande Bretagne sont, notamment : l'Allemagne, la France, le Japon et la Chine. Des entreprises originaires de ces pays ont acquis la plus part des entreprises britaniques. A titre d'exemple, le groupe allemand BMW a acquis Mini et Rolls-Roys. Le groupe chioins SAIC detient actuellement l'entreprise britanique Rover.
Quelques voitures britaniques :

Jaguar e-Type

Aston Martin DB5

MG MGB

De l'autre côté, nous pouvons voir l'évolution des concurrents, à titre d'exemple la Chine, qui a passé de :

VW Santana chinoise

A :

Qiantu K50

[GOE] Les changements brusques dans l'environnement de l'entreprise, exemple d'actualité

L'inconvénient principal des deux écoles (classique) et (relation humaine) est l'absence de toute analyse de l'environnement de l'entreprise. L'école classique s'est concentrée sur l'aspect technique et sur la mise en oeuvre et la définition des fonctions de base de l'entreprise. L'école des relations humaines s'est concentrée sur la dimension humaine des employés. Les axiomes et les principes de ces deux écoles ne font aucune référence à l'environnement de l'entreprise.

Cet inconvénient a coûté cher à un grand nombre d'entreprises. En effet, avec l'arrivée de la concurrence et des changements technologiques, économiques et sociaux rapides et brusques, la grande majorité des entreprises n'arrivaient pas à survivre.

L'école managériale, actuellement suivie, qui repose sur une planification du changement et l'utilisation avancée des technologies de l'information et de la communications, a prouvé son efficacité dans des conditions très difficiles et dans des environnements très hostiles.

Le prince Walid ben Talal


Nous prenons à titre d'exemple, un fait très récent qui date le 04 Novembre 2017, le groupe saoudien "kingdom", propriété du prince Walid ben Talal, a connu un choque particulier avec l'arrestation de son propriétaire suite à des accusation de corruption. Et malgré que les investigations n'ont pas donné de résultats et qu'il s'agit au stade actuel des "accusations" et que le principe n'a pas été trouvé "coupable", les rumeurs et les analyses sur le marché ne laisse pas la place à une deuxième possibilité; ce qui représente un changement très brusque et une pression particulière imposée sur le groupe "kingdom".

C'est à ce stade que nous pouvons voir l'utilité d'une vision stratégique d'un côté et d'une séparation entre les deux acteurs : managers et actionnaires. Au cours de la journée du 05 Novembre 2017, les cours du groupe ont connu une chute libre dans la bourse saoudienne au début de la journée. Néanmoins, une amélioration remarquable a pu être constatée au fur et à mesure; cette amélioration ne peut être justifiée que par les efforts des managers encore sur le terrain malgré l'absence de l'actionnaire principal. Nous pouvons supposer avec une grande certitude qu'il s'agissait essentiellement d'un effort fourni pour assurer les autres actionnaires et les autres acteurs que le groupe "kingdom" peut continuer avec les mêmes performances.

La chute des cours du groupe "kingdom" et la récupération au cours de la journée.


Les cours du groupe en connu des pertes d'environ 7%, mais les dégâts pouvaient être plus graves.


lundi 23 octobre 2017

[GOE] "Suicide Nets" en Chine : une tentative de limiter les cas du suicides

Les "Suicide Nets" sont très répondus en Chine. Leur objectif principal est de limiter les cas de suicide dans les lieux du travail; une solution pour l'entreprise pour éviter de payer les compensations.
Cette solution est loin d'être une solution correcte pour ne pas dire loin d'être scientifique dans des usines qui fabriquent des appareils à la pointe technologique et pour les grandes firmes comme Apple.

Droits d'auteur résérvés à Reuters et Daily Mail.

Si les journalistes insistent sur le fait que ces tâches sont "répétitives" et "ennuyeuses", c'est qu'ils ne sont pas loin de la vérité; au moins pour la théorie des organisations. Néanmoins, les deux questions qui restent posées sont :
  • Pourquoi maintenant ? La génération précédente, les parents de ces employés, a passé par des conditions similaires mais les employés ne présentaient pas la mếme réaction.
  • Pourquoi les entreprises technologiques en particulier ? Plusieurs autres mplentreprises traitentleurs employés de la même mannière,mais elles ne présentent âs le même phénomène de suisices.
Le point essentiel ignoré est la qualification des employés. Les tâches répétitives sont le résultat de l'application des principes de spécialisation maximale définis dans le cadre de l'école classique. Dans cette époque (début de 20ème siècle), la non qualification des employés et l'absence totale des outils d'automatisation ont poussé les managers (les ingénieurs) à concevoir des chaînes de production basées sur une spécialisation maxiale et un découpage maximal des processus de production.
Face à l'instabilité d'avant la révolution industrielle, supporter ces conditions de travail était un sacrifice acceptable par cette génération. Garantir un revenu stable était un priorité.
Ces facteurs ont changé pour la deuxième génération qui n'ont pas connu l'instabilité et qui ont bénéficié d'un niveau respectable de formation. Les employés trouvaient plus de difficultés à s'adapter avec les anciens processus de production. Sous la pression, l'employé peut comettre l'action de suicide.

Lectures supplémentaires :
Article de Daily Mail
Article de The Guadrian

mardi 25 avril 2017

[ABD] Sujets et Corrigés

Dans ce dossier, vous pouvez trouver les sujets d'examen et d'interrogation de l'année universitaire 2016/2016. Quelques solutions ne sont pas détaillées et nécessitent des explications; nous en reviendrons plus tard.

Dossier des sujets.

A. U : 2017/2018 :

Corrigés des mico-interros que nous n'avons pas eu la chance de corrigé en salle :







samedi 22 avril 2017

[ABD] Structure primaire du fichier : Hachage avec chaînage externe

Le fichier dans une base des données est vu comme une suite ou un ensemble d'enregistrements. Ces enregistrements sont répartis sur plusieurs blocs. Vu la différence entre la taille de la base des données et le buffer utilisé par le SGBD dans la mémoire centrale pour effectuer les différentes opérations, il est nécessaire de choisir l'organisation la plus adéquate pour limiter le nombre d'accès disque qui sont des milliers de fois moins rapide que les accès à la mémoire centrale.
Cet objectif peut être atteint en utilisant deux approches :
  • Par jouer sur l'arrangement des enrtegistrements dans le fichier. En effet, l'approche la plus intuitive est de ranger les enregistrements dans l'ordre de leur arrivée. Cette approche est la moins performante si elle n'est pas associée à une autre approche : la recherche devient très coûteuse parce qu'il faut parcourir tout le fichier à chaque fois. Alors, il faut ranger les enregistrements d'une manière à limiter les accès disque et rendre la recherche plus efficace.
  • Par l'ajout d'une structure secondaire. Cette structure n'aura pas comme rôle le stockage des données comme le fichier primaire mais elle facilitera l'accès à ces données. Les index sont un exemple de ces structures.
Dans cet exemple de core, nous visons à simuler l'utilisation du hachage : une méthode qui s'inscrit dans la première appoche. Le hachage range les enregistrements suivant la valeur de l'un de ses champs, appelé clé de hachage. Ainsi, la position du nouvel enregistrement à insérer n'est pas la prochaine position vide, mais, c'est la position donnée par la fonction de hachage sur la valeur de la clé du hachage (généralement la clé primaire) pour le nouvel enregistrement. Par conséquent, les deux opérations d'écriture et de lecture se limitent à un seul accès disque.
Cette approche a deux inconvénients majeurs :
  • Il faut avoir, au préalable, une estimation sur les données à sauvegarder. Il est aussi nécessaire de réserver un certain nombre de blocs même si le fichier est vide.
  • Les collisions (les conflits) : lorsque deux enregistrements différents auront la même positions (les deux clés de hachage donnent la même valeur), on parle d'une collision (conflit). La résolution des conflit (quelque soit la méthode) peut limiter les performances obtenues par l'utilisation du hachage.
Dans le code du projet, nous allons utiliser le chaînage externe pour résoudre les conflits. Cette solution consiste à créer une liste linéaire chaînée dans cahque position. Cette liste va contenir toutes les valeurs en collision. Pour lire d'avantage sur cette approche, vous pouvez vous référer au cours de M. Zegour par ici.
Le projet est construit sur une seule classe : Page. Cette classe nous permet de stocker des données (des enregistrements) et de faire la recherche (une recherche séquentielle rapide). La Page contient aussi un pointeur vers la Page suivante : cela peut être utilisé pour le chaînage ou bien, tout simplement, ignoré.


public class Page {
    
    /**
     * La taille de la page.
     * Le nombre des enregistrements que la page peut contenir (le facteur de blocage, bfr).
     */
    public static final int TAILLE = 2;
    
    /**
     * Le contenu de la page.
     * Dans cet exemple, le contenu est réduit à une simple valeur (la clé de hachage) mais, en réalité, on parle d'un
     * enregistrement complet.
     */
    public int[] contenu;
    
    /**
     * Le degrée de remplissage de la page.
     * Pour connaître est ce qu'une page est pleine ou pas.
     */
    public int placesOccupees;
    
    /**
     * Un pointeur vers la page suivante.
     * Ce pointeur est nécessaire pour créer des listes linéaires chaînées des pages.
     */
    public Page suivant;

    /**
     * Constructeur par défaut.
     */
    public Page() {
        contenu = new int[TAILLE];
        for (int i = 0; i < contenu.length; i++) {
            contenu[i] = -1;
        }
        placesOccupees = 0;
        suivant = null;
    }

    public int[] getContenu() {
        return contenu;
    }

    public void setContenu(int[] contenu) {
        this.contenu = contenu;
    }

    public int getPlacesOccupees() {
        return placesOccupees;
    }

    public void setPlacesOccupees(int placesOccupees) {
        this.placesOccupees = placesOccupees;
    }

    public Page getSuivant() {
        return suivant;
    }

    public void setSuivant(Page suivant) {
        this.suivant = suivant;
    }

    /**
     * Vérifie si la page contient une valeur ou pas.
     * @param valeur La valeur à rechercher dans la page.
     * @return Vrai si la page contient la valeur, faux autrement.
     */
    public boolean contient(int valeur){
        boolean contient = false;
        int i = 0;
        while(i < TAILLE && !contient){
            if(contenu[i] == valeur)
                contient = true;
            i++;
        }
        return contient;
    }
    
    /**
     * Ajouter une valeur à la page.
     * A la fin  de l'exécution, la page va contenir la valeur (soit elle l'a contenue dès le début ou bien après son ajout).
     * Si la page est pleine, la valeur faux est retournée pour indiquer que l'opération d'ajout à échoué.
     * @param valeur La valeur à ajouter à la page.
     * @return Vrai si l'opération d'ajout a réussi, Faux autrement.
     */
    public boolean ajouterValeur(int valeur){
        boolean reponse = false;
        
        if(contient(valeur))
            reponse = true;
        
        if(!contient(valeur) && placesOccupees < TAILLE){
            contenu[placesOccupees] = valeur;
            placesOccupees++;
            reponse = true;
        }
        
        return reponse;
    }
    
    /**
     * Une représentation du contenu de la page sous forme d'une chaîne de caractère.
     * Seulement le contenu est inclu.<br/>
     * Si la page suivante n'est pas null, elle sera aussi inclue. Le chaînage est représenté par le symbole "==>".
     * @return La chaîne qui représente la page.
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        
        sb.append("Page {\n");
        for (int i = 0; i < contenu.length; i++) {
            sb.append("\t" + contenu[i] + "\n");
        }
        sb.append("}");
        
        if(getSuivant() != null){
            sb.append(" == > " + getSuivant().toString());
        }
        sb.append("\n");
        
        return sb.toString();
    }
        
}

Le projet contient deux gestionnaires :
  • Un gestionnaire séquentiel : qui range les enregistrements dans l'ordre de leur arrivée.
  • Un gestionnaire qui utilise le hachage par chaînage externe.
Ce dernier voit chaque position comme une liste linéaire chaînée et tente d'ajouter la nouvelle valeur au fichier en commençant par la première page et en passant vers la page suivante en utilisant le pointeur "suivant".
Si on arrive à la fin de la liste (suivant == null) sans pouvoir ajouter l'élément, alors un nouveau noeud est ajouté à la liste et l'élément est ajouté à ce dernier noeud :


    public void ajouterValeur(int valeur) {
        int position = hach(valeur);
        Page page = pages[position];

        while(!page.ajouterValeur(valeur)){
            if(page.getSuivant() == null)
                page.setSuivant(new Page());
            page = page.getSuivant();
        }
    }

Le code source du projet peut être obtenu par ici. Dans ce projet, nous allons créer les deux gestionnaires, faire des insértion et ensuite effectuer des recherches (on recherche les même éléments. On peut voir rapidement que l'approche séquentielle peut atteindre 7 accès disques tant dit que l'appproche par hachage ne dépasse jamais 2 accès disques.
Il est possible d'exécuter directement le fichier jar du projet qui se trouve dans le dossier "dist":


java -jar ABD06.jar 

Si l'affichage est trop vite, il est possible de mettre la sortie du projet dans un fichier texte par la commande suivante.

java -jar ABD06.jar >> test.txt