Norma de validare este sigură pentru cei din rezervor

intrare

Pe scurt. Regulile de validare au două scopuri:
  1. Asigurați-vă că datele transmise prin intermediul formularului sunt introduse corect.
  2. Determinați câmpurile care pot fi atribuite variabilei $ model.
Ele sunt legate, dar nu sunt aceleași.

Să ne uităm la setul de reguli de validare

Înainte de a începe, vă vom arăta regulile tipice pentru verificarea datelor modelului. Exemplul nostru este luat din blogul Tutorial. Modelul "User" este protejat / models / User.php.

Regulile de validare sunt determinate din matrice (.). Conține o listă de atribute, numele validatorului, precum și parametrii suplimentari solicitați de diferiți validatori. Poate conține și cuvântul cheie "on", indicând un script de validare, dar nu vom descrie acest lucru în articol.

Reguli de validare

Scopul principal al validatorilor este să se asigure că utilizatorii trimit datele corecte în formular.

Dacă câmpul nu trebuie să depășească 16 caractere, dacă valoarea trebuie să fie unică sau dacă valoarea ar trebui să fie e-mailul corect, Yii oferă un set bogat de validatori pentru a verifica datele utilizatorului.

În plus, puteți să creați propriile validatoare, fie ca o clasă de funcții, fie ca o extensie autonomă. Dar acest lucru este dincolo de sfera de aplicare a acestui articol.

Alocarea maselor

După ce ați terminat pregătirea regulilor de validare, este timpul să puneți la dispoziție datele primite de la utilizator. Acest lucru se întâmplă atunci când formularul este trimis, determinând operatorul să acționeze.

Acesta este codul de acțiune al controlului postului de actualizare (? R = post / update):

$ model-> atributele = $ _POST ['Post'] este un design înșelător de simplu, neadevărat?
De fapt, se numește metoda

Deoarece $ _POST ['Post'] este de fapt o matrice care reprezintă toate câmpurile simultan, Yii trece toate câmpurile una câte una. Fiecare câmp este atribuit atributului corespunzător din model (după verificare, desigur), care poate fi salvat sau actualizat sau oricare altul.

Desemnarea de masă arată de fapt în felul următor:

Analiza de masă este foarte importantă - aplicația Yii nu va funcționa fără ea.

De ce misiunea de masă uneori nu funcționează?

Ca fiind "evident" ca Assignment masiv, este remarcabil de frecvent ca utilizatorii să afle că variabilele lor de $ nu reușesc -> save () din cauza valorii câmpului lipsă. Validarea eșuează sau valorile câmpurilor nu sunt copiate din formular în modelul $.
Nu am putut traduce această expresie la agravare.

Punctul cheie - atribuirea masei va fi implementat numai pentru câmpurile care au reguli explicite de validare. Regulile explicite sunt lungimea, e-mailul, cerințele etc. - Toate sunt standard. Dar unele câmpuri de formă gratuite nu sunt necesare și nu au nici un format de cerințe - utilizatorul poate transfera orice în el, inclusiv lăsând acest câmp gol.

Unele câmpuri nu trebuie să fie verificate, nu?

Incorect: numai atribuirea explicită a valorilor câmpurilor de modele limitează numărul posibil de băieți răi care încearcă să strică modelul.

Atributele care nu apar în nici o regulă de validare nu sunt copiate în model pentru o atribuire de masă.
Dacă atributul nu are un validator de date specific, trebuie să-i spunem lui Yii că dorim să permitem atributul să fie populat în timpul atribuțiilor în vrac. Acest lucru se face cu ajutorul validatorului "sigur".

Deci ce sa întâmplat?

De ce este această regulă "sigură" necesară în atributele? Aceasta este o întrebare foarte frecventă.

La urma urmei, dacă un dezvoltator configurează formulare cu câmpuri specifice, acestea nu trebuie doar să fie copiate în modelul $ după verificare? De ce nu este destul de bun?

Deoarece Yii vă protejează de surprizele de siguranță.

În timp ce acest lucru poate părea evident, dar Yii nu are nici o modalitate de a ști că datele au fost trimise de forma, iar datele nu sunt de tipul rău, care a sintetizat rezultatele, în scopul de a induce în eroare aplicația.

Aceasta este o protecție împotriva a două scenarii:
  1. Unele modele au atribute care sunt permise, dar nu într-o formă specifică. De exemplu, trebuie completate câmpurile "schimbarea parolei", câmpurile "parola" și "confirmarea parolei". Dar, în scriptul ChangePassword, atributul isAdmin trebuie să fie marcat ca fiind "nesigur" (nesigur pentru alocare de masă).
  2. Toate modelele obiectuale bazate pe CActiveRecord au atribute interne (proprietăți) care pot fi compromise dacă un tip rău poate atribui masiv atribute. Exemple de astfel de tipuri:
    • $ model-> isnewrecord
    • $ model-> dbcriteria
    • $ model-> cheia primară
    • $ model-> tablelias
    • $ model-> scenariu
Există și alte proprietăți, nu le vom lista aici. Este destul de înfricoșător să gândiți ce se poate întâmpla dacă un tip rău ar putea gestiona aceste proprietăți. Dar el nu poate, pentru că nu sunt menționate în nici o regulă de verificare - "sigură" - sunt protejate.

Yii are o abordare conservatoare. Atributele sunt considerate nesigure dacă dezvoltatorul nu le indică explicit ca acestea să fie sigure (paradigma "interzicerii implicite").

Este de dorit să se revizuiască regulile de validare a modelelor din timp în timp pentru a vă asigura că nu lăsa să modificați atributele pe care utilizatorul nu trebuie să aibă acces (în special în scenarii), deoarece este de multe ori în modelul din toate câmpurile marcate ca «sigure».

De la traducător

Din mine voi adăuga cu ocazia ultimului paragraf. Pentru a împiedica alocarea în masă a valorilor prin model, puteți crea modele de formulare, cu câmpuri bine definite care pot fi trimise prin intermediul formularului. Și deja în modelul de formă, puteți atribui valorile modelului de înregistrare acrive și puteți efectua salvarea.

Articole similare