Développement d'applications sécurisées avec Zend Framework



Documents pareils
OWASP Open Web Application Security Project. Jean-Marc Robert Génie logiciel et des TI

Sécurité des applications web. Daniel Boteanu

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Tech-Evenings Sécurité des applications Web Sébastien LEBRETON

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Aspects techniques : guide d interfaçage SSO

Documentation CAS à destination des éditeurs

laposte.net) Ministère de l'éducation nationale Atelier sécurité Rabat RALL 2007

Mysql. Les requêtes préparées Prepared statements

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Attaques applicatives

Proxies,, Caches & CDNs

1. Formation F5 - Local Traffic Manager Configuring (LTM)

SYSTÈMES D INFORMATIONS

Guide d interfaçage SSO Connexion des ressources aux plates-formes de type Corrélyce. Sommaire. Titre du document

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Stockage du fichier dans une table mysql:

Sage CRM. 7.2 Guide de Portail Client

Mysql avec EasyPhp. 1 er mars 2006

Vulnérabilités et sécurisation des applications Web

Par l'exemple de. Laurent Destailleur

Extended communication server 4.1 : VoIP SIP service- Administration

Failles XSS : Principes, Catégories Démonstrations, Contre mesures

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Attaques de type. Brandon Petty

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET


Présentation du relais HTTP Open Source Vulture. Arnaud Desmons Jérémie Jourdin

Quel serveur pour vous?

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs


PDO : PHP Data Object 1/13

WebSSO, synchronisation et contrôle des accès via LDAP

Outil de planification en ligne pour des créations de rendez-vous ou de sondage

Web : Stockage de mot de passe LOG619 Automne 2011 Olivier Bilodeau

La double authentification dans SharePoint 2007

Gestion centralisée d un réseau de sites discrets. Nicolas JEAN

Bee Ware. Cible de Sécurité CSPN. Validation Fonctionnelle Validation Fonctionnelle Bon pour application AMOA BEEWARE BEEWARE

Joomla! Création et administration d'un site web - Version numérique

Sécurité des bases de données Nicolas Jombart Alain Thivillon

Démonstration de la mise en cache via HTML 5 sur iphone

DOM - Document Object Model

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Vanilla : Virtual Box

Préparer la synchronisation d'annuaires

Fingerprinting d'applications Web

les techniques d'extraction, les formulaires et intégration dans un site WEB

ASP.NET MVC 4 Développement d'applications Web en C# - Concepts et bonnes pratiques

Dans l'article précédent, vous avez appris

Les risques HERVE SCHAUER HSC

Introduction à JDBC. Accès aux bases de données en Java

PHP CLÉS EN MAIN. 76 scripts efficaces pour enrichir vos sites web. par William Steinmetz et Brian Ward

Construction d un EDD avec SQL 2008 R2. D. Ploix - M2 Miage - EDD - Création

Sécurisation d une application ASP.NET

Sécurité des applications Retour d'expérience

Résoudre les problèmes PHP, les meilleures (et les pires) techniques

Alfstore workflow framework Spécification technique

Open Source Professional Training

Construire une application marketing Facebook sur la plateforme Windows Azure

Aide-mémoire minimal pour la sécurité en PHP François Gannaz

Connaître la version de SharePoint installée

Projet 2. Gestion des services enseignants CENTRE D ENSEIGNEMENT ET DE RECHERCHE EN INFORMATIQUE. G r o u p e :

Sendmail milter/greylisting

Module BD et sites WEB

Méthode de Test. Pour WIKIROUTE. Rapport concernant les méthodes de tests à mettre en place pour assurer la fiabilité de notre projet annuel.

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

Vulnérabilités et solutions de sécurisation des applications Web

MEGA Web Front-End Installation Guide MEGA HOPEX V1R1 FR. Révisé le : 5 novembre 2013 Créé le : 31 octobre Auteur : Noé LAVALLEE

PHP et les Bases de données - Généralités

SQL MAP. Etude d un logiciel SQL Injection

Ce document décrit une solution de single sign-on (SSO) sécurisée permettant d accéder à Microsoft Exchange avec des tablettes ou smartphones.

Internet Information Services (versions 7 et 7.5) Installation, configuration et maintenance du serveur Web de Microsoft

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

La Latecion protection anti-intrusion Web Web Le concept «Zero effort Security» La protection des applications Extranet

How to Login to Career Page

Comprendre et optimiser la base de données WordPress WP TECH 2014

Remote Cookies Stealing SIWAR JENHANI (RT4) SOUHIR FARES (RT4)

Conception d'un système d'information WEB avec UML Par Ass SERGE KIKOBYA

Architecture Orientée Service, JSON et API REST

Annexe 5. Kaspersky Security For SharePoint Servers. Consulting Team

La mémorisation des mots de passe dans les navigateurs web modernes

Le stockage local de données en HTML5

Programmation Internet Cours 4

3W Academy Programme de Formation Développeur Intégrateur web Total : 400 heures

DenyAll Detect. Documentation technique 27/07/2015

Revue de code Sécuritéou Test d Intrusion Applicatif. Quel est le plus efficace pour évaluer un niveau de sécurité applicatif?

Tests de montée en charge avec Tsung

INTRODUCTION AUX TESTS DE PERFORMANCE ET DE CHARGE

Keyyo Guide de mise en service CTI / API / TAPI Keyyo

Projet Viticulture - TP 3 : bases de données distantes BTS Services informatiques aux organisations

Application Form/ Formulaire de demande

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Transcription:

Développement d'applications sécurisées avec Zend Framework Mickaël Perraud 1 Développement sécurisé d'applications avec Zend Framework

Qui suis-je? Mickaël Perraud Contributeur Zend Framework Responsable documentation française Site : http://mikaelkael.fr Twitter : mikaelkael 2 Secure Application Development with the Zend Framework

Partie I Introduction 3 Secure Application Development with the Zend Framework

Introduction Zend Framework devient de plus en plus populaire La demande de lignes directrices dans le développement sécurisé d'applications basées sur Zend Framework grossit La plupart des livres, conférences ou articles se concentre sur la programmation d'applications PHP sécurisées sans framework L'utilisation de frameworks requiert de nouvelles lignes directrices pour la sécurité Les frameworks sont souvent proposés avec leurs propres fonctionnalités de sécurisation 4 Secure Application Development with the Zend Framework

Sujets abordés Authentification centralisée Validation et filtrage centralisé des entrées («input») Sécurité SQL Protection envers les Cross Site Request Forgery (CSRF) Sécurisation du management des sessions Protection envers les Cross Site Scripting (XSS) Nouvelles attaques envers les anciennes vulnérabilités 5 Secure Application Development with the Zend Framework

Partie II Authentification centralisée et Validation et filtrage centralisé des entrées 6 Secure Application Development with the Zend Framework

Applications traditionnelles vs. Zend Framework Les applications traditionnelles possèdent de multiples points d'entrées Les applications ZF utilisent majoritairement le design MVC associé à un distributeur («dispatcher») La manière traditionnelle est encline à produire des erreurs La manière ZF vous permet d'implémenter des tâches de sécurité centralisées : Authentification Validation et filtrage des entrées 7 Secure Application Development with the Zend Framework

Plugin du contrôleur frontal Ajout de fonctionnalités à Zend_Controller_Action Pas d'extension de classe requise Parfait pour des tâches centralisées comme l'authentification ou la validation/filtrage $front = Zend_Controller_Front::getInstance(); $front->registerplugin(new MyPlugin()); $front->dispatch(); 8 Secure Application Development with the Zend Framework

Authentification centralisée class ForceAuthPlugin extends Zend_Controller_Plugin_Abstract { public function predispatch(zend_controller_request_abstract $request) { try { My_Auth::isLoggedIn(); } catch (My_Auth_UserNotLoggedInException $e) { if (!in_array($request->getcontrollername(), array('login','index','error'))) { $request->setmodulename('default') ->setcontrollername('login') ->setactionname('index') ->setdispatched(false); return; } } } } 9 Secure Application Development with the Zend Framework

Validation et filtrage centralisé des entrées (I) $filters['index']['index'] = array( '*' => 'StringTrim', 'month' => 'Digits' ); $filters['login']['index'] = array( 'login' => 'Alpha', 'pass' => 'Alpha' ); $validators['index']['index'] = array( 'month' => array( new Zend_Validate_Int(), new Zend_Validate_Between(1, 12) ) ); $validators['login']['index'] = array( 'login' => array( new My_Validate_Username() ), 'pass' => array( new My_Validate_Password() ), ); 10 Secure Application Development with the Zend Framework

Validation et filtrage centralisé des entrées (II) class FilterPlugin extends Zend_Controller_Plugin_Abstract { public function predispatch(zend_controller_request_abstract $request) { $params = $request->getparams(); $controller = $request->getcontrollername(); $action = $request->getactionname(); } } @$filter = $GLOBALS['filters'][$controller][$action]; @$validator = $GLOBALS['validators'][$controller][$action]; $input = new Zend_Filter_Input($filter, $validator, $params); if (!$input->isvalid()) { $request->setmodulename('default') ->setcontrollername('error') ->setactionname('illegalparam') ->setdispatched(false); return; } 11 Secure Application Development with the Zend Framework

Intégration centralisée de PHPIDS class Controller_Plugin_PHPIDS extends Zend_Controller_Plugin_Abstract { public function predispatch(zend_controller_request_abstract $request) } { $request = array('get' => $request->getquery(), 'POST' => $request->getpost(), 'COOKIE' => $request->getcookie(), 'PARAMS' => $request->getuserparams()); } $init = IDS_Init::init(APPLICATION_PATH.'/config/phpids.ini'); $ids = new IDS_Monitor($request, $init); $result = $ids->run(); if (!$result->isempty()) { $compositelog = new IDS_Log_Composite(); $compositelog->addlogger(ids_log_database::getinstance($init)); $compositelog->execute($result); } Lien utile : http://code.google.com/p/zids/ 12 Secure Application Development with the Zend Framework

Partie III Validation et filtrage des formulaires 13 Secure Application Development with the Zend Framework

Validation et filtrage des formulaires (I) Les formulaires ZF utilisent les filtres/validateurs de manière automatique Ceux-ci peuvent être ajoutés aux objets Zend_Form_Element Ils peuvent être chaînés arbitrairement // Création de l'élément Nom $name = $form->createelement('text', 'name', array('size' => 40, 'maxlength' => 40)); $name->addvalidator('alpha') ->addvalidator('stringlength', false, array(1, 40)) ->setlabel('name') ->setrequired(true); // Création de l'élément Message $message = $form->createelement('textarea', 'message', array('rows' => 6, 'cols' => 40)); $message->setlabel('message') ->setrequired(true) ->addfilter('striptags'); // Création du bouton Envoi $submit = $form->createelement('submit', 'send'); $submit->setlabel('envoyer'); // Ajout de tous les éléments au formulaire $form->addelement($name)->addelement($message)->addelement($submit); 14 Secure Application Development with the Zend Framework

Validation et filtrage des formulaires (II) Validation du formulaire dans l'action correspondante $form = My_Custom_Form(); if ($this->getrequest->ispost() && $form->isvalid($this->getrequest()->getpost())) { // Faire qqch avec les données valides reçues $data = $form->getvalues(); //... } $this->view->form = $form; 15 Secure Application Development with the Zend Framework

Partie IV Sécurité SQL 16 Secure Application Development with the Zend Framework

Injection SQL dans les applications Zend Framework ZF est fourni avec de multiples classes permettant l'accès aux bases de données Les méthodes supportent majoritairement les requêtes préparées («Prepared Statements») $sql = "SELECT id FROM _users WHERE lastname=? AND age=?"; $params = array('mueller', '18'); $res = $db->fetchall($sql, $params); Une erreur dans la création des requêtes préparées permet une injection SQL ZF fournit aussi des fonctions d'échappement permettant la création dynamique de requêtes SQL Un oubli d'échappement peut entraîner de l'injection SQL 17 Secure Application Development with the Zend Framework

Injection SQL + PDO_MySQL = Danger Traditionnellement MySQL ne permet l'exécution que d'une seule requête à la fois ext/mysql stoppe complètement les requêtes multiples ext/mysli possède une fonction distincte mysql_multi_query() ATTENTION : PDO_MySQL n'a pas cette limitation Les risques d'injection SQL dans les applications ZF sont plus élevées dans celles utilisant PDO_MySQL que dans celles qui utilisent les interfaces traditionnelles MySQL 18 Secure Application Development with the Zend Framework

Zend_Db Échappement function quote($value, $type = null) Toujours le bon échappement une seule fonction au lieu d'un grand nombre ATTENTION : les chaînes sont donc mises entre les guillemets function quoteidentifier($ident, $auto=false) Fonction d'échappement pour les identificateurs Les applications PHP traditionnelles doivent faire cette implémentation elles-même ATTENTION : les chaînes sont donc mises entre les guillemets 19 Secure Application Development with the Zend Framework

Zend_Db_Select Permet de créer des requêtes de type SELECT de manière dynamique Utilise en interne des requêtes préparées autant que possible L'injection SQL reste possible en cas de mauvaise utilisation ATTENTION entre autres à WHERE et ORDER BY // Construire cette requête : // SELECT product_id, product_name, price // FROM "products" // WHERE (price < 100.00 OR price > 500.00) // AND (product_name = 'Apple') $minimumprice = 100; $maximumprice = 500; $prod = 'Apple'; $select = $db->select() ->from('products', array('product_id', 'product_name', 'price')) ->where("price < $minimumprice OR price > $maximumprice") ->where('product_name =?', $prod); 20 Secure Application Development with the Zend Framework

Partie V Protection envers les attaques Cross Site Request Forgery (CSRF) 21 Secure Application Development with the Zend Framework

Protection Cross Site Request Forgery (CSRF) Les protections CSRF sont habituellement basées sur des jetons secrets de formulaire dépendants de la session Zend Framework possède un Zend_Form_Element_Hash qui est justement un jeton de ce type intégrant son propre validateur Les formulaires peuvent donc être immunisés des attaques CSRF en ajoutant cet élément de formulaire $form->addelement('hash', 'csrf_token', array('salt' => 's3cr3ts4ltg%ek@on9!')); 22 Secure Application Development with the Zend Framework

Protection CSRF automatique Cette protection doit être appliquée manuellement En étendant la classe Zend_Form, il est possible de créer une nouvelle classe de formulaire intégrant automatiquement une protection CSRF class Mkk_Form extends Zend_Form { public function construct() { parent:: construct(); $this->addelement('hash', 'csrf_token', array('salt' => get_class($this). 's3cr3t%ek@on9!')); } } 23 Secure Application Development with the Zend Framework

Partie VI Sécurisation du management des sessions 24 Secure Application Development with the Zend Framework

Configuration des sessions La configuration a un impact important sur la sécurité de la session Les applications SSL doivent être sécurisées avec le flag secure Avoir son propre nom de session et son propre espace de stockage pour chaque application Rendre plus difficile les attaques XSS avec le flag httponly Spécifier la durée de vie la plus courte Zend_Session::setOptions(array( /* if SSL server */ 'cookie_secure' => true, /* own session name */ 'name' => 'myssl', /* own session storage */ 'save_path' => '/sessions/myssl', /* hardening against XSS */ 'cookie_httponly' => true, /* short lifetime */ 'gc_maxlifetime' => 15 * 60 )); Zend_Session::start(); 25 Secure Application Development with the Zend Framework

Fixation de session & détournement de session Fixation de session («Session fixation») Devient légèrement plus dur avec une gestion stricte de la validation de session Stoppé par la régénération d'un nouvel identifiant de session à chaque changement d'état session_regenerate_id(true); Le mieux est de l'implémenter dans le module de connexion/déconnexion de l'application Détournement de session («Session Hijacking») Possible seulement en utilisant SSL (pour stopper l'écoute du réseau «sniffing») Les cookies httponly protègent envers le vol de session par XSS Validation de session seulement d'une utilité limitée 26 Secure Application Development with the Zend Framework

Validation de session (I) Reconnaître les sessions valides en vérifiant aussi des informations additionnelles Souvent recommandé pour stopper les détournements/fixations de session mais seulement d'une utilité limitée Zend Framework supporte la validation de session avec : Zend_Session_Validator_HttpUserAgent try { Zend_Session::start(); } catch (Zend_Session_Exception $e) { // Zend_Session::regenerate_id() support is broken session_regenerate_id(true); } Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent()); 27 Secure Application Development with the Zend Framework

Validation de session (II) Faîtes cependant attention si vous activez une validation d'information additionnelle Une vérification de l'entête HTTP User-Agent sera par exemple problématique avec Microsoft Internet Explorer 8 La vérification de l'entête HTTP Accept sera aussi un problème avec d'anciennes versions d'internet Explorer La vérification de l'ip du client n'est pas toujours possible derrière de gros proxy (entreprise, fournisseur d'accès) Limiter la vérification à des réseaux de classe C / B / A Meilleure compatibilité avec des sites SSL 28 Secure Application Development with the Zend Framework

Validation de session Valididation de l'ip du client class Zend_Session_Validator_RemoteAddress extends Zend_Session_Validator_Abstract { /** * Setup() - this method will get the client's remote address and store * it in the session as 'valid data' * * @return void */ public function setup() { $this->setvaliddata( (isset($_server['remote_addr'])? $_SERVER['REMOTE_ADDR'] : null) ); } /** * Validate() - this method will determine if the client's remote addr * matches the remote address we stored when we initialized this variable. * * @return bool */ public function validate() { $currentbrowser = (isset($_server['remote_addr'])? $_SERVER['REMOTE_ADDR'] : null); } } return $currentbrowser === $this->getvaliddata(); 29 Secure Application Development with the Zend Framework

Part VI Protection envers les Cross Site Scripting (XSS) 30 Secure Application Development with the Zend Framework

XSS dans les applications Zend Framework Symfony est fourni avec un échappement automatique des sorties Zend Framework n'est pas fourni avec un tel mécanisme Stopper les XSS est une tâche du développeur Les vulnérabilités XSS apparaissent dans les vues <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf- 8"> <title><?php echo $this->title;?></title> </head> <body> <h2><?php echo $this->headline;?></h2> <ul> <li><a href="<?php echo $this->link;?>">link 1</a></li> </ul> </body> </html> 31 Secure Application Development with the Zend Framework

Protection envers les XSS (I) Traditionnellement 2 alternatives : N'afficher que des données propres <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title><?php echo $this->escape($this->title);?></title> </head> <body> <h2><?php echo $this->escape($this->headline);?></h2> <ul> <li><a href="<?php echo urlprepare($this->link);?>">link 1</a> </li> </ul> </body> </html> 32 Secure Application Development with the Zend Framework

Protection envers les XSS (II) N'assigner que des valeurs propres $entityfilter = new Zend_Filter_HtmlEntities(); $urlfilter = new My_Filter_Url(); $this->view->title = $this->escape("seite 1"); $this->view->headline = $entityfilter->filter($this->getrequest() ->getpost('link')); $this->view->link = $urlfilter->filter($this->getrequest() ->getpost('link')); 33 Secure Application Development with the Zend Framework

Sauvegarde avec Zend_View_Helper Solutions traditionnelles conduisent à des erreurs potentiellement chaque erreur == XSS Le balayage automatique à la recherche d'échec est difficile à réaliser Prohiber l'affichage direct de variables N'afficher que via un Zend_View_Helper La protection XSS devient alors une tâche de Zend_View_Helper <form action="action.php" method="post"> <p> <label>your Email:</label> <?php echo $this->formtext('email', 'you@example.com', array('size' => 32))?> </p> <p> <label>your Country:</label> <?php echo $this->formselect('country', 'us', null, $this->countries)?> </p> <p> <label>would you like to opt in?</label> <?php echo $this->formcheckbox('opt_in', 'yes', null, array('yes', 'no'))?> </p> </form> 34 Secure Application Development with the Zend Framework

Part VII unserialize() et les entrées utilisateur 35 Secure Application Development with the Zend Framework

unserialize() et les entrées utilisateur Ne jamais utiliser unserialize() sur une entrée utilisateur! Les propriétés peuvent être remplies arbitrairement même celles privées Les méthodes destruct() et wakeup() seront exécutées L'autoloader permet le chargement arbitraire d'objets Zend Framework est fourni avec un grand nombre de classes La combinaison de certaines classes permet de détourner le flux de contrôle 36 Secure Application Development with the Zend Framework

unserialize() Exemple d' «exploit» Les classes de Zend-Framework permettent : L'upload de fichiers arbitraires L'exécution de code PHP arbitraire (ZF >= 1.8.0) L'envoi de courriel de SPAM (ZF >= 1.8.0) L'inclusion de fichiers arbitraitres (ZF >= 1.9.0) 37 Secure Application Development with the Zend Framework

Zend_Queue_Adapter_Activemq class Zend_Queue_Adapter_Activemq extends Zend_Queue_Adapter_AdapterAbstract { // /** * Close the socket explicitly when destructed * * @return void */ public function destruct() { // Gracefully disconnect $frame = $this->_client->createframe(); $frame->setcommand('disconnect'); $this->_client->send($frame); unset($this->_client); } } // Zend_Queue_Adapter_Activemq _client 38 Secure Application Development with the Zend Framework

Zend_Queue_Stomp_Client_Connection class Zend_Queue_Stomp_Client_Connection implements Zend_Queue_Stomp_Client_ConnectionInterface { //... public function getframeclass() { return isset($this->_options['frameclass'])? $this->_options['frameclass'] : 'Zend_Queue_Stomp_Frame'; } public function createframe() { $class = $this->getframeclass(); if (!class_exists($class)) { require_once 'Zend/Loader.php'; Zend_Loader::loadClass($class); } $frame = new $class(); //... Zend_Queue_Stomp_Client_Connection _options[frameclass] 39 Secure Application Development with the Zend Framework

Combined Zend_Queue_Adapter_Activemq _client Zend_Queue_Stomp_Client_Connection _options[frameclass] = /var/www/malicious O:27:"Zend_Queue_Adapter_Activemq":1: {s:36:"\0zend_queue_adapter_activemq\0_client";o:34:"zend_queue_sto mp_client_connection":1:{s:11:"\0*\0_options";a:1: {s:10:"frameclass";s:18:"/var/www/malicious";}}} 40 Secure Application Development with the Zend Framework

Forum AFUP 2010! 9-10 novembre 2010 http://www.afup.org/pages/forumphp2010/ Quelques conférences sur ZF avec notamment G. Delamarre pour une introduction au ZF et J. Pauli et M. Perraud pour une session sur ZF 2.0 41 Secure Application Development with the Zend Framework

Merci! 42 Développement sécurisé d'applications avec Zend Framework