Programmer avec Yii2 Sécurité

Si vous demandez, "Qu'est-ce que Yii?" check-out Introduction au framework Yii, qui passe en revue les avantages de Yii et comprend un aperçu de Yii 2.0.

Dans cette série de programmation avec Yii2, je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP. Si vous envisagez de partager votre application avec le public, vous en aurez besoin pour être sécurisé et il est préférable de planifier cela dès le début. Heureusement, commencer avec un framework tel que Yii rend cela beaucoup plus facile qu’il ne le serait autrement. Comme indiqué dans Features of Yii:

Yii est équipé de nombreuses mesures de sécurité pour empêcher vos applications Web d'attaques telles que l'injection SQL, le script intersite (XSS), la falsification de requête intersite (CSRF) et la falsification de cookies..

Dans ce tutoriel, je vais vous expliquer les concepts de base de la sécurité dans le cadre d'application Yii. Et, si cela vous intéresse, les futurs épisodes sécuriseront l’application, Meeting Planner, présentée dans notre série de startups, à l’approche de la version alpha..

Avant de commencer, rappelez-vous que j’essaie de participer aux discussions ci-dessous. Si vous avez une question ou une suggestion de sujet, veuillez poster un commentaire ci-dessous ou contactez-moi sur Twitter @reifman. 

Remarque: si vous avez constaté un écart entre les épisodes de la série Programmation Yii, c’est parce que j’ai dû chirurgie du cerveau l'année dernière. Nous vous remercions de votre patience et de votre soutien. Je suis heureux de pouvoir écrire de nouveau régulièrement et je suis impatient de poursuivre la couverture de Yii2..

Les bases de la sécurité avec Yii

Si vous débutez dans le domaine de la sécurité des applications Web, vous devez comprendre beaucoup les offres de Yii. Je ferai de mon mieux pour offrir une vue d'ensemble basée sur le meilleur de la documentation Yii 2.0. L'équipe Yii divise la sécurité en sept domaines clés:

  1. Authentification
  2. Autorisation
  3. Travailler avec des mots de passe
  4. Cryptographie
  5. Vues de sécurité
  6. Clients authentifiés
  7. Les meilleures pratiques

Commençons à les plonger un à un.

1. Authentification

La présentation Yii Framework Security d'Ilko Kacharov propose quelques diapositives utiles qui résument l'objectif de l'authentification (et le sous-sujet suivant, l'autorisation). En gros, voici les questions auxquelles ces sujets doivent répondre:

  • Qui est l'utilisateur?
  • Est-ce que l'utilisateur qu'ils disent être?
  • L'utilisateur est-il autorisé à accéder à une ressource??
  • L'utilisateur est-il autorisé à effectuer une action??
  • L'utilisateur est-il autorisé à effectuer une action sur une ressource??

Le modèle d'utilisateur et l'interface d'identité

La classe yii / web / User de Yii s'intègre à yii \ web \ IdentityInterface pour gérer le statut d'authentification de l'utilisateur dans votre application.. 

En novembre dernier, j'ai écrit un tutoriel sur le modèle d'application avancée de Yii. L'un des avantages du modèle avancé est qu'il fournit une intégration prédéfinie du modèle User avec ActiveRecord et votre base de données. Ainsi, votre application offre une authentification basée sur une base de données, prête à l'emploi..

Le modèle utilisateur vous permet de vous connecter et de déconnecter des utilisateurs par programme:

  • login () définit l'identité spécifiée et se souvient de l'état d'authentification dans la session et le cookie.
  • logout () marque l'utilisateur en tant qu'invité et supprime les informations pertinentes de la session et du cookie.
  • setIdentity (): modifie l'identité de l'utilisateur sans toucher à la session ni aux cookies, fonctionnalité idéale pour l'API.

La propriété $ isGuest détermine si l'utilisateur actuel s'est connecté ou non. Lorsque l'utilisateur est déconnecté, la valeur est null, mais elle renvoie sinon une instance de IdentityInterface..

Pour l'essentiel, vous avez besoin d'une classe User qui étend ActiveRecord et implémente des méthodes prenant en charge IdentityInterface, comme ceci:

 $ jeton]);  / ** * @return int | string ID utilisateur actuel * / fonction publique getId () return $ this-> id;  / ** * @return chaîne clé actuelle de l'utilisateur actuel * / fonction publique getAuthKey () return $ this-> clé_auth;  / ** * @param string $ authKey * @return boolean si la clé auth est valide pour l'utilisateur actuel * / fonction publique validateAuthKey ($ authKey) return $ this-> getAuthKey () === $ authKey; 

En outre, avant la création d'un utilisateur, l'application génère une chaîne aléatoire en tant que clé d'autorisation. Ceci peut être utilisé dans les emails "mot de passe oublié" ou d'autres liens de connexion basés sur email:

La classe utilisateur étend ActiveRecord implémente IdentityInterface … fonction publique beforeSave ($ insert) if (parent :: beforeSave ($ insert)) if ($ this-> isNewRecord) $ this-> auth_key = \ Yii :: $ app- > security-> generateRandomString ();  return true;  return false; 

Autorisation

Yii fournit deux approches intégrées pour l'autorisation. La liste de contrôle d'accès (ACL) plus simple détermine les utilisateurs ou les processus autorisés à effectuer des actions sur une ressource, tandis que le contrôle d'accès plus intensif (RBAC), plus intensif, vous aide à gérer l'accès en définissant des rôles. Dans RBAC, seuls les utilisateurs ou les tâches système ayant des rôles spécifiques peuvent effectuer des actions spécifiques..

Liste de contrôle d'accès

La liste de contrôle d'accès est parfois appelée également filtre de contrôle d'accès (ACF). Yii fournit un support ACL dans yii \ filters \ AccessControl. Idéal pour les applications nécessitant un contrôle d'accès simple. C'est ce que j'ai utilisé jusqu'à présent dans Meeting Planner..

Voici un exemple de SiteController commun configurant un comportement d'accès pour filtrer l'accès aux actions disponibles, souvent des pages. Dans ce cas, ACL agit sur l'inscription, la connexion et la déconnexion. le '?' indique que tout utilisateur peut accéder aux pages de connexion et d'inscription, alors que le '@' indique que seuls les utilisateurs connectés ou authentifiés sont autorisés à accéder. Dans l'exemple ci-dessous, seuls les utilisateurs connectés peuvent se déconnecter:

utilisez yii \ web \ Controller; utilisez yii \ filters \ AccessControl; La classe SiteController s'étend au contrôleur fonction publique comportement () return ['access' => ['class' => AccessControl :: className (), 'only' => ['login', 'logout', 'signup'], 'rules' => [['allow' => true, 'actions' => ['login', 'inscription'], 'roles' => ['?']],], ['allow' => true, 'actions' => ['logout'], 'rôles' => ['@'],],],],];  //…

À mesure que le contrôleur grandit, chaque nouvelle action doit être définie dans les règles AccessControl. Et, à mesure que votre application se développe, chaque contrôleur et toutes ses actions doivent intégrer le filtrage des listes de contrôle d'accès pour des raisons de sécurité..

Contrôle d'accès basé sur les rôles

Le contrôle d'accès basé sur les rôles (RBAC) fournit un système d'authentification plus robuste mais nécessite également beaucoup plus de conception et de mise en œuvre initiales. 

Avec RBAC, vous définissez l'authentification via des rôles pouvant être hérités (ou non), et vous appliquez des rôles aux utilisateurs. Vous pouvez également définir des règles pour les rôles. Les implémentations RBAC peuvent devenir assez complexes.

Dans la figure ci-dessous, les administrateurs peuvent effectuer toutes les tâches et les auteurs peuvent créer un message et mettre à jour leurs propres messages. Jane est une admin, elle peut donc exécuter les tâches des administrateurs. John n'est qu'un auteur:

Yii implémente ce qu'il appelle "un RBAC hiérarchique général, conforme au modèle RBAC du NIST". La fonctionnalité RBAC est fournie par son composant d'application authManager..

Je n'entrerai pas dans les détails avec RBAC ici, mais j'espère dans un prochain tutoriel. Encore une fois, c’est aux déesses éditoriales qu’il revient de parler avec elles n’est jamais facile:

via PopSugar

Fondamentalement, pour mettre en œuvre minutieusement RBAC, vous devez:

  • définir les rôles et les autorisations
  • établir des relations entre vos rôles et vos autorisations
  • définir les règles existantes
  • associer des règles à vos rôles et autorisations
  • et enfin, attribuer des rôles aux utilisateurs

Vous pouvez voir le code requis pour activer les débuts d'un système RBAC ci-dessous:

authManager; // ajoute la permission "createPost" $ createPost = $ auth-> createPermission ('createPost'); $ createPost-> description = 'Créer une publication'; $ auth-> add ($ createPost); // ajoute la permission "updatePost" $ updatePost = $ auth-> createPermission ('updatePost'); $ updatePost-> description = 'Update post'; $ auth-> add ($ updatePost); // ajoute le rôle "author" et donne à ce rôle l'autorisation "createPost" $ author = $ auth-> createRole ('author'); $ auth-> add ($ author); $ auth-> addChild ($ author, $ createPost); // ajoute le rôle "admin" et donne à ce rôle l'autorisation "updatePost" // ainsi que les autorisations du rôle "auteur" $ admin = $ auth-> createRole ('admin'); $ auth-> add ($ admin); $ auth-> addChild ($ admin, $ updatePost); $ auth-> addChild ($ admin, $ author); // Attribuer des rôles aux utilisateurs. 1 et 2 sont les identifiants retournés par IdentityInterface :: getId () // généralement implémentés dans votre modèle User. $ auth-> assign ($ author, 2); $ auth-> assign ($ admin, 1); 

Pour implémenter RBAC, vous devez être prêt à écrire beaucoup de code au début ou à mesure que votre application se développe. Et, si vous le faites, Yii gérera l'authentification en fonction du cadre d'authentification que vous avez défini. En d’autres termes, la conception et le codage en amont fournissent une authentification solide et détaillée.

Travailler avec des mots de passe

Comme Mark Zuckerberg l’a appris en juin, certains sites Web stockent les mots de passe des utilisateurs en texte brut, mais les vôtres ne le devraient pas; pour être juste envers Zuckerberg, mon compte Facebook a déjà été piraté car PHPList avait fait de même, avant l'époque des gestionnaires de mots de passe. Quoi qu'il en soit, Yii facilite le chiffrement et la vérification sécurisée des mots de passe.

La fonction de cryptage de Yii utilise bcrypt pour générer des hachages pour votre mot de passe. Lors de l'inscription, un hash est créé:

$ hash = Yii :: $ app-> getSecurity () -> generatePasswordHash ($ password);

Ensuite, lorsque l'utilisateur tente de se connecter, il est haché et comparé au hachage de la base de données:

if (Yii :: $ app-> getSecurity () -> validatePassword ($ mot_passe, $ hachage)) // très bien, en se connectant à l'utilisateur else // mot de passe incorrect

Mais vous pouvez également utiliser Yii pour protéger des données avec la cryptographie.

Cryptographie

Le framework Yii fournit un certain nombre de fonctionnalités intégrées pour prendre en charge la protection des données:

  • Fonctions de génération de mots de passe et de clés telles que generateRandomKey, generateRandomString et generateSalt.
  • Validation du mot de passe: generatePasswordHash () et validatePassword ().
  • Cryptage / décryptage: encryptByKey (), decryptByKey (), encryptByPassword () et decryptByPassword ().
  • Dérivation de clé à l'aide d'algorithmes standard: pbkdf2 () et hkdf ().
  • Prévention de la falsification des données: hashData () et validateData ().

Vues de sécurité

Toutes les données provenant d'utilisateurs sont potentiellement infectées par des attaques telles que l'injection SQL ou les scripts inter-navigateurs. Il est important que toutes les données que vous transmettez aux utilisateurs dans les vues soient nettoyées. Yii propose deux méthodes pour cela. 

Tout d'abord, il y a Html :: encode, qui rompt essentiellement tout SQL ou script:

 
nom)?>

Et il existe une intégration avec la bibliothèque HtmlPurifier pour les blocs de texte plus volumineux:

 
texte)?>

Connexion via Auth Client

Yii permet également l'authentification par un tiers, ce qui est particulièrement utile pour prendre en charge la connexion sociale via Google, Facebook, Twitter, etc..

J'ai écrit plusieurs tutoriels pour Envato Tuts + sur l'utilisation d'AuthClient dans le framework Yii avec des connexions sociales:

  • Construire votre démarrage: simplifier Onramp avec AuthClient (en attente de publication)
  • Comment programmer avec Yii2: Authentification Google
  • Comment programmer avec Yii2: Intégration AuthClient avec Twitter, Google et d'autres réseaux

J'ai trouvé que la connexion sociale fonctionne très bien pour Meeting Planner. Les nouveaux utilisateurs peuvent commencer à planifier une réunion sans mot de passe.

Les meilleures pratiques

Yii recommande également une poignée de meilleures pratiques en matière de sécurité des applications Web. Et sa documentation fournit un bon guide sur ces sujets pour quiconque.

  1. Filtrage des entrées et des sorties
  2. Eviter les injections SQL
  3. Éviter les scripts intersites (XSS)
  4. Eviter les falsifications de requêtes intersites (CSRF)
  5. Éviter l'exposition au fichier
  6. Eviter les informations de débogage et les outils lors de la production
  7. Utilisation d'une connexion sécurisée sur TLS

Les trois premiers sujets ci-dessus sont bien gérés par le codage discuté ci-dessus dans Vues de sécurité

Yii fournit également une protection CSRF intégrée pour les activités courantes et peut être désactivée si nécessaire. Dans Meeting Planner, je devais désactiver CSRF pour accepter les messages publiés depuis les services API de Mailgun..

En ce qui concerne l'exposition des fichiers, l'infrastructure permet de minimiser ce problème en canalisant toutes les demandes d'entrée dans le fichier de demande web / index.php. Cela limite grandement le besoin d'écrire du code d'application qui filtre les demandes. C'est bien géré au même endroit.

Enfin, utiliser HTTPS peut vous aider à protéger vos connexions et à utiliser Yii pour protéger les utilisateurs. Plus tôt cette année, j'ai écrit sur Let's Encrypt. Vous pouvez également utiliser ce tutoriel pour installer HTTPS pour les applications Yii..

Vouloir lire plus?

Si vous souhaitez lire des informations plus détaillées sur ces sujets, le framework Yii 1.x propose ces publications. Certes, ils sont plus anciens et moins spécifiques à Yii 2, mais ils restent utiles.

  • Sujets spéciaux: sécurité
  • Comment écrire des applications sécurisées Yii
  • Yii Security-extended guide

En clôture

J'espère que vous avez apprécié mon aperçu de la sécurité pour Yii2. Si vous intégrez des aspects de la plupart ou de la totalité des concepts ci-dessus dans votre application, vous devez disposer d'un service Web fondamentalement sécurisé. Vous voudrez peut-être consulter notre série Construire votre démarrage avec PHP pour une implémentation réelle de certaines de ces pratiques de sécurité.

Surveillez les prochains tutoriels de notre série Programmation avec Yii2 pendant que nous continuons à plonger dans différents aspects du cadre. Je me félicite des demandes de fonctionnalités et de sujets. Vous pouvez les poster dans les commentaires ci-dessous ou m'envoyer un email sur mon site Lookahead Consulting.

Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, suivez-moi @reifman sur Twitter ou consultez ma page d'instructeur. Ma page d’instructeur comprendra tous les articles de cette série dès leur publication.. 

Travaillons ensemble pour garder les déesses éditoriales heureuses.

Liens connexes

  • Yii meilleures pratiques de sécurité
  • Classe de sécurité Yii Base 
  • Yii2 Developer Exchange