dadadi blog

To content | To menu | To search

Thursday, August 26 2010

w3c file api (english version)

Yesterday, I had the opportunity to play with file API. This API, proposed by Mozilla, allows reading a file content directly from a webpage, that is, without sending it to the server first. User must provide a file, either by drag and dropping it on the page, either with a normal input file (<input type="file">). So, a web page cannot read a file on the computer without user consent.

Developer mozilla site has a good tutorial about the subject. This allowed me to quickly set up a small demo. A world map is displayed (thanks to OpenLayers library). When a file with geographic informations is dropped on it, the file is read by the web page, and geometries are automatically drawn on the map.

Currently, demo only works with Firefox 3.6 because it's the only web engine to implement this functionality. A bug is opened on webkit bugtracker, but no real progress has been made yet.

To try the demo, you need to have some KML, GPX or OSM files. If you don't have some, you can download some example files.

Wednesday, August 25 2010

w3c file api (version française)

Aujourd'hui, j'ai joué un peu avec l'api fichier proposée par Mozilla. Elle permet de lire le contenu d'un fichier directement depuis une page web, sans avoir besoin de l'envoyer d'abord sur le serveur. L'utilisateur doit fournir le fichier, soit avec en le glissant sur la page, soit avec un champ de type fichier classique (<input type="file">). Ainsi, cela ne cause pas un trou de sécurité énorme en laissant une page lire n'importe quel fichier sur le disque de l'utilisateur.

Le site developer mozilla a un bon tutoriel sur le sujet. Cela m'a permis de mettre en place rapidement une petite démonstration qui utilise cette fonctionnalité. Une carte du monde est affichée (grâce à la librairie OpenLayers). Et lorsqu'on y fait glisser un fichier contenant des informations géographiques, le fichier est lu par la page web, et les géométries sont automatiquement affichées sur la carte.

À l'heure actuelle, la démonstration ne fonctionne qu'avec Firefox 3.6 car c'est le seul navigateur à implémenter cette fonctionnalité. Du côté de webkit, les discussions ont commencé dans le gestionnaire de bugs, mais n'ont pas encore abouti réellement abouti.

Pour tester la démonstration, vous devez disposer de fichiers KML, GPX ou OSM. Si vous n'en avez pas, vous pouvez télécharger des fichiers d'exemple.

Thursday, April 1 2010

CSS History Hack corrigé

Grâce au (à cause du) sélecteur css visited, il est possible d'appliquer une propriété différente à un lien html qui a été visité. Cela peut donner une indication visuelle très intéressante lorsque par exemple les liens déjà visités sont d'une couleur différente. Par contre, cela donne aux sites webs, un moyen de connaître la liste des sites que l'utilisateur a visités, ou au moins de savoir lesquels il a visité parmi une liste d'adresses.

En javascript, la méthode getComputedStyle permet de récupérer des informations sur le style réellement appliqué à un élément. Si l'auteur du site déclare que les liens visités doivent être de couleur verte ou de taille 12px qu'il affiche une liste de liens (au besoin en les cachant plus ou moins grossièrement à l'utilisateur), il lui suffit d'utiliser la méthode getComputedStyle pour connaître la couleur ou la taille des liens et ainsi savoir lesquels ont été visités. Il est ainsi possible de tester un grand nombre de sites très rapidement. (démo)

Il est également possible d'utiliser cette technique sans javascript. Par exemple, en utilisant la propriété css background-image qui va afficher telle ou telle image distante pour chaque adresse visitée. Il suffit au site attaquant d'interpréter les logs du serveur web pour savoir quelles images ont été affichées et donc en déduire quels sites ont été visités. (démo).

Ce problème est connu depuis longtemps, au moins 8 ans, et aucune solution n'avait été apportée. Or, le problème vient d'être résolu par Mozilla. Tout d'abord, le comportement de getComputedStyle a été modifié afin de ne plus  retourner le vrai résultat pour les liens visités. D'autre part, on ne peut plus maintenant modifier que  la couleur des liens, et pas les autres propriétés.

Cette correction sera disponible dans les prochaines version de Firefox et permettra d'améliorer la protection de l'historique des utilisateurs, au moins dans Gecko pour l'instant. Elle ne permettra malheureusement pas de le protéger complètement. Il sera toujours possible par exemple d'afficher des images de différents sites et de mesurer le temps de chargement pour essayer de deviner si elles étaient dans le cache. D'autres moyens sont également envisageables. Néanmoins, ce type d'attaque devrait être rendue plus difficile à mettre en place, ce qui est déjà un progrès important.

Saturday, March 13 2010

installation de weave minimal

Je me suis intéressé récemment au projet weave de mozilla. Il s'agit principalement d'une extension Firefox qui permet la synchronisation de données (historique, marque-pages, etc) entre différents postes de travail.

Ce type d'outil est très répandu, mais le premier intérêt de weave, c'est que les données sont chiffrées avant envoi au serveur; il lui est donc impossible de lire nos données, de les diffuser ou de les revendre. Le deuxième intérêt, c'est qu'en plus de proposer le service de synchronisation, Mozilla met à disposition, sous licence libre, le logiciel du serveur de synchronisation. Il devient ainsi facile de synchroniser des profils Firefox de manière totalement indépendante, c'est à dire sans dépendre d'un service que l'on ne maitrise pas.

Pour cela, j'ai d'abord commencé par créer mon sous-domaine weave.renevier.net et attendu que les dns soient mis à jour. Ensuite, j'ai téléchargé une copie du minimal server. À priori il existe une version plus complète et plus compliquée à installer, mais le minimal server est adapté à un usage domestique pour lequel les nouveaux utilisateurs sont ajoutés manuellement.

J'ai ensuite décompressé l'archive
tar zxf weave_minimal.tgz
puis j'ai déplacé le répertoire extrait dans le répertoire de mon choix
mv weave_minimal /var/http/
J'ai ensuite donné les droits en écriture à l'utilisateur qui fait tourner le serveur web, afin que la base de données sqlite puisse être crée puis mise à jour correctement.
chgrp -R /var/http/weave && chmod g+w /var/http/weave
Weave a besoin d'une installation de php qui supporte json, mbstring et sqlite, j'ai donc du installer, sur mon serveur en debian stable, le paquet php5-sqlite
J'ai ensuite configuré et redémarré le serveur web. J'utilise lighttpd, voici le contenu de mon fichier de configuration

server.modules += ( "mod_alias", "mod_redirect", "mod_auth" )

$HTTP["host"] =~ "^weave.renevier.net$" {

server.document-root = "/var/httpd/weave/"
alias.url = ("/weave" => "/var/httpd/weave/index.php")

$SERVER["socket"] == ":80" {
url.redirect = ( "^/(.*)" => "https://weave.renevier.net/$1" )
}

}

Pour que weave soit disponible en https, il faut créer un certificat. Idéalement, il faudrait le faire certifier par une autorité de certification, mais pour un usage personnel, un certificat auto-signé fait très bien l'affaire. Comme j'en avais déjà un, je n'ai pas eu à en recréer, je ne vais donc pas décrire cette étape, mais des bons tutoriels existent sur le web.

Ensuite, je me suis rendu avec mon navigateur à l'adresse https://weave.renevier.net/weave/1.0/blah/info/collection et mon navigateur m'a demandé login et mot de passe. On peut rentrer n'importe quoi, cette étape ne sert qu'à initialiser la base sqlite. Ensuite, le navigateur redemande en boucle login et mot de passe, c'est normal, il suffit juste de répondre une seule fois.

On peut maintenant créer les utilisateurs du service grâce au script create_user disponible dans le dossier weave: php create_user.

Il ne reste plus maintenant qu'à installer l'extension sur les postes de travail que l'on veut synchroniser. Avant d'installer l'extension, il m'a été nécessaire, vu que j'utilise un certificat autosigné, de visiter l'url https://weave.renevier.net/ afin d'ajouter une exception de sécurité pour chacun des postes que je vais synchroniser. Lors de la configuration de l'extension, j'ai du choisir l'option Use a custom server, et configurer l'url suivante: https://weave.renevier.net/weave/

Voila, weave est maintenant installé !