Une doc (spartiate) pour le support MongoDB de l’admin Sonata pour Symfony 2

Il y’a plus d’un an déjà j’ai contribué le support de MongoDB au générateur d’admintration Sonata pour Symfony2.

Le projet n’était jusque le pas du tout documenté,  j’ai donc mis en ligne une petite documentation inspirée de celle du composant pour l’ORM. Attention, elle s’affiche mal sur GitHub à cause du format RST, il faut télécharger les fichiers.

J’en ai également profité pour corriger le composer.json qui ne fonctionnait plus et je publierais bientôt sous licence libre la démo d’un tout petit moteur de blog qui utilise MongoDB et l’admin Sonata, en espérant que ça puisse servir à quelques-uns.

Sécuriser tant bien que mal une application Symfony installée dans un sous-répertoire

Souvent, pour des raisons de coups liées aux certificats SSL, il n’est pas possible d’installer une application Symfony dans son propre virtual host. L’application se retrouve alors dans un sous-répertoire du DocumentRoot, ouverte à tous vents et c’est une catastrophe en terme de sécurité !

Imaginons que notre DocumentRoot soit /home/web et que l’application Symfony soit installée dans le répertoire /home/web/my-sf-app/. Ainsi l’URL de l’application est https://example.com/my-sf-app/web. Si un utilisateur mal intentionné accède à https://example.com/my-sf-app/app/config/config.yml il obtient le fichier de configuration principal de l’application qui contient entre-autre les identifiants d’accès à la base de données… Mauvaise idée.

Sécurisons tant bien que mal tout ça (en partant du principe que votre serveur est Apache) grâce aux fichiers de configuration .htaccess :

Le premier, à créer, sera /home/web/my-sf-app/.htaccess et servira à interdire l’accès à tous les fichiers de l’application :

Order allow,deny
Deny from all

Le second, /home/web/my-sf-app/web/.htaccess, existe normalement déjà dans notre application Symfony (il est utilisé pour l’URL rewriting), ajoutons-y au début :

Order allow,deny
Allow from all

Ce n’est toujours pas la panacée, il est toujours aisée de reconnaitre quelle est la technologie employée à la structure des répertoires, mais c’est déjà mieux !

Installer PHP sur OS X avec le support de MySQL et de INTL

Après avoir installé Homebrew, il ajoutons les dépôts Homebrew-PHP et Homebrew-dupes :

$ brew tap josegonzalez/php
$ brew tap homebrew/dupes

Installons maintenant PHP 5.4 avec le support de MySQL et de INTL :

$ brew install php54 --with-mysql --with-intl
$ brew install php54-intl

Ajoutez maintenant la ligne indiquée par Homebrew pour que Apache charge le module PHP à la fin du fichier /etc/apache2/httpd.conf.

Exemple pour la version 5.4.10 :

LoadModule php5_module    /usr/local/Cellar/php54/5.4.10/libexec/apache2/libphp5.so

Pour booster les performances de PHP, très utile si vous comptez développer avec Symfony, installez également APC :

$ brew install php54-apc

Redémarrez PHP pour que vos modifications soient prises en compte :

$ sudo apachectl restart

Installer un stack LAMP sur un dédié OVH avec Ubuntu 12.10

Petit mémo pour configurer un serveur web LAMP sur un dédié OVH fraichement livré. La distro choisie est Ubuntu 12.10.

Apache, PHP, MySQL

Commençons par mettre à jour la liste des paquets :

# apt-get update

Puis la distribution elle même :

# apt-get dist-upgrade

Installons Apache, PHP, MySQL, phpMyAdmin et les extensions qui vont bien pour faire tourner Symfony 2, WordPress, Prestashop

# apt-get install phpmyadmin mysql-server php5-intl php5-mcrypt php5-xsl php5-cli php5-sqlite php5-memcached php5-curl php-apc php-pear

L’installateur nous demande de rentrer un mot de passe root pour le serveur MySQL (tant mieux) et le serveur web à configurer pour phpMyAdmin. Choisir apache2.

Donnons ensuite à dbconfig-common les mots de passe nécessaire pour qu’il configure les bases de données utiles à phpMyAdmin.

Beaucoup d’applications PHP utilisent le module rewrite de Apache Activons-le :

# a2enmod rewrite

Notre serveur web est prêt à l’emploi !

Un zeste de sécurité

Commençons par éditer /etc/apache2/conf.d/security pour rendre Apache plus discret. Passons ServerTokens à Prod et ServerSignature à Off.

Au tour de PHP. C’est dans /etc/php5/apache2/php.ini que ça se passe, expose_php doit être à Off. Profitons-en pour régler notre fuseau horraire : date.timezone = Europe/Paris.

Ubuntu 12.10 est fournie avec PHP 5.4. Plus besoin de s’occuper de register_globals et des Magic Quotes, ces “fonctionnalités” ont été supprimées upstream. Bon débarras !

Si vous n’utilisez pas d’applications PHP antédiluviennes, passez short_open_tag à Off .

Redémarrons Apache pour que nos réglages soient pris en considération :

# service apache2 restart

Appliquons les bons conseils de Marion et installons un système de sauvegarde automatisée, disons Backup Manager :

# apt-get install backup-manager

Ajoutons /var/lib aux répertoires sauvegardés quand l’installateur nous le propose (ce répertoire contient entre-autre les base de données binaires MySQL).

Si vous avez opté pour un dédié OVH vous disposez peut-être d’un espace de sauvegarde FTP gratuit (ce service ne semble malheureusement plus exister sur certaines offres Kimsufi). Pour l’activer rendez-vous dans le manager : section Services puis Backup Ftp. Une fois le mail avec les identifiants reçu éditons /etc/backup-manager.conf pour les indiquer à l’utilitaire.

Et le courrier ?

Au cas ou nos applications aient besoin d’envoyer des emails :

# apt-get install postfix

Choisissez le type de configuration “Site internet”.

Note : la configuration d’un serveur mail qui envoi des courriers qui ne finissent pas dans “Spam” nécessiterait un article complet.

De l’inutilité de la fonction PHP sleep pour protéger des attaques brute force (exemple avec Prestahop)

Le couple adresse email / mot de passe est le sésame permettant d’accéder à presque l’ensemble des activités numériques d’un individu : messagerie, réseaux sociaux, documents, extranets, interface client des boutiques en-ligne…

Les applications web se doivent de garantir la sécurité de leurs utilisateurs. En plus du minimum exigible (hachage et salage des mots de passe en base de données, protections contre les injections SQL, les attaques de type XSS et CSRF…), les développeurs tentent souvent de trouver des astuces permettant de protéger mieux les utilisateurs de leurs programmes.

Tenter de se protéger des attaque par force brute…

Ainsi, on trouve le code suivant dans le système de connexion à l’interface client de Prestashop, la très populaire plateforme e-commerce open-source :

Comme le commentaire l’indique, les développeurs de Prestashop tentent de protéger leurs utilisateurs d’une attaque par force brute.
L’idée est que pour obtenir un accès à l’interface client, le pirate va utiliser un robot qui va tester méthodiquement et à très grande vitesse tous les mots de passe possibles (dans les faits, ce types de robots testent dans un premier temps les mot de passe les plus communs grâce à des listes pré-établies).
Bien que le concept soit bon, l’appel à sleep est inutile. Les serveurs web sont multithreads et les robots d’attaque le sont aussi. Ces derniers lanceront de nombreuses connexions parallèles et n’attendront pas de savoir si le mot de passe est correct ou non pour en tester un nouveau.

Pire cette implémentation est dangereuse car, en plus de ralentir l’affichage de la page indiquant une erreur de saisie aux utilisateurs légitimes, elle bloquera le thread le temps du sleep (ici une seconde) et favorisera ainsi les attaques par déni de service. Un attaquant souhaitant engorger le site (ce qui aura pour conséquence de le ralentir voir de le rendre inaccessible) lancera de très nombreuses requêtes de connexion avec un mauvais mot de passe. L’effet sera plus important et l’attaque d’autant plus efficace sur cette page grâce au blocage du à l’appel à la fonction sleep.

Se protéger efficacement

Commençons par supprimer de nos codes sources ces appels à sleep aussi inutiles que dangereux. Les développeurs de Prestashop ont pris les devants et à l’heure ou j’écris ces lignes la version de développement de la plateforme e-commerce ne contient plus le code incriminé.

Adaptons maintenant l’idée d’empêcher les tentatives de connexion trop fréquentes à l’environnement multithreads des serveurs web. Commençons par stocker chaque erreur de connexion ainsi que la date à laquelle elle se produit et l’utilisateur qu’elle concerne dans une base de données ou mieux avec memcached. Si pour un même utilisateur une tentative de connexion arrive trop rapidement après l’une ayant échouée, disons au bout d’une seconde après le premier échec, de 5 après le deuxième, de 10 après le troisième…, exigeons que l’utilisateur prouve qu’il est bien humain (ex. : en ajoutant un CAPTCHA en plus des champs login et password). Si les echecs provenant d’une même adresse IP sont systématiques, on peut blacklister cette adresse car elle est probablement utilisée par un assaillant.

Dernier point, inciter voir exiger que vos utilisateurs optent pour un mot de passe fort diminue drastiquement les risques de compromission par force brute. N’hésitez pas à afficher des jauges de sûretés auprès du champ de saisie de mot de passe du formulaire d’inscription.

jquery.confirmExit : où comment ne plus perdre les données d’un formulaire complété

Je viens de publier un petit plugin jQuery sous license MIT qui affiche une demande de confirmation lorsqu’un l’utilisateur quitte une page web après avoir rempli un formulaire sans l’avoir envoyé.

Perdre toutes les données que l’on vient de saisir en cliquant sur un lien ou en fermant la fenêtre sans avoir appuyer sur “Envoyer”, c’est le genre de détails qui font rager contre les applications web mal finies.

Plus d’excuse avec jquery.confirmExit. Cerise sur le gâteau, le plugin supporte tous les nouveaux champs de formulaires introduits avec HTML5.

Télécharger le plugin sur GitHub

3ème workshop d’initiation aux technologies du web

A la demande générale La Coopérative des Tilleuls vous invite à un troisième workshop d’initiation aux technologies du web.

Après avoir appris les bases de HTML lors du premier workshop et de CSS lors du second, nous réaliserons ensemble l’intégration complète d’une page web à partir d’une maquette graphique.

Nous apprendrons à découper une maquette afin de la transformer en page web puis nous reverrons les techniques apprises lors des premiers ateliers et les mettrons en pratique sur ce cas concret.
C’est l’occasion pour ceux qui n’ont pas pu assister aux séances précédentes de prendre le train en marche et pour les autres de se perfectionner.

Pour bien se préparer :

Ce workshop est destiné aux débutants. Aucune connaissance préalable n’est nécessaire à son suivi mais il est préférable de prendre connaissance du contenu des ateliers précédents.
L’encadrement est assuré par des développeurs professionnels coopérateurs à La Coopérative des Tilleuls. C’est gratuit.

L’atelier se déroulera le jeudi 28 juin à 14h à Co-Factory, 677 avenue de la République à Lille (arrêt de tramway Buisson). Réservation obligatoire auprès de Kévin : kevin@la-cooperative-des-tilleuls.com

La Coopérative des Tilleuls

Après plus d’un an d’inactivité sur ce blog il est grand temps de le relancer pour vous présenter le projet qui m’occupe depuis quelques mois déjà : La Coopérative des Tilleuls.

Notre jeune société coopérative a été officiellement fondé le 1er janvier 2012 par Joad (designer et graphiste), François-Henry (développeur) et moi-même (développeur). Olivier (agent administratif) et Marion (développeuse) nous ont très vite rejoints.

La Coopérative des Tilleuls est un studio de développement spécialiste dans la réalisation de systèmes d’informations de bout en bout.

En coordination avec vos équipes et en accord avec les besoins de votre entreprise nous concevons et construisons vos applications métiers, votre plate-forme e-commerce et vos sites vitrines interactifs.

Nous utilisons les technologies les plus avancées et nous concevons des interfaces aussi esthétiques qu’ergonomiques.

Nous réalisons vos applications mobiles pour iPhone, iPad, Android et vos sites mobiles HTML5.

Nous connectons vos sites et progiciels aux places de marché, aux systèmes informatiques des banques, des transporteurs et de tous vos partenaires.

Nous créons pour vous des advergames et des applications pour Facebook et Twitter.

Nous configurons vos serveurs et effectuons le déploiement de vos applications.

Nous assurons formation et conseil autour de toutes ces technologies.

Nous concevons votre identité graphique : logos, affiches, flyers, newsletters et bien plus encore.

Nous nous occupons de tout : détermination de vos besoins, conception, développement back-end et front-end, charte graphique, communication, formation des utilisateurs.

Nous sommes de Lille, en force !

Présentation de la société.

Malgré la jeunesse de la structure nous avons mené à bien des missions d’envergure pour des clients de renom parmi lesquelles :

  • La conception et le développement d’une application à l’aide du framework Play! permettant de faire du push catalogue, de la gestion de prix et de stocks en temps réel pour les places de marché (eBay, Amazon, Rue Du Commerce, CDiscount, Pixmania, La Redoute) pour Walibuy.
  • La conception et le développement du composant régie du stop pub caritatif Winiti (6PEO) à l’aide du framework Symfony et de la base de données NoSQL MongoDB. Dans le cadre de ce projet nous avons publié sous licence libre le générateur d’admin Sonata pour MongoDB.
  • Le développement d’une partie du moteur de Geophyle Travel et la formation des développeurs de l’entreprise au framework Symfony.
  • La formation d’une équipe de Pictime sur la thématique des places de marché.

De nombreux autres projets sont en cours de réalisation et certains d’entre-eux seront impressionants.

En dehors de l’aspect technologique, c’est la fonctionnement de La Coopérative des Tilleuls qui est le plus intéressant et le plus  novateur : il s’agit d’une entreprise de l’économie sociale ayant la forme d’une Scop détenue par l’ensemble de celles et ceux qui y travaillent. Notre société fonctionne sans patron et sa gestion est assurée collectivement via des Assemblées Générales régulières au cours desquelles chaque femme et chaque homme dispose d’une voix. De plus les salaires (horaires) de toutes celles et ceux qui travaillent dans la coopérative sont égaux et les (éventuels) bénéfices de la société seront répartis équitablement entre nous.

Il s’agit de travailler autrement, dans un esprit et une ambiance qui favorise la coopération, l’entre-aide et la solidarité, à l’opposé du mode de fonctionnement des grosses sociétés du secteur, du management par la pression et l’humiliation.

L’objectif est aussi d’avoir un impact positif sur notre environnement social, de travailler avec des partenaires partageant notre vision du monde (nous refusons par exemple de travailler sur des technologies servant au fichage des individus), de favoriser l’émergence d’autres coopératives et soutenir les projets culturels, artistiques, associatifs, syndicaux, etc visants améliorer les conditions de vie des habitants et des travailleurs de nos quartiers de nos villes.

N’hésitez pas à me contacter si vous avez un projet à nous confier ou si vous souhaitez plus d’information sur ce projet.

A new Facebook Connect plugin for symfony 1: kdDoctrineGuardFacebookConnectPlugin

After some tests I realized that the plugin sfFacebookConnectPlugin created by fabriceb was no longer functional or maintained. I tried to correct some bugs but it’s a pain: the plugin is not adapted to the new version of the Facebook SDK.

So I have created new plugin called kdDoctrineGuardFacebookConnectPlugin available on GitHub or in the symfony 1 plugins repository. It provides a simple an easy way to add Facebook Connect support to your symfony 1 app and it works ! The code base is very small, easy to understand and has a voluntary limitation: only with sfDoctrineGuard auth method is supported (no Propel backend).

kdDoctrineGuardFacebookConnectPlugin adds a “Login with Facebook” button to the sfGuard signin form, automatically creates a sfGuard user and populates it with Facebook provided data (first name, last name, gender, location, hometown, Facebook profile link, …), and updates the profile if some data are changed on Facebook and provides a clean logout mechanism (from your app and from Facebook).

Downloads and installation instructions on the plugin GitHub page!

If  you are already using Symfony2, take a look at the noelg’s FacebookBundle.