Un framework qui se veut très efficace : CakePHP

Cake PHP est un framework qui permet de développer rapidement et simplement des applications PHP. CakePHP possède une architecture de type MVC avec des contraintes sur le nommage des classes et sur l’arborescence.
Cela permet à CakePHP de faire tous les liens entre les éléments sans avoir à les spécifier manuellement et à un développeur de rapidement prendre en main la suite des développements de l’application.
En effet, en suivant le MVC, une vue est associée à chaque action du contrôleur sur le modèle correspondant. CakePHP va directement rechercher les classes selon leur nom et retourner des erreurs ciblées si une classe est absente.

Performances SQL d’une application .NET, et contextes d’exécution

Vous avez une application .NET qui fonctionne en production sur un environnement avec une charge conséquente, et vous observez des problèmes de performance qui semblent “apparaître” à certains moments seulement. Par exemple, des procédures stockées qui semblent partir en vrille à l’exécution, mais seulement à certains moments.

Armé d’une version récente de SQL Management Studio, vous tentez de reproduire le problème, dans le but d’analyser le plan d’exécution. Et là, c’est la surprise totale! La requête qui s’exécute en plusieurs secondes, voire plusieurs minutes dans votre application s’exécute maintenant presque instantanément ! Et ce, alors que celle-ci peine lorsqu’appelée de l’application !
Et vous vous dites : Mais ça n’a pas de sens, pourquoi l’exécution est-elle si lente dans mon logiciel .NET et là c’est instantané, et ce au même moment, dans les mêmes conditions ? Eh bien, c’est tout simple, vous pourriez être l’une des nombreuses victimes de la différence de contexte entre toute application .NET et Management Studio ! Mais ne vous découragez pas, cet article vous expliquera le pourquoi de la chose !

Développer en .NET/SQLServer à distance à l’aide de tunnels SSH

Je travaille actuellement à distance sur de nombreux projets développés en .Net couplés à la technologie SQL Server comme moteur de Base de données. La problématique que j’ai rencontrée a été de pouvoir me connecter aux différentes ressources nécessaires au bon fonctionnement d’une application .NET (SQL Server, Reporting Services etc …) mais aussi au processus livraison sur un serveur distant (Prise en main à distance d’un Windows Server)

Pour répondre à cette problématique j’ai utilisé le tunneling SSH pour pouvoir me connecter à ces différentes ressources à distance. Dans un premier temps nous verrons comment créer un tunnel SSH à l’aide du logiciel Putty et de son interface graphique puis avec l’outil Plink utilisé en CLI (Command Line Interface).

Ensuite nous verrons comment nous connecter à ces différentes ressources dans un environnement de développement.

TechEvening à Lyon sur la sécurité des applications Web

Ce lundi s’est déroulé à Lyon un TechEvening consacré à la sécurité des applications Web. Nous avons testé les différentes techniques et outils utilisés par les utilisateurs malveillants. Deux applications ont été utilisées, l’une en J2EE pour la plupart des techniques (WebGoat 5.3 de la fondation OWASP) et l’autre en ASP.NET MVC 3 pour un focus sur les perfides attaques CSRF.

Au programme:

  • Injection: diverses techniques d’injection SQL;
  • Cross-Site Scripting (XSS): techniques de phishing et de « session hijacking »;
  • Violation de gestion d’authentification et de session: technique de « session fixation »;
  • Références directes non sécurisées: techniques d' »AC Bypass » aux niveaux données et métier;
  • Cross-Site Request Forgery (CSRF): technique du « Token Bypass »;
  • Mauvaise configuration de sécurité: technique de « Malicious File Execution »;
  • Stockage cryptographique non sécurisé: sensibilisation au « hashing » et « salting »;
  • Manque de restriction URL: technique du « forced browsing »;
  • Protection insuffisante de la couche transport: « sniffing », « ARP spoofing » et « ARP poisoning »
  • Redirections et renvois non validés: techniques du « HTTP splitting » et du « cache poisoning »

Nous avons utilisé les outils suivants:

  • Firefox
  • Fiddler
  • Firebug
  • TamperData
  • WireShark

Vous pouvez retrouver ci-après tous les supports:

  • L’application WebGoat 5.3;
  • L’application CSRFDemo ASP.NET MVC 3;
  • Les slides (PPTX ou PDF) de présentation;
  • Quelques fichiers utilisés pour les attaques;

Pour ceux qui s’intéressent plus globalement à la sécurité des applications .NET (pas qu’en Web), je vous invite à lire l’article suivant sur l’altération des assemblages, l’injection de code et la suppression des signatures cryptographiques. Une vidéo est également disponible.

Mise en place d’une base de données de test ou de démonstration

Problématique :

J’ai une application de test ou de démonstration et je ne veux pas être obligé d’installer une nouvelle base de donnée à chaque fois qu’un nouveau développeur arrive ou qu’il faut la déployer rapidement sur une nouvelle machine. De plus, la persistance réelle  des données n’est pas importante mais la base doit dans ce cas être réinitialisée à chaque fois.

Solution :

– Utilisation d’une base de donnée embarquée type HSQL, comme la persistance réelle des données n’est pas vraiment importante, on peut même utiliser le mode « en mémoire ».

– Utilisation des fonctionnalités d’Hibernate pour la génération du schéma et l’exécution d’un script d’insertion de données.

Mise en oeuvre :

– Pour utiliser la base HSQL en mode mémoire il faut :

  1. Récupérer le jar HSQL, en ajoutant la dépendance suivante dans le pom.xml de l’application par exemple :

  2. <dependency>
    <groupId>hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>1.8.0</version>
    <dependency>

  3. Utiliser une URL de la forme : « jdbc:hsqldb:mem:mydb » dans le fichier de configuration de la session-factory ou de la datasource (Hibernate, Spring ou autres)

– Pour configurer Hibernate afin de générer automatiquement le schéma de la base il faut :

  1. Avoir un fichier de mapping Hibernate ou des annotations sur la classe pour chacun des beans du domaine
  2. Ajouter la propriété « hbm2ddl.auto » dans le fichier de configuration d’Hibernate (hibernate.cfg.xml ou un fichier spring en général) et lui donner la valeur « create« .

– Pour importer automatiquement les données dans la base en mémoire il faut :

  1. Créer le script d’insertion des données en respectant bien la syntaxe SQL de HSQL (différente de MySQL par exemple)
  2. Nommer ce script « import.sql » et le rendre accessible à la racine du classpath lors du lancement de l’application, en le mettant dans src/main/resources par exemple.

Et voilà, le tour est joué, à chaque fois que la session Hibernate sera recréée (normalement au premier appel à la base après le démarrage de l’application), le schéma de la base sera généré à partir des informations de mapping et le script d’insertion sera exécuté juste après…

Problèmes rencontrés :

– Dans mon fichier d’insertion des données « import.sql », les caractères étaient encodés en UTF-8. La base de donnée en mémoire utilisant les paramètres d’encoding du serveur d’application, le résultat n’était pas le même qu’en utilisant une base MySQL.

-> La solution était de modifier les paramètres du serveur d’application, en ajoutant « -Dfile.encoding=UTF-8 » dans les arguments de la VM au démarrage de Tomcat par exemple.

– La syntaxe des insertions de HSQL obligeant à répéter la commande et la liste des colonnes peut être pompeuse quand il s’agit d’un très grand nombre de lignes.

-> Pas de solution pour l’instant à part le copier/coller et le « replace all », mais si quelqu’un en connait une je suis preneur ;o)

En espérant que ça servira à quelqu’un, personnellement je trouve cela super pratique !!!!

Intégrité référentielle et utilisation de fonctions SQL, ou comment rendre au SGBD une partie de ses responsabilités.

Faisons suite au dernier billet de Céline en restant dans le domaine des bases de données et des petites astuces connues de tous mais jamais utilisées. Intéressons nous à la gestion de l’intégrité référentielle et au calcul d’identifiants en laissant la base faire ce qu’elle sait faire et éviter un développement applicatif inutile.

Requêtes de recherche sous Oracle, Informix, Postgresql : gestion de la casse et des accents

Pour qu’un outil de recherche soit performant et agréable à utiliser, il faut qu’il soit capable de retourner tous les éléments susceptibles de correspondre à ce que l’utilisateur recherche sans tenir compte de la casse et/ou des accents.

Sous Oracle, il est possible d’utiliser l’opérateur « TRANSLATE » pour gérer ce genre de problème.

SELECT * FROM TABLE WHERE TRANSLATE(UPPER(monChamp),’ ÉÈÊËÀÄÂÎÏÔÖÛÜ’,’ EEEEAAAIIOOUU’)) LIKE TRANSLATE(UPPER(‘%requêtes%’), ‘ÉÈÊËÀÄÂÎÏÔÖÛÜ’, ‘EEEEAAAIIOOUU’);

Sous Informix, il est possible de passer par le « MATCHES » et les regexp.

SELECT * FROM TABLE WHERE UPPER(monChamp) MATCHES ‘*R\[EÉÈÊËéèêë\]Q\[UÛÜûü\]\[EÉÈÊËéèêë\]T\[EÉÈÊËéèêë\]S*’;

Après un «MATCHES», il est possible d’utiliser les symboles suivants :

  • * : représente une chaîne de 0 ou plusieurs caractères
  • ? : représente un seul caractère
  • […] : contient un ensemble de caractères

Sous Postgresql, la solution passe par l’utilisation du « SIMILAR TO » et des regexp.

SELECT * FROM TABLE WHERE UPPER(monChamp) SIMILAR TO ‘%R\[EÉÈÊËéèêë\]Q\[UÛÜûü\]\[EÉÈÊËéèêë\]T\[EÉÈÊËéèêë\]S%’;

En résultat de requête, nous aurons bien toutes les lignes contenant ‘requete’ sans tenir compte de la casse et/ou des accents :

  • requete
  • requête
  • REQUETE
  • REQUÊTE