라 라벨에서“대량 할당”이란 무엇입니까?


159

Eloquent ORM 주제 부분에 대해 Laravel Document를 살펴볼 때 새로운 용어가 생겼습니다 Mass Assignment.

문서 쇼는 어떻게 대량 할당과해야 할 일 fillable이나 guarded속성을 설정합니다. 그러나 그 과정을 거친 후에는 Mass Assignment그것이 어떻게 작동하는지 명확하게 이해하지 못했습니다 .

CodeIgniter에서의 과거 경험에서 나는이 용어에 대해 듣지 못했습니다.

누구든지 그것에 대해 간단한 설명이 있습니까?


답변:


206

대량 할당은 모델 생성에 배열을 보낼 때입니다. 기본적으로 모델에서 여러 필드를 하나씩 이동하는 대신 한 번에 하나씩 설정합니다.

$user = new User(request()->all());

(이것은 모델의 각 값을 명시 적으로 설정하는 것이 아닙니다.)

fillable실제로 업데이트 할 필드를 보호 할 수 있습니다 .

다음을 수행하여 모든 필드의 대량 할당을 차단할 수도 있습니다.

protected $guarded = ['*'];

사용자 테이블 user_type에 user / admin 값을 가질 수 있는 필드가 있다고 가정 해 봅시다.

분명히, 사용자가이 값을 업데이트하지 못하게하려는 것입니다. 이론적으로 위의 코드를 사용하면 누군가가 양식에 새 필드를 삽입 user_type하고 다른 양식 데이터와 함께 'admin'을 보내고 계정을 관리자 계정으로 쉽게 전환 할 수 있습니다 ... 나쁜 소식입니다.

추가하여:

$fillable = ['name', 'password', 'email'];

다음 값을 사용하여 해당 값만 업데이트 할 수 있습니다 mass assignment

user_type값 을 업데이트하려면 다음 과 같이 모델에 명시 적으로 값을 설정하고 저장해야합니다.

$user->user_type = 'admin';
$user->save();

16
이 답변에 감사드립니다, 나는 $user = new User(Input::all());(프로그래머 로서) 누가 그렇게 통제되지 않는지 (또는 어떤 시나리오에서 이것이 도움이 될 것인지) 누가 그렇게 할 것인지 이해하지 못합니다 .
Kyslik

14
... 그것은 대답의 모든 지점에 있지는 않습니다. 그것은 보안 등에 관한 전체 교훈으로 납치하지 않고 대답을 짧게 유지하는 것입니다.
duellsy

3
나는 요점을 얻었고, 나는이 대답을 발견하게되어 기쁘다. 위에서 언급 한 시나리오가 유용한 지 궁금합니다. 나는 검증없이 모든 것을 의미합니다.
Kyslik

4
'라 라벨에서'대량 할당 '이란 무엇입니까?'라는 질문에 대한 답변으로 생각합니다. 유효성 검사에 대해 자세히 설명 했어야합니다 ... 문제를 해결하지 않은 채 간단한 질문이었습니다. 그대로 두겠습니다.
duellsy

8
내가 질문 한 OP 질문의 요점은 중요하지 않으므로 새 스레드를 만들 필요가 없으며 계속 "왜 안되는지"에 대해 이야기합니다. 나는 당신이 대신에 누군가가 당신이 대신에 라인을 사용하는 이유를 이해하지 못합니다$user = new User; $user->name = 'Neo';
Kyslik

26

대량 할당은 지정된 모델에 한 번에 저장 될 데이터 배열을 보내는 프로세스입니다. 일반적으로 데이터를 모델별로 하나씩 저장하지 않아도 단일 프로세스로 저장할 필요가 있습니다.

대량 할당은 좋지만 특정 보안 문제가 있습니다. 누군가가 모델에 값을 전달하고 보호하지 않으면 ID를 포함한 모든 필드를 확실히 수정할 수 있습니다. 그 좋지 않다.

하자 당신은 필드, '학생'테이블이 있다고 가정 해 "student_type, FIRST_NAME, LAST_NAME" 당신은 대량 할당 "FIRST_NAME, LAST_NAME"을 할 수 있습니다.하지만 당신은 보호 할 student_type 직접 변경되는.의 그 어디에서 채울 수보호 포획 장소.

채울 수 있음을 사용하면 모델에서 어떤 필드를 대량 할당 할 수 있는지 지정할 수 있습니다 $fillable. 모델에 특수 변수 를 추가하면 됩니다. 따라서 모델에서 :

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

' student_type '은 포함되지 않으므로 면제됩니다.

보호는 채울 수있는 것과 반대입니다. 채울 수있는 필드에 대량 할당 할 필드를 지정하면 guarded는 대량 할당 할 수없는 필드를 지정합니다. 따라서 모델에서 :

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

$ fillable 또는 $ guarded 중 하나만 사용해야합니다.

자세한 내용은 다음 링크를 참조하십시오 :- 대량 할당


1
이 매트 스타 우퍼의 책 "Laravel 업 및 실행"의 똑바로입니다

5

대량 할당은 데이터 배열을 사용하여 하나 이상의 열로 행을 채우는 것을 의미합니다. 를 사용하여 (어레이를 수동으로 빌드하는 대신 바로 가기) 사용하십시오 Input::all().

엄밀히 말하면 내 머리 꼭대기에서. 채울 수 있음은 테이블에서 삽입 할 수있는 열을 의미하고 보호는 모델이 해당 특정 열에 삽입 할 수 없음을 의미합니다.

like를 사용하여 대량 할당을 시도 할 때 "secret"이라는 열에 삽입하고 보호되도록 지정하면 모델을 통해 삽입 할 수 있지만 실제로는 삽입되지 않습니다. 데이터베이스.

이것은 모델을 사용할 때 테이블을 보호하고 보호하기위한 것입니다. 대량 할당은 모델에 채울 수 있고 보호되는 모델을 알려주지 않고 일종의 공격에 취약하다는 알림 또는 경고 인 것 같습니다.


2

수신 된 데이터 배열이 모델에 한 번에 저장되는 경우입니다.

laravel에서이 방법의 보안 문제로 인해 요청 된 데이터를 모델에서 채울 필드를 정의하는 것이 좋습니다.

$fillable변수를 사용하여 데이터베이스 테이블에서 채울 필드를 정의 할 수 있습니다 .

예 :

Protected $fillable = [‘username’, dob’, email’,];

laravel이 데이터를 대량 할당하는 것을 감지하면 모델 클래스에서 대량 할당하려는 필드를 강제로 정의합니다.

누군가 원치 않는 데이터를 데이터베이스의 html 양식으로 쉽게 전달할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.