>백엔드 개발 >PHP 튜토리얼 >Yii2 프로그래밍: 보안

Yii2 프로그래밍: 보안

PHPz
PHPz원래의
2023-09-04 23:01:04655검색

Yii2 프로그래밍: 보안

"Yii가 무엇인가요?"라고 묻는다면 Yii의 이점을 검토하고 Yii 2.0의 개요가 포함된 Yii 프레임워크 소개를 확인하세요.

이 Yii2 프로그래밍 시리즈에서는 독자들에게 Yii2 PHP 프레임워크 사용 방법을 안내할 것입니다. 앱을 대중과 공유하려는 경우 보안이 유지되어야 하며 처음부터 이를 계획하는 것이 가장 좋습니다. 운 좋게도 Yii와 같은 프레임워크로 시작하면 다른 프레임워크보다 훨씬 쉽습니다. Yii 기능에 명시된 대로:

Yii에는 SQL 주입, XSS(교차 사이트 스크립팅), CSRF(교차 사이트 요청 위조) 및 쿠키 변조와 같은 공격으로부터 웹 애플리케이션을 보호하는 데 도움이 되는 다양한 보안 조치가 제공됩니다.

이 튜토리얼에서는 Yii 애플리케이션 프레임워크 내의 기본 보안 개념을 안내합니다. 그리고 관심이 있으시면 출시 시리즈의 미팅 플래너 앱이 알파 버전에 가까워짐에 따라 향후 에피소드에서는 앱 보안을 유지하는 데 전념할 것입니다.

시작하기 전에 제가 아래 토론에 참여하려고 노력한다는 점을 기억해 주세요. 질문이나 주제 제안이 있는 경우 아래에 의견을 남기거나 Twitter @reifman으로 저에게 연락하세요.

참고: "프로그래밍 Yii" 시리즈의 에피소드 사이에 공백이 있는 것을 발견했다면 이는 제가 작년에 뇌 수술을 받았기 때문입니다 . 여러분의 인내심과 지원에 감사드립니다. 다시 정기적으로 글을 쓰게 되어 기쁘고 계속해서 Yii2를 다루기를 기대합니다.

Yii 보안 기본

웹 애플리케이션 보안이 처음이라면 Yii의 제품에 대해 알아야 할 것이 많습니다. 나는 최고의 Yii 2.0 문서를 기반으로 개요를 제공하려고 노력할 것입니다. Yii 팀은 보안을 7가지 주요 영역으로 나눕니다.

  1. 인증
  2. 인증
  3. 비밀번호 사용
  4. 암호동물학
  5. 보안 보기
  6. 인증 클라이언트
  7. 모범 사례

이것들을 하나씩 파헤쳐 보겠습니다.

1. 신원 확인

Ilko Kacharov의 Yii 프레임워크 보안 데모는 인증 목표(및 다음 하위 주제인 인증)를 요약하는 몇 가지 유용한 슬라이드를 제공합니다. 기본적으로 이러한 주제에 대해 답변해야 할 질문은 다음과 같습니다.

  • 사용자는 누구인가요?
  • 사용자가 자신이 말하는 그대로인가요?
  • 사용자에게 리소스에 액세스할 수 있는 권한이 있습니까?
  • 사용자에게 작업을 수행할 수 있는 권한이 있나요?
  • 사용자에게 리소스에 대한 작업을 수행할 수 있는 권한이 있습니까?

사용자 모델 및 ID 인터페이스

Yii의 yii/web/User 클래스는 yiiwebIdentityInterface와 통합되어 애플리케이션에서 사용자의 인증 상태를 관리합니다.

지난 11월, 저는 Yii 고급 애플리케이션 템플릿에 대한 튜토리얼을 작성했습니다. 프리미엄 템플릿의 장점 중 하나는 사용자 모델과 ActiveRecord 및 데이터베이스의 사전 구축된 통합을 제공한다는 것입니다. 따라서 애플리케이션은 즉시 데이터베이스 기반 인증을 제공합니다.

사용자 모델을 사용하면 프로그래밍 방식으로 사용자 로그인 및 로그아웃이 가능합니다.

  • login()은 지정된 ID를 설정하고 세션 및 쿠키의 인증 상태를 기억합니다.
  • logout()은 사용자를 손님으로 표시하고 세션 및 쿠키에서 관련 정보를 지웁니다.
  • setIdentity(): 세션이나 쿠키를 건드리지 않고 사용자의 신원을 변경하며, API 기능에 가장 적합합니다.

$isGuest 속성은 현재 사용자가 로그인되어 있는지 여부를 결정합니다. 사용자가 로그아웃하면 null이 되지만 그렇지 않으면 IdentityInterface의 인스턴스가 반환됩니다.

기본적으로 다음과 같이 ActiveRecord를 확장하고 IdentityInterface를 지원하는 메서드를 구현하는 User 클래스가 필요합니다. 으아아아

또한 사용자를 생성하기 전에 애플리케이션은 인증 키로 임의의 문자열을 생성합니다. 이는 "비밀번호 찾기" 이메일이나 기타 이메일 기반 로그인 링크에서 사용할 수 있습니다:

으아아아

인증

Yii는 두 가지 기본 인증 방법을 제공합니다. 보다 단순한 ACL(액세스 제어 목록)은 리소스에 대한 작업을 수행할 수 있는 사용자 또는 프로세스를 결정하는 반면, 보다 집중적인 역할 기반 액세스 제어(RBAC)는 역할을 정의하여 액세스를 관리하는 데 도움이 됩니다. RBAC에서는 특정 역할을 가진 사용자 또는 시스템 작업만 특정 작업을 수행할 수 있습니다.

액세스 제어 목록

ACL은 ACF(액세스 제어 필터)라고도 합니다. Yii는 yiifiltersAccessControl에서 ACL 지원을 제공합니다. 간단한 액세스 제어만 필요한 애플리케이션에 이상적입니다. 지금까지 Meeting Planner에서 사용한 내용은 다음과 같습니다.

다음은 사용 가능한 작업(일반적으로 페이지)에 대한 액세스를 필터링하기 위해 액세스 동작을 구성하는 일반적인 SiteController의 예입니다. 이 예에서 ACL은 등록, 로그인 및 로그아웃에 적용됩니다.

로그인했거나 인증된 사용자에게만 액세스가 허용된다는 의미입니다. 아래 예에서는 로그인한 사용자만 로그아웃할 수 있습니다.

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 프로그래밍: 보안

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

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

Yii2 프로그래밍: 보안

基本上,要彻底实施 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는 또한 일반적인 활동에 대한 내장형 CSRF 보호 기능을 제공하며 필요할 때 끌 수 있습니다. Meeting Planner에서 Mailgun의 API 서비스에서 게시된 메시지를 수락하려면 CSRF를 꺼야 합니다.

파일 노출의 경우 프레임워크는 들어오는 모든 요청을 web/index.php 요청 파일로 중앙 집중화하여 이를 최소화하는 데 도움이 됩니다. 이는 요청을 필터링하는 애플리케이션 코드를 작성해야 하는 필요성을 크게 제한합니다. 한곳에서 잘 관리되고 있어요.

마지막으로 HTTPS를 사용하면 Yii를 통해 연결을 보호하고 사용자를 보호할 수 있습니다. 올해 초 저는 Let's Encrypt에 관한 기사를 썼습니다. 이 튜토리얼을 사용하여 Yii 애플리케이션에 HTTPS를 설치할 수도 있습니다.

더 알고 싶으세요?

이 주제에 대한 더 자세한 자료를 읽고 싶다면 Yii 1.x 프레임워크에서 제공하는 게시물을 참조하세요. 물론, 오래되었고 Yii 2에는 덜 구체적이지만 여전히 유용합니다.

  • 주제: 보안
  • 보안 Yii 애플리케이션 작성 방법
  • Yii 보안 확장 가이드

엔딩

Yii2 보안에 대한 개요가 즐거웠기를 바랍니다. 위 개념의 대부분 또는 전부를 애플리케이션에 통합하는 경우 기본적으로 안전한 웹 서비스를 갖게 됩니다. PHP로 스타트업 구축 시리즈를 확인하여 이러한 보안 사례가 실제로 실행되는 모습을 확인해 보세요.

프레임워크의 다양한 측면을 계속해서 살펴보는 "Yii2 프로그래밍" 시리즈의 튜토리얼을 시청하세요. 기능 및 테마 요청을 환영합니다. 아래 댓글에 게시하거나 내 Lookahead Consulting 웹사이트로 이메일을 보내주세요.

다음 Yii2 튜토리얼이 언제 공개되는지 알고 싶으시면 Twitter @reifman에서 저를 팔로우하시거나 제 강사 페이지를 확인하세요. 내 강사 페이지에는 이 시리즈의 모든 기사가 즉시 포함됩니다.

편집 여신들이 행복할 수 있도록 함께 노력합시다.

관련 링크

  • Yii 최고의 보안 관행
  • 이야 기본보안수업
  • Yii2 개발자 교류회

위 내용은 Yii2 프로그래밍: 보안의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.