Je viens de découvrir sur le blog de Mike Perry une intéressante attaque par vol de cookie. Elle n'est pas récente, mais a eu quelques développements ces derniers temps, je vais donc essayer d'en donner une rapide explication ici.
Tag - PHP
dimanche 5 octobre 2008
Sécurité: attaque par vol de cookie
Par Clochix le dimanche 5 octobre 2008, 20:13 - Technoweb
mardi 26 août 2008
Astuce pour sécuriser l'affichage d'un site eZ Publish
Par Clochix le mardi 26 août 2008, 00:20 - Technoweb
Lors de la réalisation d'un site avec eZ Publish, il peut être utile de définir les comportements par défaut pour gérer les cas limites, par exemple l'affichage d'un contenu dans un contexte que vous n'aviez pas prévu. Une illustration des possibles problèmes de sécurité des CMS que j'évoquais tantôt. J'espère amorcer avec cette astuce une mise en commun de bonnes pratiques de sécurisation des CMS.
dimanche 24 août 2008
Et si on s'interressait à la sécurité des CMS ?
Par Clochix le dimanche 24 août 2008, 23:42 - Technoweb
Au fur et à mesure de mes pérégrinations sur la toile, j'ai de plus en plus l'impression que bon nombre de sites réalisés avec des CMS sont insuffisamment sécurisés et permettent à n'importe quel visiteur d'accéder à des informations dont la consultation n'était pas prévue.
dimanche 3 août 2008
Respecter ses conventions de codage avec PHP CodeSniffer
Par Clochix le dimanche 3 août 2008, 00:24 - Technoweb
Je me suis fais enchaîner par un blogueur à coquille au marronnier de l'été, la disserte sur les conventions de codage. Je lui en aurait presque voulu de m'acculer à certain aveu intime et douloureux si ça ne m'avait pas permis de découvrir qu'une nouvelle version de PHP CodeSniffer était sortie il y a peu.
J'ai déjà évoqué (ici et là) cette bibliothèque de fonctions développée par Greg Sherwood et intégrée au projet PEAR. La nouvelle version 1.1 comporte des évolutions très intéressantes:
- elle permet désormais l'analyse non seulement des fichiers PHP, mais aussi javascript ! Pour cela, les classes qui explosent le code source en lexèmes (en PHP on parle de tokens) ont été externalisées. On pourra ainsi à l'avenir brancher d'autres analyseurs de code (le but de Greg est de permettre également à terme l'analyse des fichiers CSS, HTML et XML). Une fois le code segmenté en tokens, ceux-ci sont passés au moteur chargé de contrôler le respect de la convention. On peut préciser au niveau de chaque règle de la convention à quels langages elle s'applique. Une même règle (par exemple pour l'indendation) pourra donc être valable pour tous les langages utilisés dans un projet, ou juste pour certains.
- phpcs est désormais fournie avec un "pre-commit hook svn", c'est à dire que si vous utilisez Subversion, vous pouvez contrôler le respect des conventions de codage au moment du commit, et l'interdire en cas de non-respect
- en plus des conventions de PEAR et de celles des projets de Squiz, l'employeur de Greg, la bibliothèque supporte à présent nativement celles du framework Zend, sans avoir besoin d'installer un programme externe.
- phpcs peut s'interfacer avec JavaScript Lint pour valider les fichiers javascript (à condition que celui-ci soit installé sur la machine, bien sûr)
- enfin, le manuel s'est enrichi d'une documentation sur la création de nouvelles convention
Et ce n'est pas fini, car dans un billet récent, Greg indique travailler sur de nouvelles fonctionnalités dont la détection de code dupliqué dans le projet (en reprenant une fonctionnalité de PHPUnit). Cela signifie que PHP CodeSniffer pourra à l'avenir utiliser des règles ne portant pas que sur la syntaxe des fichiers, mais sur l'ensemble du projet.
Créer sa convention
Si les standard fournis par défaut ne vous conviennent pas, vous pouvez créer les vôtres. Il "suffit" pour cela de créer une classe principale et des règles, chaque règle effectuant un certain nombre de tests sur une partie du code. La classe principale permet d'indiquer que la convention se compose, en plus de ses propres règles, de "sniffs" provenant d'autres conventions. On peut ainsi créer facilement un nouveau standard en reprenant des règles existantes. De même, on peut créer de nouvelles règles héritant de règles existantes. Par exemple, une règle "générique" fournie avec la librairie permet de vérifier le nombre d'espaces utilisés pour indenter. Elle fixe ce nombre à 4. Si votre projet utilise 2 espaces, créez une règle qui étend la classe Generic-Sniffs_WhiteSpace_ScopeIndentSniff en modifiant juste la valeur de l'indentation par défaut.
Pour utiliser votre convention par défaut, il suffit de taper:
$ phpcs --config-set default_standard /path/to/your/standard
Bon alors Niko, à quand l'intégration des conventions de Symfony ?
Enfin, vous pouvez utiliser CodeSniffer avec Phing, via une tâche optionnelle (qui ne figure pas encore dans la documentation de la version courante)
PS: ah, et la réponse à la question initiale, quelle sont mes préconisations
en matière de codage ? mais c'est vachement intime comme question !
(autre façon de dire que quand on m'en donne, je les respecte, et sur mes
projets persos, je cherche encore, mélange allégrement tout ce que j'ai appris,
et change d'avis toutes les 2 minutes. Bref, mon code est un souk innommable
Mais peut-être que ce coup-ci CodeSniffer va enfin m'aider à m'astreindre à
un peu plus de rigueur. On peut toujours rêver, mais je vais essayer d'intégrer
progressivement quelques règles au projet). Et comme il faut briser les
chaînes, je ne refourgue celle-ci à personne.
mardi 8 juillet 2008
Flow3 t il au dessus des autres frameworks PHP ?
Par Clochix le mardi 8 juillet 2008, 02:20 - Technoweb
En cherchant s'il existait d'autres librairies permettant l'injection de dépendances en PHP, je suis tombé sur un truc peu plus gros qu'une librairie, un framework qui a été annoncé au début de l'année et dont les specs déchirent pas mal : FLOW3. Il est écrit par l'équipe de développement de Typo3, donc ce n'est apparemment pas qu'un élucubration d'un geek mythomane.
lundi 7 juillet 2008
Injection de dépendances en PHP avec Crafty
Par Clochix le lundi 7 juillet 2008, 23:59 - Technoweb
Mes récentes, brèves mais fructueuses, incursions dans l'archipel de Java m'ont permis de pratiquer les patrons de conceptions inversion de contrôle (IoC) et injection de dépendances. Je viens de tomber sur une bibliothèque PHP, Crafty, permettant de faire de l'injection de dépendances en PHP. L'occasion d'en dire 2 mots...
mercredi 16 avril 2008
eZ Publish, WebDAV et import de contenus
Par Clochix le mercredi 16 avril 2008, 22:34 - Technoweb
Suite de l'exploration de fonctionnalités un peu plus avancées d'eZ Publish avec ses interfaces avec WebDAV et OpenDocument.
vendredi 4 avril 2008
A la découverte d'eZ Flow
Par Clochix le vendredi 4 avril 2008, 00:59 - Technoweb
eZ Publish est un excellent gestionnaire de contenus, à mon avis un des mailleurs en PHP. Il pêchait par contre au niveau de la gestion de sites, en offrant peu de possibilités d'administration de l'affichage des contenus sur les pages d'un site. Le plus souvent, il fallait recourir à l'écriture de modèles de pages (templates), tâche nécessitant des compétences techniques.
Ce manque a été en grande partie comblé avec la sortie en novembre dernier, en même temps qu'eZ Publish 4, de l'extension eZ Flow qui permet aux administrateurs du site de gérer facilement le contenu des pages.
eZ Flow permet de définir des modèles de mise en page (layouts) composés des zones (zones) administrables. Les zones contiennent elles-même des blocs (blocks) qui affichent les contenus. Techniquement, chaque layout est un template. Ce système permet d'alléger les templates en les transformant en simples squelettes dans lesquels les administrateurs positionneront les contenus.
Comment ça marche ?
Les layouts, leur zones et les blocs disponibles sont définis dans des fichiers de configuration et avec un peu de programmation. Les pages basées sur un layout peuvent ensuite être éditées directement depuis le front office: une fois connecté on choisi pour chaque page un modèle, et on remplit les zones avec des blocs, en sélectionnant le contenu de ceux-ci. Le nombre de blocs par zone et leur position relative sont également administrées depuis le front office. Un moteur de recherche intégré à l'éditeur de page permet de rechercher des contenus dans le site et de les insérer dans les blocs.
3 types de blocs peuvent actuellement être définis:
- des blocs manuels : leur contenu est sélectionné librement
- des blocs automatique : ils affichent les contenus renvoyés par des fonctions paramétrables. On peut par exemple définir une fonction retournant les n derniers articles d'un auteur, le nombre d'articles et le nom de l'auteur étant des paramètres administrables à l'édition de la page.
- des blocs spéciaux, eux aussi paramétrables (par exemple pour afficher un nuage de tags)
Chaque bloc peut proposer plusieurs méthodes de rendu (views) des contenus correspondant à autant de templates. La vue à utiliser est choisie dans l'interface d'administration du bloc sur la page.
A noter que pour l'occasion, eZ est passé à l'heure AJAX, et les mises à jour de blocs se font sans recharger toute la page. Une amélioration vraiment bienvenue quand on a l'habitude de travailler avec le back office, parfois un peu lourd et lent.
Ci-dessous un aperçu de l'interface d'administration d'une page, avec sur la gauche le moteur de recherche, et en colonne centrale le choix du modèle de page et l'administration de chaque bloc.
Planification
Lorsqu'on on ajoute des contenus à un bloc, on peut choisir leur date de publication. Ainsi, chaque bloc peut avoir des contenus publiés (online), des contenus en attente de publication (queue) et conserve une archives des contenus dé-publiés. Mieux, un mécanisme permet d'envoyer vers un autre bloc les contenus lorsqu'ils sont archivés. On pourra par exemple avoir un bloc avec une liste des dernières actualités et un autre avec les actualités précédentes, le second étant alimenté automatiquement avec les contenus qui cessent d'être publiés dans le 1er.
On peut aussi planifier une rotation des contenus à intervalles régulier, par exemple publier l'item suivant de la queue toutes les heures.
Enfin, une timeline permet de prévisualiser la page à une heure donnée:
Dernière fonctionnalité, et non des moindres, de l'extension, elle permet de gérer la publication de vidéos : enregistrement à partir d'une webcam, gestion de la diffusion en streaming... Elle s'appuie pour cela sur Flash et le serveur se streaming libre Red5. Je n'ai pas pu tester donc je n'en parlerai pas ici, mais si quelqu'un a des retours d'expérience...
lundi 21 janvier 2008
class.jabber.php, SSL, gtalk, etc
Par Clochix le lundi 21 janvier 2008, 00:08 - Technoweb
Les communications entre un client et un serveur jabber peuvent être chiffrées au moyen de SSL ou TLS. Traditionnellement les communications en clair ou avec TLS se font sur le port 5222 et celles chiffrées par SSL sur le port 5223.
J'ai dû un peu bidouiller la classe class.jabber.php que j'utilise dans Couac pour la rendre compatible avec les serveurs utilisant SSL, en particulier pour permettre de se connecter à un compte GTalk. Ces modifications figurent je crois dans la dernière version de la librairie, mais comme le site de celle-ci est inaccessible depuis un bon moment, je les détaille ici.
Pour choisir le type de connexion (en clair ou chiffrée par SSL), il faut
préfixer l'adresse du serveur par tcp ou ssl :
tcp://jabber.org ou ssl://jabber.org (pour le
chiffrage par TLS, si j'ai bien compris, on se connecte en TCP puis si le
client et le serveur supportent ce chiffrage, on le démarre en envoyant au
serveur un starttls).
Un problème classique lorsqu'on utilise des connexions chiffrées est celui des certificats auto-signés : les serveurs qui n'ont pas les moyens de se faire certifier par un tiers de confiance signent eux-même leur certificat. C'est une "faille" de sécurité qui par défaut provoque l'arrêt de la connexion. Pour passer outre, il faut autoriser SSL à utiliser des certificats auto-signés. Cela s'effectue en lui passant un paramètre. fsockopen ne permettant pas (plus ?) de passer des paramètres, je l'ai remplacé par stream_socket_client. Cette fonction peut recevoir un contexte comprenant entre autres les valeurs suivantes :
verify_peer: à mettre à faux pour ne pas vérifier le certificatallow_self_signed: à mettre à vrai pour autoriser les certificats auto-signés
Au final, le code complet est:
function OpenSocket($server, $port, $transport = 'tcp')
{
if (function_exists("dns_get_record"))
{
$record = dns_get_record("_xmpp-client._tcp.$server", DNS_SRV);
if (!empty($record))
{
$server = $record[0]["target"];
}
}
$context = stream_context_create();
if ($transport == 'ssl')
{
stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);
}
$errno = 0;
$errstr = '';
$socket = stream_socket_client($transport . '://'.$server.":".$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context));
// ...
}
Au passage, j'ai découvert la fonction dns_get_record et les enregistrements SRV dans le DNS qui permettent d'associer des IP à des services pour un nom de domaine.
Tout ça pour dire que Couac permet à présent de se connecter à GTalk. Il suffit, dans les propriétés du compte, de positionner le port à 5223 et le transport à SSL.
Références
vendredi 30 novembre 2007
Valider la syntaxe dans Eclipse avec Code Sniffer et PHP Documentor
Par Clochix le vendredi 30 novembre 2007, 23:25 - Technoweb
J'avais évoqué il y a un an PHP_CodeSniffer, une application PHP disponible dans PEAR permettant de vérifier automatiquement le respect de normes de programmation (type d'indentation, nommage des variables, etc). A l'époque, je ne l'avais pas testé, car il n'était compatible qu'avec les standards PEAR, et la création des fichiers pour lui faire reconnaître d'autres normes n'avait pas l'air triviale.
Aujourd'hui les choses ont changé : la V1 approche à grand pas, CodeSniffer intègre à présent les normes de programmation Zend, et justement j'interviens en ce moment sur un projet qui utilise le Zend Framework. Une bonne occasion de tester CodeSniffer et PHPDocumentor en lien avec Eclipse pour essayer d'obtenir du code un peu mieux écrit.
L'installation est simple : les deux programmes sont disponibles dans
PEAR, un coup de pear install suffit à les installer. On dispose
alors de deux nouvelles commandes, utilisable en console :
phpcs et phpdoc. L'intégration de phpcs avec Zend
n'est malheureusement pas native, elle nécessite la présence sur la machine
d'un petit utilitaire, zca, fournis avec Zend Studio et non libre. Après
l'installation de zca, il faut indiquer à phpcs où il se trouve :
$ phpcs --config-set zend_ca_path /path/to/ZendCodeAnalyzer
L'utilisation est ensuite très simple : phpcs --standard=Zend
{fichier}
PHP Documentor permet quant à lui de créer la documentation d'un projet à partir des commentaires du code source. Il suffit que ces commentaires respectent la syntaxe de phpDocumentor.
J'utilise ces 2 programmes directement depuis Eclipse pour vérifier que mon code respecte bien les standards de programmation du projet et est correctement documenté. Pour ce faire j'ai créé un petit script que j'appelle depuis Eclipse:
$ cat check_syntax.sh #/bin/bash /usr/bin/phpcs --standard=Zend $1 /usr/bin/phpdoc -f $1 -t /dev/null | grep "WARNING\|ERROR"
Pour appeler ce script depuis l'IDE, il suffit de l'exécuter comme un outil externe: dans le menu Run choisissez External Tools / Open External Tools Dialog et créez un nouvel outil avec ces paramètres:
- name : check syntax
- location : le chemin de votre script (pensez à faire un chmod pour le rendre exécutable)
- argument : ${resource_loc}
Pour appeler le script il vous suffit ensuite de choisir votre outil via la barre d'outil External Tools. La sortie du script s'affichera dans la console.
Cela demande évidemment la discipline d'exécuter ce script à la main sur chaque fichier modifié. Une étape suivante pourrait être de créer un pre-commit hook dans Subversion pour n'autoriser le commit que des fichiers syntaxiquement corrects. Ou d'ajouter ces vérifications aux scripts d'intégration continue du projet. Un jour quand j'aurai un peu de temps...
Références
« billets précédents - page 1 de 2

