Pengaturcaraan Yii2: Keselamatan

PHPz
Lepaskan: 2023-09-05 06:00:01
asal
615 orang telah melayarinya

Pengaturcaraan Yii2: Keselamatan

Jika anda bertanya "Apakah Yii?" 🎜## 🎜🎜#, yang mengkaji kelebihan Yii dan termasuk gambaran keseluruhan Yii 2.0. Dalam siri Pengaturcaraan dengan Yii2 ini, saya akan membimbing pembaca menggunakan rangka kerja PHP Yii2. Jika anda bercadang untuk berkongsi apl anda dengan orang ramai, apl itu perlu selamat dan sebaiknya anda merancangnya dari awal. Nasib baik, bermula dengan rangka kerja seperti Yii menjadikannya lebih mudah daripada rangka kerja lain. Seperti yang dinyatakan dalam Ciri Yii: Yii dilengkapi dengan banyak langkah keselamatan untuk membantu melindungi aplikasi web anda daripada serangan seperti suntikan SQL, skrip merentas tapak (XSS), pemalsuan permintaan merentas tapak (CSRF) dan gangguan kuki.

Dalam tutorial ini, saya akan membimbing anda melalui konsep keselamatan asas dalam rangka kerja aplikasi Yii. Dan, jika anda berminat, memandangkan apl perancang mesyuarat dalam siri pelancaran kami menghampiri alfa, episod akan datang akan dikhususkan untuk memastikan apl itu selamat.

Sebelum kita mula, sila ingat bahawa saya cuba melibatkan diri dalam perbincangan di bawah. Jika anda mempunyai soalan atau cadangan topik, sila tinggalkan komen di bawah atau hubungi saya di Twitter @reifman.

NOTA: Jika anda perasan terdapat jurang antara episod siri "Programming Yii", itu kerana saya terpaksa menjalani pembedahan otak tahun lepas

. Terima kasih atas kesabaran dan sokongan anda - sangat bagus untuk menulis semula dengan kerap dan saya berharap untuk terus membuat liputan Yii2.

Asas Keselamatan Yii Jika anda baharu dalam keselamatan aplikasi web, terdapat banyak perkara yang perlu diketahui tentang produk Yii. Saya akan cuba memberikan gambaran keseluruhan berdasarkan dokumentasi Yii 2.0 yang terbaik. Pasukan Yii membahagikan keselamatan kepada tujuh bidang utama:

PENGENALAN

keizinan
  1. GUNAKAN KATA LALUAN
  2. kriptografi
  3. Lihat keselamatan
  4. Pelanggan Pengesahan
  5. amalan terbaik
  6. Mari kita mula mendalami kandungan ini satu persatu.

1. Pengesahan identiti

Demo Keselamatan Rangka Kerja Yii Ilko Kacharov menyediakan beberapa slaid berguna yang meringkaskan matlamat pengesahan (dan subtopik berikut, kebenaran). Pada asasnya, berikut ialah soalan yang perlu dijawab oleh topik ini:

Siapa pengguna?

Adakah pengguna seperti yang mereka katakan?
  • Adakah pengguna mempunyai kebenaran untuk mengakses sumber?
  • Adakah pengguna mempunyai kebenaran untuk melakukan tindakan?
  • Adakah pengguna mempunyai hak untuk melakukan operasi pada sumber?
  • Model Pengguna dan Antara Muka Identiti
  • Kelas yii/web/User Yii disepadukan dengan yiiwebIdentityInterface untuk mengurus keadaan pengesahan pengguna dalam aplikasi anda.

November lalu, saya menulis tutorial tentang Templat Aplikasi Lanjutan Yii. Salah satu kelebihan templat premium ialah ia menyediakan integrasi pra-bina bagi model Pengguna dengan ActiveRecord dan pangkalan data. Oleh itu, aplikasi anda serta-merta menyediakan pengesahan berasaskan pangkalan data.

Model pengguna membolehkan anda log masuk dan keluar pengguna secara pemrograman:

login() menetapkan identiti yang ditentukan dan mengingati keadaan pengesahan dalam sesi dan kuki.

logout() menandakan pengguna sebagai tetamu dan mengosongkan maklumat berkaitan daripada sesi dan kuki.
  • setIdentity(): Mengubah identiti pengguna tanpa menyentuh sesi atau kuki, paling sesuai untuk kefungsian API.
  • Atribut
  • $isGuest menentukan sama ada pengguna semasa dilog masuk. Ia adalah batal apabila pengguna log keluar, tetapi sebaliknya mengembalikan contoh IdentityInterface.

Pada asasnya, anda memerlukan kelas Pengguna yang memanjangkan ActiveRecord dan melaksanakan kaedah yang menyokong IdentityInterface, seperti ini:

<?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;
    }
}
Salin selepas log masuk

Selain itu, sebelum mencipta pengguna, aplikasi menjana rentetan rawak sebagai kunci kebenaran. Ini boleh digunakan dalam e-mel "terlupa kata laluan" atau pautan log masuk berasaskan e-mel lain:

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;
    }
}
Salin selepas log masuk

keizinan

Yii menyediakan dua kaedah kebenaran terbina dalam. Senarai kawalan akses (ACL) yang lebih mudah menentukan pengguna atau proses yang dibenarkan untuk melaksanakan operasi pada sumber, manakala kawalan akses berasaskan peranan yang lebih intensif (RBAC) membantu anda mengurus akses dengan mentakrifkan peranan. Dalam RBAC, hanya pengguna atau tugas sistem dengan peranan tertentu boleh melaksanakan operasi tertentu.

Senarai Kawalan Akses

ACL kadangkala dipanggil Penapis Kawalan Akses (ACF). Yii menyediakan sokongan ACL dalam yiifiltersAccessControl. Ia sesuai untuk aplikasi yang hanya memerlukan kawalan akses mudah. Inilah yang saya gunakan setakat ini dalam Perancang Mesyuarat.

Berikut ialah contoh SiteController biasa yang mengkonfigurasi gelagat akses untuk menapis akses kepada tindakan yang tersedia (biasanya halaman). Dalam contoh ini, ACL digunakan untuk pendaftaran, log masuk dan log keluar.

bermaksud hanya membenarkan akses kepada pengguna log masuk atau disahkan. Dalam contoh di bawah, hanya pengguna yang log masuk boleh log keluar:

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' => ['@'],
                    ],
                ],
            ],
        ];
    }
    // ...
}
Salin selepas log masuk

随着控制器的增长,每个新操作都需要在访问控制规则中定义。而且,随着应用程序的增长,每个控制器及其所有操作都需要集成 ACL 过滤以确保安全。

基于角色的访问控制

基于角色的访问控制(RBAC)提供了更强大的身份验证系统,但也需要更多的前期设计和实现。

使用 RBAC,您可以通过可以继承(或不可继承)的角色来定义身份验证,并将角色应用于用户。您还可以定义角色规则。 RBAC 实现可能会变得相当复杂。

在下图中,管理员可以执行任何任务,作者可以创建帖子并更新自己的帖子。 Jane 是管理员,因此她可以执行管理员的任务,而 John 只是作者:

Pengaturcaraan Yii2: Keselamatan

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

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

Pengaturcaraan Yii2: Keselamatan

基本上,要彻底实施 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);
    }
}
Salin selepas log masuk

要实现 RBAC,您必须准备好预先编写大量代码,或者随着应用程序的增长而编写大量代码。而且,如果您这样做,Yii 将根据您定义的身份验证框架来管理身份验证。换句话说,预先设计和编码可以提供可靠、详细的身份验证。

使用密码

正如马克·扎克伯格 (Mark Zuckerberg) 在 6 月份了解到的那样,一些网站以纯文本形式存储用户密码,但您的网站不应该这样做;公平地说,在密码管理器时代之前,我的 Facebook 帐户曾经因 PHPList 所做的事情而被黑客入侵过。不管怎样,Yii 使得加密和安全验证密码变得很容易。

Yii 的 crypt 函数使用 bcrypt 为您的密码生成哈希值。当人们注册时,会创建一个哈希值:

$hash = Yii::$app->getSecurity()->generatePasswordHash($password);
Salin selepas log masuk

然后,当用户尝试登录时,它会被散列并与数据库中的散列进行比较:

if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
    // all good, logging user in
} else {
    // wrong password
}
Salin selepas log masuk

但是您也可以使用 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>
Salin selepas log masuk

并且与 HtmlPurifier 库集成以实现更大的文本块:

<?php
use yii\helpers\HtmlPurifier;
?>

<div class="post">
    <?= HtmlPurifier::process($post->text) ?>
</div>
Salin selepas log masuk

通过身份验证客户端登录

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 juga menyediakan perlindungan CSRF terbina dalam untuk aktiviti biasa dan boleh dimatikan apabila diperlukan. Dalam Perancang Mesyuarat, saya perlu mematikan CSRF untuk menerima mesej yang diterbitkan daripada perkhidmatan API Mailgun.

Untuk pendedahan fail, rangka kerja membantu meminimumkan perkara ini dengan memusatkan semua permintaan masuk ke dalam fail permintaan web/index.php. Ini sangat mengehadkan keperluan untuk menulis kod aplikasi yang menapis permintaan. Ia diurus dengan baik di satu tempat.

Akhir sekali, menggunakan HTTPS boleh membantu menjamin sambungan anda dan melindungi pengguna anda dengan Yii. Awal tahun ini, saya menulis artikel tentang Let's Encrypt — anda juga boleh menggunakan tutorial ini untuk memasang HTTPS untuk aplikasi Yii anda.

Nak tahu lebih lanjut?

Jika anda berminat untuk membaca bahan yang lebih terperinci mengenai topik ini, rangka kerja Yii 1.x menyediakan siaran ini. Sudah tentu, mereka lebih tua dan kurang khusus untuk Yii 2, tetapi ia masih berguna.

  • Topik: Keselamatan
  • Cara menulis aplikasi Yii yang selamat
  • Panduan Sambungan Keselamatan Yii

Berakhir

Saya harap anda menikmati gambaran keseluruhan saya tentang keselamatan Yii2. Jika anda menyepadukan aspek kebanyakan atau semua konsep di atas ke dalam aplikasi anda, anda seharusnya mempunyai perkhidmatan web yang pada asasnya selamat. Anda mungkin ingin melihat siri Membina Permulaan Anda dengan PHP kami untuk melihat beberapa amalan keselamatan ini dalam tindakan.

Tonton tutorial yang akan datang dalam siri "Pengaturcaraan dengan Yii2" kami sambil kami terus menyelami pelbagai aspek rangka kerja. Saya mengalu-alukan permintaan ciri dan tema. Anda boleh menyiarkannya dalam ulasan di bawah atau menghantar e-mel kepada saya di laman web Lookahead Consulting saya.

Jika anda ingin tahu bila tutorial Yii2 seterusnya dikeluarkan, ikuti saya di Twitter @reifman atau lihat halaman pengajar saya. Halaman pengajar saya akan segera mengandungi semua artikel daripada siri ini.

Mari kita bekerjasama untuk menggembirakan dewi editorial.

Pautan berkaitan

  • Yii Amalan Keselamatan Terbaik
  • Yii kelas keselamatan asas
  • Mesyuarat Pertukaran Pembangun Yii2

Atas ialah kandungan terperinci Pengaturcaraan Yii2: Keselamatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!