목차
您可能感兴趣的文章:
백엔드 개발 PHP 튜토리얼 Yii2의 시나리오 및 검증 규칙에 대한 자세한 설명

Yii2의 시나리오 및 검증 규칙에 대한 자세한 설명

Jun 30, 2018 pm 06:04 PM
yii2 만들다

Yii2의 규칙은 모델 속성을 검증하는 데 사용됩니다. 시나리오 사용자는 다양한 시나리오에서 검증해야 하는 모델을 정의합니다. 다음 글에서는 Yii2의 시나리오(시나리오) 및 검증 규칙(규칙)에 대한 관련 정보를 주로 소개합니다. . 기사에는 샘플 코드를 통한 소개가 매우 자세하게 나와 있어 도움이 필요한 친구들이 참고할 수 있습니다.

머리말

Scene은 이름에서 알 수 있듯이 상황, 장면입니다. Yii2에는 여러분이 이해하는 장면과 비슷한 의미를 갖는 장면도 있습니다.

사용자와 상호작용하는 시스템의 필수 기능에는 사용자 데이터 수집, 검증 및 처리가 포함됩니다. 실제 비즈니스에서는 데이터를 지속적으로 저장해야 하는 경우가 많습니다. 보안상의 이유로 개발자는 "클라이언트의 입력은 신뢰할 수 없다"는 원칙을 확실히 이해해야 합니다. 클라이언트가 전달한 데이터는 내부 시스템에 저장되거나 전송되기 전에 필터링되고 정리됩니다.

Yii2에서는 사용자 데이터를 수집하고 확인하기 위해 Model 클래스를 사용할 것을 권장하며, 영구 ActiveRecord 클래스는 해당 하위 클래스입니다. Model 클래스의 load 및 verify 메서드는 각각 클라이언트 데이터를 수집하고 확인하는 데 사용됩니다. 어떤 데이터를 수집해야 하고 어떤 데이터를 검증해야 하는지 이 글의 주제는 어떤 시나리오입니다: 시나리오와 검증 규칙.

아래에는 별로 할 말이 없지만, 편집자의 설명을 따라가며 자세한 소개를 살펴보겠습니다.

시스템 구조

먼저 간단한 비즈니스 시스템을 소개합니다. 시스템에는 학생과 교사의 두 가지 역할이 있으며 역할 정보를 저장하기 위해 데이터베이스에서 세 개의 테이블이 사용됩니다:

사용자: [id, 사용자 이름, 비밀번호, 상태, 기타 공통 속성]

student: [id, user_id, Student_no, grade, class, 기타 학생 속성]

teacher: [id, user_id, work_no, title, 전화, 기타 교사 속성]

실제 업무는 이 세 테이블의 추가, 삭제, 쿼리, 수정 작업에 국한되지 않습니다. 문제를 단순화하기 위해 나중에 user 테이블과 Student 테이블의 데이터 변경 사항만 다루도록 하겠습니다. ( Teacher 테이블은 독자들이 데이터베이스를 설계한 사람이 멍청하다고 생각하지 않도록 제공됩니다. 하나의 테이블에 넣을 수 있습니다. , 왜 분리해야합니까!).

학생등록

학생등록은 추가, 삭제, 확인, 수정, 포인트 발송 등의 일반적인 작업입니다. 학생 등록을 위한 간략한 코드 예시는 다음과 같습니다.

public function actionSignup()
{
 $data = Yii::$app->request->post();
 $user = new User();
 $user->load($data);
 if ($user->save()) {
  $student = new Student([
   "user_id" => $user->id,
  ]);
  $student->load($data);
  if ($student->save()) {
   // redirect to success page
  } else {
   $user->delete();
  }
 }
 // render error page
}
로그인 후 복사

Yii2를 사용해 본 경험이 있는 사람이라면 누구나 데이터베이스의 필드 제약 조건을 기반으로 User 및 Student 클래스의 규칙 메서드를 빠르게 작성할 수 있다고 믿습니다. 예를 들어 User 클래스 파일의 내용은 다음과 같을 수 있습니다.

namespace app\models;
class User extends \yii\db\ActiveRecord
{
 public function rules()
 {
  return [   [["username", "password", "status",], "required"],
   ["username", "unique"],
   // other rules
  ];
 }
 // other method
}
로그인 후 복사

데이터에 대한 유효성 검사 규칙을 정의합니다. 이는 대부분의 사람들이 규칙에 대해 갖는 첫인상이며 좋은 인상입니다. 불법 데이터를 정상적인 데이터로 만들어 시스템에 입력합니다. 보안 관행은 완전한 규칙을 정의하고 데이터를 완전히 검증하도록 노력해야 합니다. 또한 모든 Yii2 개발자는 내장된 핵심 유효성 검사기에 익숙해지는 것이 좋습니다.

정보 수정

정보 수정도 일반적인 추가, 삭제, 확인, 수정 작업입니다. 구현 코드와 등록에는 큰 차이가 없습니다. 여기서는 두 가지 사항만 논의합니다.

1. 사용자 비밀번호 확인

등록 시 사용자 비밀번호가 8~16자리인지 확인됩니다. 규칙은 다음과 같습니다: ["password", "string", "length" => [8, 16]] . 비밀번호를 일반 텍스트로 저장하는 것은 바람직하지 않습니다. 데이터베이스에 삽입할 때 최소한 MD5 암호화가 수행되고 비밀번호는 32비트가 됩니다. 사용자가 정보 수정 시 비밀번호를 변경하지 않았다고 가정하고 다시 저장하면 비밀번호 규칙 확인 오류가 발생하여(길이가 일치하지 않음) 저장할 수 없습니다! ["password", "string", "length" => [8, 16]] 。明文保存密码是不可取的,插入数据库时至少会做MD5加密,password变成32位。假设用户修改信息时未修改密码,再次保存时密码规则校验出错(长度不符合),无法保存!

怎么解决这个问题呢?翻阅Yii文档,发现了规则中的when属性可以救场。一种可能的验证规则是:

public function rules()
{
 return [
   ["password", "string", "length" => [8, 16], 'when' => function ($model) {
    return $model->isNewRecord;
   }],
   // other rules
  ];
로그인 후 복사

只有在注册(新增数据)时才校验密码字段。问题解决,完美!

2、防止用户私自改密码

假设有个小聪明的家伙(例如汤姆),发现系统是用Yii框架做的,想搞点小破坏炫耀一下水平。在发送修改信息的表单时,汤姆增加&password=12345678这一段数据。系统使用$user->load($data)

이 문제를 해결하는 방법은 무엇입니까? Yii 문서를 살펴보면서 규칙의 when 속성이 도움이 될 수 있다는 것을 발견했습니다. 가능한 확인 규칙 중 하나는 다음과 같습니다.

unset($data["password"]); 
$user->load($data);
// 或者
$password = $user->password;
$user->load($data);
$user->password = $password;
로그인 후 복사

등록(새 데이터)할 때만 비밀번호 필드를 확인하세요. 문제가 해결되었습니다. 완벽해요!

2. 사용자가 비공개로 비밀번호를 변경하지 못하도록 방지

🎜🎜 시스템이 Yii 프레임워크를 사용하여 구축되었음을 발견하고 자신의 기술을 과시하기 위해 약간의 피해를 입히고 싶어하는 똑똑한 사람(예: Tom)이 있다고 가정해 보겠습니다. 정보를 수정하기 위해 양식을 보낼 때 Tom은 &password=12345678을 추가합니다. 시스템은 $user->load($data)를 사용하여 사용자 입력을 수집하고 비밀번호 필드를 업데이트합니다. 이로 인해 다음과 같은 결과가 발생합니다. 규칙 설정이 업데이트될 때 비밀번호 필드가 확인되지 않습니다. 12345678은 데이터베이스에 비밀번호 값으로 직접 저장됩니다. 이 작업은 연쇄 반응을 일으켰습니다. 사용자가 다시 로그인했을 때 암호화된 비밀번호가 데이터베이스의 일반 텍스트 비밀번호와 일치하지 않아 Tom이 시스템에 로그인할 수 없게 되었습니다. 짜증나는 점은 톰이 로그인이 안된 후 하루종일 고객센터를 괴롭힌다는 것인데 그게 쉽지 않더라구요! 🎜🎜이런 상황이 발생하지 않도록 하려면 어떻게 해야 하나요? 한 가지 해결책은 비밀번호 변경을 방지하는 것입니다. 🎜🎜🎜
$form = new UpdateInfoForm();
$form->load($data);
if ($form->validate()) {
 $user->load($form->attributes);
 $student->load($form->attributes);
 // next biz
}
로그인 후 복사
로그인 후 복사
🎜🎜🎜 사용자가 입력한 비밀번호를 필터링하면 비공개로 비밀번호를 변경하는 문제가 해결됩니다. 🎜🎜하지만 문제는 아직 끝나지 않았습니다. Tom은 성별, 신분증 등과 같은 다른 필드를 수정할 수 있습니다. 더 심각한 상황은 학생의 user_id를 수정하면 모든 학생의 정보를 변경할 수 있다는 것입니다. 문제는 심각하므로 취약점을 즉시 수정해야 합니다. 🎜

可以按照密码的方法,逐个屏蔽受保护属性,但显得啰嗦难看(虽然好使)。如果受保护属性多,可以仅允许白名单进入,具体操作为:新增一个UpdateInfoForm类继承Model,属性是白名单属性合计。用UpdateInfoForm类过滤用户数据,校验通过后再更新到user和student中:

$form = new UpdateInfoForm();
$form->load($data);
if ($form->validate()) {
 $user->load($form->attributes);
 $student->load($form->attributes);
 // next biz
}
로그인 후 복사
로그인 후 복사

这种方式更优雅,但仔细一想代价不小:属性和验证规则要重复写一遍;user和student保存时又重复校验属性。这种方式看起来优雅,实际上却冗余又低效。

scenario的登场,完美的解决解决上述问题。

场景(scenario)

分析上面问题,会发现关键点是批量赋值(massive assignment)和数据校验(validate)两个方法。如果对不同的场景指定赋值字段和检验规则,问题就迎刃而解。

Yii中的scenario有 安全属性 和 活跃属性 两个概念。安全属性用在批量赋值的load方法,只有安全属性才能被赋值;活跃属性用在规则校验的validate方法,在活跃属性集中并且定义了校验规则的属性才会被校验。活跃属性和安全属性的关系是,安全属性是活跃属性的子集。

\yii\base\Model类定义了默认场景:SCENARIO_DEFAULT(值为default)。默认场景下,出现在rules方法中的属性既是活跃属性,又是安全属性(这句话基本正确,看后续解释)。为不同场景指定活跃属性、安全属性以及校验器,可以通过覆盖senarios或rules两个方法实现(几乎每个Model类都会重写rules方法,senarios用得少)。

rules

先看rules方法。默认的属性加校验器定义方式,让每个属性既是安全属性,也是活跃属性。如果想让某个属性不是安全属性(不能通过load批量赋值),在属性名前加感叹号!即可。例如student中的user_id字段:

public function rules()
{
 return [
  ["!user_od", "required"],
  ["!user_id", "integer"],
  ["!user_od", "unique"],
  // other rules
 ];
}
로그인 후 복사

user_id是活跃属性,在写入数据库时会被校验。但它不是安全属性,不能通过load方法进行赋值,解决了安全隐患。

再看rules方法按场景区分校验器规则的做法:定义校验器时on属性指定规则在哪些场景下生效,except属性则排除一些场景(如果不指定on和except,规则对所有场景生效)。例如:

public function rules()
{
 return [
  ["password", "string", "length" => [8, 16], "on" => ["signup"]], // 仅在signup场景时才被验证
  ["status", "integer", "except" => ["signup"], // 除了signup场景,其他情况都校验
  // other rules
 ];
}
로그인 후 복사

在原来基础上新增感叹号和on/except属性,非常简便的就定义了非安全属性以及分场景指定校验规则。

scenarios

另外一种更清晰定义安全属性和活跃属性的做法是重写scenarios方法。scenarios方法返回一个数组,数组的键是场景名称,值是活跃属性集合(包饭安全属性)。例如student表的可能实现如下:

public function scenarios()
{
 return [
  self::SCENARIO_DEFAULT => ["!user_id", "grade", "class", xxxx],
  "update" => ["grade", "class", xxxx],
 ];
}
로그인 후 복사

默认情形下(学生报名),年级、班级这些信息是安全属性,但user_id不是,只能在程序内部赋值,并在插入数据时被校验;在修改信息时,user_id不是活跃属性,既不能被批量赋值,也不需要校验(事实上它不应该改变)。

scenarios方法只能定义活跃属性和安全属性,无法定义校验规则,需要和rules配合使用。

总结

金肯定义完善的数据校验规则

业务复杂时定义多个场景,仔细为每个场景定义安全属性和校验规则

优先使用rules;属性较多、rules复杂时,可以配合scenarios方法迅速理清安全属性和活跃属性

参考

http://www.yiiframework.com/doc-2.0/guide-input-validation.html

您可能感兴趣的文章:

MixPHP、Yii和CodeIgniter的并发压力测试的小结

PHP基于非递归算法实现先序、中序及后序遍历二叉树操作的示例

PHP使用两个栈实现队列功能的方法的讲解

위 내용은 Yii2의 시나리오 및 검증 규칙에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python에서 누적 곡선 그래프를 만드는 방법은 무엇입니까? Python에서 누적 곡선 그래프를 만드는 방법은 무엇입니까? Aug 23, 2023 pm 08:33 PM

ogive 그래프는 누적 빈도 곡선이라고도 하는 데이터 집합의 누적 분포 함수(CDF)를 그래픽으로 나타냅니다. 데이터 분포를 조사하고 패턴과 추세를 발견하는 데 사용됩니다. Matplotlib, Pandas 및 Numpy는 멋진 그래픽을 생성하기 위해 Python에서 제공하는 라이브러리 및 도구 중 일부입니다. 이 튜토리얼에서는 Matplotlib을 사용하여 Python에서 ogive 그래픽을 생성하는 방법을 살펴보겠습니다. 누적 곡선 차트를 생성하려면 필수 라이브러리를 가져와야 합니다. 이 예에서는 Matplotlib, Pandas 및 Numpy를 사용합니다. Matplotlib는 Python에서 생성하기 위한 널리 사용되는 데이터 시각화 라이브러리입니다.

Python에서 상수를 만드는 방법은 무엇입니까? Python에서 상수를 만드는 방법은 무엇입니까? Aug 29, 2023 pm 05:17 PM

상수와 변수는 프로그래밍에서 데이터 값을 저장하는 데 사용됩니다. 변수는 일반적으로 시간이 지남에 따라 변경될 수 있는 값을 나타냅니다. 상수는 프로그램 실행 중에 값을 변경할 수 없는 변수 유형입니다. Python에서 사용할 수 있는 내장 상수는 6개뿐입니다. 이는 False, True, None, NotImplemented, Ellipsis(...) 및 __debug__입니다. 이러한 상수 외에도 Python에는 상수 값을 저장하는 내장 데이터 유형이 없습니다. 예 상수의 예는 아래에 설명되어 있습니다. False=100 출력 SyntaxError:cannotsigntoFalseFalse는 부울 값을 저장하는 데 사용되는 Python의 내장 상수입니다.

최신 iOS 17에서 iPhone을 개인화하는 방법 최신 iOS 17에서 iPhone을 개인화하는 방법 Sep 21, 2023 am 08:17 AM

iPhone에서 통화를 개인화하는 방법 Apple의 iOS 17에는 iPhone의 통화 화면 모양을 개인화할 수 있는 연락처 포스터라는 새로운 기능이 도입되었습니다. 이 기능을 사용하면 선택한 사진, 색상, 글꼴, 미모티콘을 연락처 카드로 사용하여 포스터를 디자인할 수 있습니다. 따라서 전화를 걸면 사용자 정의 이미지가 수신자의 iPhone에 예상한 대로 정확하게 표시됩니다. 저장된 모든 연락처와 고유한 연락처 포스터를 공유하도록 선택하거나 이를 볼 수 있는 사람을 선택할 수 있습니다. 마찬가지로, 통화 중에 다른 사람의 연락처 포스터도 볼 수 있습니다. 또한 Apple에서는 개별 연락처에 대한 특정 연락처 사진을 설정하여 해당 연락처에서 전화를 걸 수 있습니다.

김프에서 픽셀 아트를 만드는 방법 김프에서 픽셀 아트를 만드는 방법 Feb 19, 2024 pm 03:24 PM

Windows에서 픽셀 아트 제작을 위해 김프를 사용하는 데 관심이 있다면 이 기사가 흥미로울 것입니다. GIMP는 무료 오픈 소스일 뿐만 아니라 사용자가 아름다운 이미지와 디자인을 쉽게 만들 수 있도록 도와주는 잘 알려진 그래픽 편집 소프트웨어입니다. 초보자와 전문 디자이너 모두에게 적합할 뿐만 아니라, 김프는 그리기와 창작을 위한 유일한 구성 요소로 픽셀을 활용하는 디지털 아트의 한 형태인 픽셀 아트를 만드는 데에도 사용할 수 있습니다. 김프에서 픽셀 아트를 만드는 방법 Windows PC에서 김프를 사용하여 픽셀 그림을 만드는 주요 단계는 다음과 같습니다. 김프를 다운로드하여 설치한 다음 응용 프로그램을 시작합니다. 새 이미지를 만듭니다. 너비와 높이의 크기를 조정합니다. 연필 도구를 선택합니다. 브러시 유형을 픽셀로 설정합니다. 설정

Gree+로 가족을 만드는 방법 Gree+로 가족을 만드는 방법 Mar 01, 2024 pm 12:40 PM

많은 친구들이 Gree+ 소프트웨어에서 가족을 만드는 방법을 알고 싶다고 말했습니다. 자세한 내용을 알고 싶은 친구들은 저와 함께 살펴보세요. 먼저 휴대폰에서 Gree+ 소프트웨어를 열고 로그인하세요. 그런 다음 페이지 하단의 옵션 표시줄에서 맨 오른쪽에 있는 "내" 옵션을 클릭하여 개인 계정 페이지로 들어갑니다. 2. 내 페이지에 접속한 후 "가족" 아래에 "가족 만들기" 옵션이 있습니다. 찾은 후 클릭하여 들어갑니다. 3. 다음으로 가족을 생성하는 페이지로 이동하여 프롬프트에 따라 입력 상자에 설정할 가족 이름을 입력하고 입력 후 오른쪽 상단의 "저장" 버튼을 클릭합니다. 4. 마지막으로 페이지 하단에 "저장 성공" 메시지가 나타나 패밀리가 성공적으로 생성되었음을 나타냅니다.

Python을 통해 사용자 인터페이스를 만드는 방법은 무엇입니까? Python을 통해 사용자 인터페이스를 만드는 방법은 무엇입니까? Aug 26, 2023 am 09:17 AM

이번 글에서는 Python을 사용하여 사용자 인터페이스를 만드는 방법을 알아봅니다. 그래픽 사용자 인터페이스란 무엇입니까? "그래픽 사용자 인터페이스"(또는 "GUI")라는 용어는 정보를 표시하고 상호 작용하기 위해 컴퓨터 소프트웨어에서 상호 작용할 수 있는 일련의 시각적 요소 항목을 의미합니다. 사람의 입력에 따라 객체는 색상, 크기, 가시성과 같은 모양 특성을 변경할 수 있습니다. 아이콘, 커서 및 버튼과 같은 그래픽 구성 요소는 오디오 또는 시각적 효과(예: 투명도)를 통해 향상되어 그래픽 사용자 인터페이스(GUI)를 만들 수 있습니다. 더 많은 사람들이 귀하의 플랫폼을 사용하기를 원한다면, 귀하의 플랫폼이 좋은 사용자 인터페이스를 가지고 있는지 확인해야 합니다. 이러한 요소들의 조합이 앱이나 웹사이트에서 제공하는 서비스 품질에 큰 영향을 미칠 수 있기 때문입니다. Python은 다음과 같은 기능을 제공하므로 개발자가 널리 사용합니다.

Realme Phone에서 폴더를 만드는 방법은 무엇입니까? Realme Phone에서 폴더를 만드는 방법은 무엇입니까? Mar 23, 2024 pm 02:30 PM

제목: Realme Phone 초보자 가이드: Realme Phone에서 폴더를 만드는 방법은 무엇입니까? 현대 사회에서 휴대폰은 사람들의 삶에 없어서는 안 될 도구가 되었습니다. 인기 스마트폰 브랜드인 Realme Phone은 간단하고 실용적인 운영 체제로 사용자들에게 사랑을 받고 있습니다. Realme 휴대폰을 사용하는 과정에서 많은 사람들이 휴대폰에 있는 파일과 애플리케이션을 정리해야 하는 상황에 직면할 수 있는데, 폴더를 만드는 것이 효과적인 방법입니다. 이 기사에서는 사용자가 휴대폰 콘텐츠를 더 잘 관리할 수 있도록 Realme 휴대폰에서 폴더를 만드는 방법을 소개합니다. 아니요.

iPhone용 연락처 포스터를 만드는 방법 iPhone용 연락처 포스터를 만드는 방법 Mar 02, 2024 am 11:30 AM

iOS17에서 Apple은 일반적으로 사용되는 전화 및 연락처 앱에 연락처 포스터 기능을 추가했습니다. 이 기능을 통해 사용자는 각 연락처에 대해 개인화된 포스터를 설정할 수 있어 주소록을 더욱 시각적이고 개인적으로 만들 수 있습니다. 연락처 포스터는 사용자가 특정 연락처를 더 빠르게 식별하고 찾는 데 도움이 되어 사용자 경험을 향상시킵니다. 이 기능을 통해 사용자는 자신의 선호도와 요구 사항에 따라 각 연락처에 특정 사진이나 로고를 추가할 수 있어 주소록 인터페이스가 더욱 생생해집니다. iOS17의 Apple은 iPhone 사용자에게 자신을 표현하는 새로운 방법을 제공하고 개인화 가능한 연락처 포스터를 추가했습니다. 연락처 포스터 기능을 사용하면 다른 iPhone 사용자에게 전화할 때 고유하고 개인화된 콘텐츠를 표시할 수 있습니다. 너

See all articles