Heim  >  Artikel  >  Backend-Entwicklung  >  Yii2-Programmierung: Sicherheit

Yii2-Programmierung: Sicherheit

PHPz
PHPzOriginal
2023-09-04 23:01:04591Durchsuche

Yii2-Programmierung: Sicherheit

Wenn Sie fragen: „Was ist Yii?“ schauen Sie sich die Yii Framework-Einführung an, die die Vorteile von Yii bespricht und einen Überblick über Yii 2.0 enthält.

In dieser Serie „Programmieren mit Yii2“ werde ich die Leser durch die Verwendung des Yii2-PHP-Frameworks führen. Wenn Sie planen, Ihre App der Öffentlichkeit zugänglich zu machen, muss sie sicher sein, und das sollten Sie am besten von Anfang an einplanen. Glücklicherweise ist dies viel einfacher als bei anderen Frameworks, wenn man mit einem Framework wie Yii beginnt. Wie in Yii Features angegeben:

Yii verfügt über zahlreiche Sicherheitsmaßnahmen, um Ihre Webanwendungen vor Angriffen wie SQL-Injection, Cross-Site-Scripting (XSS), Cross-Site-Request-Forgery (CSRF) und Cookie-Manipulation zu schützen.

In diesem Tutorial werde ich Sie durch grundlegende Sicherheitskonzepte innerhalb des Yii-Anwendungsframeworks führen. Und wenn Sie interessiert sind: Da die Meeting-Planer-App in unserer Einführungsserie kurz vor der Alpha steht, werden sich zukünftige Episoden der Gewährleistung der Sicherheit der App widmen.

Bevor wir beginnen, denken Sie bitte daran, dass ich versuche, mich an der folgenden Diskussion zu beteiligen. Wenn Sie Fragen oder Themenvorschläge haben, hinterlassen Sie bitte unten einen Kommentar oder kontaktieren Sie mich auf Twitter @reifman.

HINWEIS: Wenn Sie bemerken, dass es Lücken zwischen den Episoden der „Programming Yii“-Reihe gibt, liegt das daran, dass ich mich letztes Jahr einer Gehirnoperation unterziehen musste . Vielen Dank für Ihre Geduld und Unterstützung – es ist großartig, wieder regelmäßig zu schreiben, und ich freue mich darauf, weiterhin über Yii2 zu berichten.

Yii-Sicherheitsgrundlagen

Wenn Sie neu in der Webanwendungssicherheit sind, gibt es viel über die Produkte von Yii zu wissen. Ich werde versuchen, einen Überblick basierend auf der besten Yii 2.0-Dokumentation zu geben. Das Yii-Team unterteilt die Sicherheit in sieben Schlüsselbereiche:

  1. Authentifizierung
  2. Autorisierung
  3. Passwort verwenden
  4. Kryptozoologie
  5. Sicherheit anzeigen
  6. Authentifizierungs-Client
  7. Best Practices

Lasst uns damit beginnen, uns nacheinander damit auseinanderzusetzen.

1. Identitätsprüfung

Ilko Kacharovs Yii Framework Security Demo bietet einige nützliche Folien, die die Ziele der Authentifizierung (und das folgende Unterthema, Autorisierung) zusammenfassen. Im Wesentlichen sind hier die Fragen aufgeführt, die diese Themen beantworten müssen:

  • Wer ist der Benutzer?
  • Sind Benutzer die, für die sie sich ausgeben?
  • Hat der Benutzer die Berechtigung, auf die Ressource zuzugreifen?
  • Hat der Benutzer die Berechtigung, eine Aktion auszuführen?
  • Hat der Benutzer die Berechtigung, Vorgänge für die Ressource auszuführen?

Benutzermodell und Identitätsschnittstelle

Yiis yii/web/User-Klasse lässt sich in yiiwebIdentityInterface integrieren, um den Authentifizierungsstatus von Benutzern in Ihrer Anwendung zu verwalten.

Letzten November habe ich ein Tutorial zu Yii Advanced Application Templates geschrieben. Einer der Vorteile der Premium-Vorlage besteht darin, dass sie eine vorgefertigte Integration des Benutzermodells mit ActiveRecord und Datenbanken bietet. Daher stellt Ihre Anwendung sofort eine datenbankgesteuerte Authentifizierung bereit.

Mit dem Benutzermodell können Sie Benutzer programmgesteuert an- und abmelden:

  • login() legt die angegebene Identität fest und merkt sich den Authentifizierungsstatus in Sitzungen und Cookies.
  • logout() markiert den Benutzer als Gast und löscht zugehörige Informationen aus der Sitzung und Cookies.
  • setIdentity(): Ändert die Identität des Benutzers, ohne die Sitzung oder Cookies zu berühren, am besten geeignet für API-Funktionalität.
Das Attribut

$isGuest bestimmt, ob der aktuelle Benutzer angemeldet ist. Es ist null, wenn sich der Benutzer abmeldet, ansonsten wird jedoch eine Instanz von IdentityInterface zurückgegeben.

Im Wesentlichen benötigen Sie eine User-Klasse, die ActiveRecord erweitert und Methoden implementiert, die IdentityInterface unterstützen, etwa so:

<?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;
    }
}

Darüber hinaus generiert die Anwendung vor dem Erstellen eines Benutzers eine zufällige Zeichenfolge als Autorisierungsschlüssel. Dies kann in „Passwort vergessen“-E-Mails oder anderen E-Mail-basierten Anmeldelinks verwendet werden:

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;
    }
}

Autorisierung

Yii bietet zwei integrierte Autorisierungsmethoden. Einfachere Zugriffskontrolllisten (ACLs) legen fest, welche Benutzer oder Prozesse Vorgänge an einer Ressource ausführen dürfen, während intensivere rollenbasierte Zugriffskontrollen (RBAC) Sie bei der Zugriffsverwaltung durch die Definition von Rollen unterstützen. In RBAC können nur Benutzer oder Systemaufgaben mit bestimmten Rollen bestimmte Vorgänge ausführen.

Zugriffskontrollliste

ACLs werden manchmal als Access Control Filters (ACF) bezeichnet. Yii bietet ACL-Unterstützung in yiifiltersAccessControl. Es ist ideal für Anwendungen, die nur eine einfache Zugangskontrolle erfordern. Hier ist, was ich bisher im Meeting Planner verwendet habe.

Das Folgende ist ein Beispiel für einen allgemeinen SiteController, der das Zugriffsverhalten konfiguriert, um den Zugriff auf verfügbare Aktionen (normalerweise Seiten) zu filtern. In diesem Beispiel gelten die ACLs für die Registrierung, Anmeldung und Abmeldung. '?' 表示任何用户都可以访问登录和注册页面,而 '@' bedeutet, dass der Zugriff nur angemeldeten oder authentifizierten Benutzern gestattet ist. Im folgenden Beispiel können sich nur angemeldete Benutzer abmelden:

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 只是作者:

Yii2-Programmierung: Sicherheit

Yii 实现了所谓的“通用分层 RBAC,遵循 NIST RBAC 模型”。 RBAC 功能由其 authManager 应用程序组件提供。

我不会在这里深入探讨 RBAC,但我希望在以后的教程中能够深入探讨。再说一次,这取决于编辑女神——与她们交谈绝非易事:

Yii2-Programmierung: Sicherheit

基本上,要彻底实施 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 框架提供了许多内置功能来支持数据保护:

  • 密码和密钥生成函数,例如generateRandomKey、generateRandomString 和generateSalt。
  • 密码验证:generatePasswordHash() 和 validatePassword()。
  • 加密/解密:encryptByKey()、decryptByKey()、encryptByPassword() 和 decryptByPassword()。
  • 使用标准算法派生密钥:pbkdf2() 和 hkdf()。
  • 防止数据篡改:hashData() 和 validateData()。

查看安全性

来自用户的任何数据都可能受到 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 进行社交登录的教程:

  • 构建您的初创公司:使用 AuthClient 简化入口(待发布
  • 如何使用 Yii2 进行编程:Google 身份验证
  • 如何使用 Yii2 进行编程:AuthClient 与 Twitter、Google 和其他网络集成

我发现社交登录对于会议策划者来说效果非常好。新用户无需密码即可开始安排会议。

最佳实践

Yii 还推荐了一些 Web 应用程序安全方面的最佳实践。它的文档为任何人提供了有关这些主题的良好入门知识。

  1. 过滤输入和输出
  2. 避免 SQL 注入
  3. 避免跨站脚本 (XSS)
  4. 避免跨站请求伪造 (CSRF)
  5. 避免文件泄露
  6. 在生产中避免调试信息和工具
  7. 使用通过 TLS 的安全连接

上面的前三个主题可以通过上面视图安全中讨论的编码得到很好的管理。

Yii bietet außerdem integrierten CSRF-Schutz für allgemeine Aktivitäten und kann bei Bedarf deaktiviert werden. In Meeting Planner muss ich CSRF deaktivieren, um Nachrichten zu akzeptieren, die vom API-Dienst von Mailgun veröffentlicht wurden.

Bei der Offenlegung von Dateien trägt das Framework dazu bei, dies zu minimieren, indem es alle eingehenden Anfragen in der Anfragedatei web/index.php zentralisiert. Dadurch wird die Notwendigkeit, Anwendungscode zum Filtern von Anforderungen zu schreiben, erheblich eingeschränkt. Es ist an einem Ort gut verwaltet.

Schließlich kann die Verwendung von HTTPS dazu beitragen, Ihre Verbindung zu sichern und Ihre Benutzer mit Yii zu schützen. Anfang des Jahres habe ich einen Artikel über Let's Encrypt geschrieben – Sie können dieses Tutorial auch verwenden, um HTTPS für Ihre Yii-Anwendungen zu installieren.

Möchten Sie mehr wissen?

Wenn Sie detaillierteres Material zu diesen Themen lesen möchten, bietet das Yii 1.x-Framework diese Beiträge. Sicher, sie sind älter und weniger spezifisch für Yii 2, aber sie sind immer noch nützlich.

  • Thema: Sicherheit
  • So schreiben Sie sichere Yii-Anwendungen
  • Yii Security Extension Guide

Ende

Ich hoffe, Ihnen hat mein Überblick über die Sicherheit von Yii2 gefallen. Wenn Sie Aspekte der meisten oder aller oben genannten Konzepte in Ihre Anwendung integrieren, sollten Sie über einen grundsätzlich sicheren Webdienst verfügen. Vielleicht möchten Sie sich unsere Reihe „Aufbau Ihres Startups mit PHP“ ansehen, um einige dieser Sicherheitspraktiken in Aktion zu sehen.

Sehen Sie sich die kommenden Tutorials in unserer Reihe „Programmieren mit Yii2“ an, während wir uns weiterhin mit verschiedenen Aspekten des Frameworks befassen. Ich freue mich über Feature- und Theme-Anfragen. Sie können sie unten in den Kommentaren posten oder mir eine E-Mail auf meiner Lookahead Consulting-Website senden.

Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial veröffentlicht wird, folgen Sie mir auf Twitter @reifman oder schauen Sie sich meine Lehrerseite an. Auf meiner Dozentenseite finden Sie ab sofort alle Artikel dieser Serie.

Lasst uns zusammenarbeiten, um die redaktionellen Göttinnen glücklich zu machen.

Verwandte Links

  • Yii Best Security Practices
  • Yii grundlegender Sicherheitskurs
  • Yii2 Developer Exchange Meeting

Das obige ist der detaillierte Inhalt vonYii2-Programmierung: Sicherheit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn