Recherche sur le blog

mercredi 22 mars 2017

[Sécurité] No More Ransom!

En parcourant un forum, j'ai découvert un site bien pratique qui pourrait vous être utile en cas d'infection par un ransomware. On en a assez bien parlé mais si vous ne le savez pas encore, ces logiciels malveillants agissent en bloquant bien souvent l'interface utilisateur, incitant alors ce dernier à payer une certaine somme pour retrouver l'accès à son ordinateur et/ou ses fichiers (qui auraient été chiffrés). 

Bien entendu, il n'est pas certain de recevoir la clé une fois le paiement effectué. Après tout, ce sont des arnaqueurs qui répandent ce genre de cochonnerie, il serait mal avisé de leur faire confiance.

C'est ainsi que le site No More Ransom va peut-être réaliser le miracle que vous attendiez ! 

     
La première étape consiste à identifier le type de ransomware qui s'est méchamment incrusté dans votre machine. Le site Malekal regorge d'informations à ce sujet, mais vous pouvez bien entendu utiliser la fonctionnalité Crypto Sheriff du site présenté ci-dessus. Celle-ci nécessite l'une des actions suivantes:
  • Envoyer un fichier sous sa forme cryptée.
  • Transmettre le nom, l'adresse e-mail ou même l'URL du site web, l'adresse bitcoin, qui est indiquée par l'auteur du logiciel malveillant et qui lui permet de recevoir son paiement.
  • Transmettre le fichier texte d'instructions créé par le ransomware, qui porte généralement l'extension TXT.
Une fois cette opération effectuée il faut cliquer sur le bouton "Find out" pour laisser l'outil faire le reste.  
     
La seconde étape consiste à télécharger l'outil de décryptage adéquat et lié au ransomware qui a été installé (et espérons-le, éradiqué à l'heure qu'il est) sur votre PC. Si vous connaissez déjà le doux nom de la crasse qui a osé s'emparer de votre machine, alors vous pouvez directement vous rendre dans la section "Decryption Tools" du site et télécharger le bon fichier.
    
Et si vous n'aimez pas l'anglais, sachez que l'interface est disponible en français ! N'hésitez pas à explorer les autres rubriques comme les questions/réponses (FAQ), les conseils de préventions,... Aujourd'hui l'attaque à l'aide de ransomwares est plutôt répandue ; celle-ci doit être prise au sérieux puisqu'elle touche aussi bien les particuliers que les professionnels.

mercredi 8 mars 2017

[Java] JPA : Fetch dans une requête JPQL

Quand on crée des entités avec la Java Persistence API, on peut spécifier des jointures qui se présentent alors sous forme d'objets liés à d'autres entités, plutôt que sous la forme de variables comme des chaines ou des Long. Voici un exemple de relation entre un client et ses factures.
@Entity
@Table(name = "CLIENT", schema = "maDb")
public class Client implements Serializable
{
   @Column(name = "CLI_ID_CLIENT")
   private Long l_idClient;

   @OneToMany(mappedBy = "objClient")
   private List<Facture> objListFactures;

   ...
}

@Entity
@Table(name = "FACTURE", schema = "maDb")
public class Facture implements Serializable
{
    @Column(name = "FAC_ID_FACTURE")
    private Long l_idFacture;

    @ManyToOne
    @JoinColumn(name = "FAC_ID_CLIENT")
    private Client objClient;

    ...
}
Ce qu'on a fait : 
  • Dans l'entité Client, on a créé une liste de factures, en spécifiant le tag @OneToMany (relation 1-N soit un client peut avoir plusieurs factures) avec pour attribut mappedBy le nom de la variable Client qui a été ajoutée dans notre entité Facture. 
  • Dans cette dernière, on doit spécifier la relation dans l'autre sens, donc avec le tag @ManyToOne (relation N-1, soit plusieurs factures pour un même client). 
  • On doit également ajouter le tag qui indiquera sur quelle colonne on effectue la jointure afin que la relation fonctionne (@JoinColumn + attribut name). Il faut indiquer le nom de la colonne tel que spécifié dans la base de données.
Par défaut, quand on récupérera plusieurs clients, leurs factures ne seront pas immédiatement chargées. C'est ce qu'on appelle "Lazy Loading" qui est le comportement par défaut quand on ne spécifie pas l'attribut fetch au niveau de la relation.

Afin de récupérer les factures lorsqu'on récupère un client, nous avons plusieurs choix qui se présentent à nous :

Spécifier l'attribut "fetch"

On peut spécifier au niveau de la relation, l'attribut fetch avec la valeur EAGER. Cela signifie que pour chaque client on récupérera toujours ses factures, ce qui n'est probablement pas ce que l'on souhaite (attention aux temps d'accès et aux accès en cascade s'il y a d'autres entités liées de cette manière).
@OneToMany(mappedBy = "objClient", fetch = FetchType.EAGER)
private List<Facture> objListFactures;
Accéder à la liste

Lorsqu'on récupère l'objet client depuis la base de données dans notre Session Bean, on peut accéder à la liste pour que son contenu soit chargé.
Client cliFromDb = ... ;  
cliFromDb.getObjListFactures().size();
Créer une requête JPQL

On crée une requête avec la syntaxe JPQL, ce qu'on appelle des "Named queries". Elles sont définies soit dans une méthode que vous aurez pris soin d'écrire, soit directement au niveau de l'entité, à l'aide des tags adéquats.
@NamedQueries({ @NamedQuery(
     name = "Client.findClientByPkWithFactures", 
     query = "select c from Client c left 
        join FETCH c.objListFactures 
        where c.l_idClient = :idClient")
  })
Exemple de classe qui définit des fonctions pour la gestion des clients. Ces fonctions seront appelées depuis notre Session Bean.
public class ClientManager
{
  private EntityManager em;

  public ClientManager(EntityManager em)
  {
     this.em = em;
  }

  public Client findClientByPkWithFactures(Long pId) 
  {
     Query query = em.createNamedQuery(
         "Client.findClientByPkWithFactures")
      .setParameter("idClient", pId);   
     Client res = (Client)query.getSingleResult();
     return res;
  }
} 
Bon développement !