Maison > Article > développement back-end > Programmation Yii2 : sécurité
Si vous demandez « Qu'est-ce que Yii ? », consultez la Introduction au cadre Yii, qui passe en revue les avantages de Yii et comprend un aperçu de Yii 2.0.
Dans cette série Programmation avec Yii2, je guiderai les lecteurs dans l'utilisation du framework PHP Yii2. Si vous envisagez de partager votre application avec le public, elle doit être sécurisée, et il est préférable de le planifier dès le départ. Heureusement, commencer avec un framework comme Yii rend cela beaucoup plus facile que d'autres frameworks. Comme indiqué dans Yii Features :
Yii est livré avec de nombreuses mesures de sécurité pour vous aider à protéger vos applications Web contre les attaques telles que l'injection SQL, les scripts intersites (XSS), la falsification de requêtes intersites (CSRF) et la falsification de cookies.
Dans ce tutoriel, je vais vous expliquer les concepts de sécurité de base dans le cadre d'application Yii. Et, si vous êtes intéressé, alors que l'application de planification de réunions de notre série de lancement est proche de l'alpha, les prochains épisodes seront consacrés à assurer la sécurité de l'application.
Avant de commencer, n'oubliez pas que j'essaie de participer à la discussion ci-dessous. Si vous avez des questions ou des suggestions de sujets, veuillez laisser un commentaire ci-dessous ou contactez-moi sur Twitter @reifman.
REMARQUE : Si vous remarquez qu'il y a des écarts entre les épisodes de la série "Programming Yii", c'est parce que j'ai dû subir une opération au cerveau l'année dernière . Merci pour votre patience et votre soutien – c'est formidable d'écrire à nouveau régulièrement et j'ai hâte de continuer à couvrir Yii2.
Si vous débutez dans la sécurité des applications Web, il y a beaucoup à savoir sur les produits Yii. Je vais essayer de fournir un aperçu basé sur la meilleure documentation Yii 2.0. L'équipe Yii divise la sécurité en sept domaines clés :
Commençons à les examiner un par un.
La démonstration de sécurité Yii Framework d'Ilko Kacharov fournit quelques diapositives utiles résumant les objectifs de l'authentification (et le sous-thème suivant, l'autorisation). Essentiellement, voici les questions auxquelles ces sujets doivent répondre :
La classe yii/web/User de Yii s'intègre à yiiwebIdentityInterface pour gérer le statut d'authentification des utilisateurs dans votre application.
En novembre dernier, j'ai écrit un tutoriel sur les modèles d'application avancés Yii. L'un des avantages du modèle premium est qu'il fournit une intégration prédéfinie du modèle User avec ActiveRecord et les bases de données. Par conséquent, votre application fournit immédiatement une authentification basée sur la base de données.
Le modèle utilisateur vous permet de connecter et déconnecter les utilisateurs par programmation :
$isGuest détermine si l'utilisateur actuel est connecté. Il est nul lorsque l'utilisateur se déconnecte, mais renvoie sinon une instance d'IdentityInterface.
Essentiellement, vous avez besoin d'une classe User qui étend ActiveRecord et implémente des méthodes prenant en charge IdentityInterface, comme ceci :
<?php use yii\db\ActiveRecord; use yii\web\IdentityInterface; class User extends ActiveRecord implements IdentityInterface { public static function tableName() { return 'user'; } /** * Finds an identity by the given ID. * * @param string|integer $id the ID to be looked for * @return IdentityInterface|null the identity object that matches the given ID. */ public static function findIdentity($id) { return static::findOne($id); } /** * Finds an identity by the given token. * * @param string $token the token to be looked for * @return IdentityInterface|null the identity object that matches the given token. */ public static function findIdentityByAccessToken($token, $type = null) { return static::findOne(['access_token' => $token]); } /** * @return int|string current user ID */ public function getId() { return $this->id; } /** * @return string current user auth key */ public function getAuthKey() { return $this->auth_key; } /** * @param string $authKey * @return boolean if auth key is valid for current user */ public function validateAuthKey($authKey) { return $this->getAuthKey() === $authKey; } }
De plus, avant de créer un utilisateur, l'application génère une chaîne aléatoire comme clé d'autorisation. Cela peut être utilisé dans les e-mails de « mot de passe oublié » ou dans d'autres liens de connexion par e-mail :
class User extends ActiveRecord implements IdentityInterface { ...... public function beforeSave($insert) { if (parent::beforeSave($insert)) { if ($this->isNewRecord) { $this->auth_key = \Yii::$app->security->generateRandomString(); } return true; } return false; } }
Yii fournit deux méthodes d'autorisation intégrées. Des listes de contrôle d'accès (ACL) plus simples déterminent quels utilisateurs ou processus sont autorisés à effectuer des opérations sur une ressource, tandis que des contrôles d'accès basés sur les rôles (RBAC) plus intensifs vous aident à gérer l'accès en définissant des rôles. Dans RBAC, seuls les utilisateurs ou les tâches système dotés de rôles spécifiques peuvent effectuer des opérations spécifiques.
Les ACL sont parfois appelées filtres de contrôle d'accès (ACF). Yii fournit la prise en charge des ACL dans yiifiltersAccessControl. Il est idéal pour les applications qui nécessitent uniquement un contrôle d'accès simple. Voici ce que j’ai utilisé jusqu’à présent dans Meeting Planner.
Ce qui suit est un exemple de SiteController commun qui configure le comportement d'accès pour filtrer l'accès aux actions disponibles (généralement des pages). Dans cet exemple, les ACL s'appliquent à l'enregistrement, à la connexion et à la déconnexion. '?'
表示任何用户都可以访问登录和注册页面,而 '@'
signifie que l'accès n'est autorisé qu'aux utilisateurs connectés ou authentifiés. Dans l'exemple ci-dessous, seuls les utilisateurs connectés peuvent se déconnecter :
use yii\web\Controller; use yii\filters\AccessControl; class SiteController extends Controller { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['login', 'logout', 'signup'], 'rules' => [ [ 'allow' => true, 'actions' => ['login', 'signup'], 'roles' => ['?'], ], [ 'allow' => true, 'actions' => ['logout'], 'roles' => ['@'], ], ], ], ]; } // ... }
随着控制器的增长,每个新操作都需要在访问控制规则中定义。而且,随着应用程序的增长,每个控制器及其所有操作都需要集成 ACL 过滤以确保安全。
基于角色的访问控制(RBAC)提供了更强大的身份验证系统,但也需要更多的前期设计和实现。
使用 RBAC,您可以通过可以继承(或不可继承)的角色来定义身份验证,并将角色应用于用户。您还可以定义角色规则。 RBAC 实现可能会变得相当复杂。
在下图中,管理员可以执行任何任务,作者可以创建帖子并更新自己的帖子。 Jane 是管理员,因此她可以执行管理员的任务,而 John 只是作者:
Yii 实现了所谓的“通用分层 RBAC,遵循 NIST RBAC 模型”。 RBAC 功能由其 authManager 应用程序组件提供。
我不会在这里深入探讨 RBAC,但我希望在以后的教程中能够深入探讨。再说一次,这取决于编辑女神——与她们交谈绝非易事:
基本上,要彻底实施 RBAC,您必须:
您可以在下面看到启用 RBAC 系统所需的代码:
<?php namespace app\commands; use Yii; use yii\console\Controller; class RbacController extends Controller { public function actionInit() { $auth = Yii::$app->authManager; // add "createPost" permission $createPost = $auth->createPermission('createPost'); $createPost->description = 'Create a post'; $auth->add($createPost); // add "updatePost" permission $updatePost = $auth->createPermission('updatePost'); $updatePost->description = 'Update post'; $auth->add($updatePost); // add "author" role and give this role the "createPost" permission $author = $auth->createRole('author'); $auth->add($author); $auth->addChild($author, $createPost); // add "admin" role and give this role the "updatePost" permission // as well as the permissions of the "author" role $admin = $auth->createRole('admin'); $auth->add($admin); $auth->addChild($admin, $updatePost); $auth->addChild($admin, $author); // Assign roles to users. 1 and 2 are IDs returned by IdentityInterface::getId() // usually implemented in your User model. $auth->assign($author, 2); $auth->assign($admin, 1); } }
要实现 RBAC,您必须准备好预先编写大量代码,或者随着应用程序的增长而编写大量代码。而且,如果您这样做,Yii 将根据您定义的身份验证框架来管理身份验证。换句话说,预先设计和编码可以提供可靠、详细的身份验证。
正如马克·扎克伯格 (Mark Zuckerberg) 在 6 月份了解到的那样,一些网站以纯文本形式存储用户密码,但您的网站不应该这样做;公平地说,在密码管理器时代之前,我的 Facebook 帐户曾经因 PHPList 所做的事情而被黑客入侵过。不管怎样,Yii 使得加密和安全验证密码变得很容易。
Yii 的 crypt 函数使用 bcrypt 为您的密码生成哈希值。当人们注册时,会创建一个哈希值:
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);
然后,当用户尝试登录时,它会被散列并与数据库中的散列进行比较:
if (Yii::$app->getSecurity()->validatePassword($password, $hash)) { // all good, logging user in } else { // wrong password }
但是您也可以使用 Yii 通过加密来保护数据。
Yii 框架提供了许多内置功能来支持数据保护:
来自用户的任何数据都可能受到 SQL 注入或跨浏览器脚本等攻击的感染。重要的是,您在视图中输出给用户的任何数据都应该被清理。 Yii 为此提供了几种方法。
首先,有 Html::encode
,它基本上破坏了任何 SQL 或脚本:
<?php use yii\helpers\Html; ?> <div class="username"> <?= Html::encode($user->name) ?> </div>
并且与 HtmlPurifier 库集成以实现更大的文本块:
<?php use yii\helpers\HtmlPurifier; ?> <div class="post"> <?= HtmlPurifier::process($post->text) ?> </div>
Yii 还提供了第三方身份验证的功能,这对于支持通过 Google、Facebook、Twitter 等进行社交登录尤其有用。
我为 Envato Tuts+ 编写了几篇关于在 Yii 框架内使用 AuthClient 进行社交登录的教程:
我发现社交登录对于会议策划者来说效果非常好。新用户无需密码即可开始安排会议。
Yii 还推荐了一些 Web 应用程序安全方面的最佳实践。它的文档为任何人提供了有关这些主题的良好入门知识。
上面的前三个主题可以通过上面视图安全中讨论的编码得到很好的管理。
Yii fournit également une protection CSRF intégrée pour les activités courantes et peut être désactivée en cas de besoin. Dans Meeting Planner, je dois désactiver CSRF pour accepter les messages publiés depuis le service API de Mailgun.
Pour l'exposition des fichiers, le framework permet de minimiser cela en centralisant toutes les requêtes entrantes dans le fichier de requête web/index.php. Cela limite considérablement la nécessité d'écrire du code d'application qui filtre les requêtes. C'est bien géré en un seul endroit.
Enfin, l'utilisation de HTTPS peut aider à sécuriser votre connexion et à protéger vos utilisateurs avec Yii. Plus tôt cette année, j'ai écrit un article sur Let's Encrypt — vous pouvez également utiliser ce didacticiel pour installer HTTPS pour vos applications Yii.
Si vous souhaitez lire des documents plus détaillés sur ces sujets, le framework Yii 1.x propose ces articles. Bien sûr, ils sont plus anciens et moins spécifiques à Yii 2, mais ils sont toujours utiles.
J'espère que vous avez apprécié mon aperçu de la sécurité de Yii2. Si vous intégrez des aspects de la plupart ou de la totalité des concepts ci-dessus dans votre application, vous devriez disposer d'un service Web fondamentalement sécurisé. Vous voudrez peut-être consulter notre série Construire votre startup avec PHP pour voir certaines de ces pratiques de sécurité en action.
Regardez les prochains didacticiels de notre série « Programmation avec Yii2 » alors que nous continuons à nous plonger dans différents aspects du framework. J’accepte les demandes de fonctionnalités et de thèmes. Vous pouvez les publier dans les commentaires ci-dessous ou m'envoyer un e-mail sur mon site Lookahead Consulting.
Si vous souhaitez savoir quand le prochain tutoriel Yii2 sortira, suivez-moi sur Twitter @reifman ou consultez ma page instructeur. Ma page instructeur contiendra immédiatement tous les articles de cette série.
Travaillons ensemble pour rendre heureuses les déesses de la rédaction.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!