Programmering med Yii2 Sikkerhet

Hvis du spør, "Hva er Yii?" Sjekk ut Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over Yii 2.0.

I denne programmeringen med Yii2-serien, veileder jeg lesere i bruk av Yii2 Framework for PHP. Hvis du planlegger å dele søknaden din med offentligheten, trenger du den til å være sikker, og det er best å planlegge dette fra begynnelsen. Heldigvis starter med et rammeverk som Yii gjør dette mye enklere enn det ellers ville være. Som nevnt i Funksjoner av Yii:

Yii er utstyrt med mange sikkerhetstiltak for å forhindre at webapplikasjoner fra angrep som SQL-injeksjon, kryptering på stedet (XSS), forfalskning på tvers av nettsider (CSRF) og cookie manipulering.

I denne opplæringen vil jeg gå deg gjennom de grunnleggende sikkerhetsbegrepene i Yii-søknadsrammen. Og hvis du er interessert, vil fremtidige episoder fungere for å sikre programmet, Meeting Planner, som er omtalt i vår oppstartsserie, da den nærmer seg alfa-utgivelse.

Før vi begynner, vær så snill og husk, jeg prøver å delta i diskusjonene nedenfor. Hvis du har et spørsmål eller et emneforslag, vennligst legg inn en kommentar nedenfor eller kontakt meg på Twitter @ reifman. 

Merk: Hvis du la merke til gapet mellom episodene i Programming Yii series, er det fordi jeg måtte ha hjernekirurgi i fjor. Takk for tålmodigheten og støtten. Det er hyggelig å skrive igjen regelmessig, og jeg ser frem til fortsatt dekning av Yii2.

Grunnleggende om sikkerhet med Yii

Hvis du er ny til webprogramsikkerhet, er det mye å forstå om Yiis tilbud. Jeg vil gjøre mitt beste for å tilby en oversikt basert på det beste av Yii 2.0 dokumentasjonen. Yii-teamet deler sikkerhet i syv nøkkelområder:

  1. Godkjenning
  2. Autorisasjon
  3. Arbeide med passord
  4. kryptografi
  5. Visninger sikkerhet
  6. Auth Clients
  7. Beste praksis

La oss begynne å dykke inn i disse en etter en.

1. Autentisering

Ilko Kacharovs Yii Framework Security-presentasjon tilbyr noen nyttige lysbilder som oppsummerer målet om godkjenning (og følgende underemne, autorisasjon). I hovedsak er det spørsmålene disse emnene må svare på:

  • Hvem er brukeren?
  • Er brukeren de sier de er?
  • Er brukeren autorisert til å få tilgang til en ressurs?
  • Er brukeren autorisert til å utføre en handling?
  • Er brukeren autorisert til å utføre en handling på en ressurs?

Brukermodellen og identitetsgrensesnittet

Yii er yii / web / brukerklasse integrert med yii \ web \ IdentityInterface for å administrere brukerens autentiseringsstatus i søknaden din. 

I november skrev jeg en veiledning om Yii's Advanced Application Template. En av de avanserte malens fordeler er at den gir forhåndsbygd integrasjon av brukermodellen med ActiveRecord og databasen. Så søknaden din tilbyr database-drevet autentisering rett ut av boksen.

Brukermodellen lar deg logge inn og logge ut brukere:

  • logg inn () angir spesifisert identitet og husker autentiseringsstatus i økt og informasjonskapsel.
  • logout () markerer brukeren som gjest og fjerner relevant informasjon fra økt og informasjonskapsel.
  • setIdentity (): Endrer brukeridentiteten uten å berøre økt eller informasjonskapsel, best for API-funksjonalitet.

Egenskapen $ isGuest bestemmer om den nåværende brukeren har logget på eller ikke. Når brukeren er logget ut, er den null, men ellers returnerer en forekomst av IdentityInterface.

I hovedsak trenger du en brukerklasse som utvider ActiveRecord og implementerer metoder for å støtte IdentityInterface, slik:

 $ Token]);  / ** * @return int | streng nåværende bruker ID * / offentlig funksjon getId () return $ this-> id;  / ** * @return streng nåværende bruker auth-nøkkel * / offentlig funksjon getAuthKey () return $ this-> auth_key;  / ** * @param streng $ authKey * @return boolean hvis auth nøkkel er gyldig for nåværende bruker * / offentlig funksjon validateAuthKey ($ authKey) return $ this-> getAuthKey () === $ authKey; 

Også før en bruker opprettes, genererer programmet en tilfeldig streng som en godkjenningsnøkkel. Dette kan brukes i "glemt passord" e-post eller andre e-postbaserte påloggingsledd:

klassen Bruker utvider ActiveRecord implementerer IdentityInterface ... offentlig funksjon førSave ($ insert) hvis (foreldre :: beforeSave ($ insert)) if ($ this-> isNewRecord) $ this-> auth_key = \ Yii :: $ app- > sikkerhets-> generateRandomString ();  returnere sann;  returner falsk; 

Autorisasjon

Yii gir to innebygde tilnærminger til autorisasjon. Den enklere tilgangskontrolllisten (ACL) bestemmer hvilke brukere eller prosesser som er tillatt å utføre handlinger på en ressurs, og den mer intensivrollbaserte tilgangskontrollen (RBAC) hjelper deg med å administrere tilgang ved å definere roller. I RBAC kan bare brukere eller systemoppgaver med bestemte roller utføre bestemte handlinger.

Tilgangskontrollliste

ACL kalles også noen ganger et Access Control Filter (ACF). Yii gir ACL-støtte innenfor yii \ filters \ AccessControl. Den er ideell for applikasjoner som bare trenger enkel tilgangskontroll. Det er det jeg har brukt hittil i Meeting Planner.

Her er et eksempel på den felles SiteController som konfigurerer et tilgangsadferd for å filtrere tilgang til tilgjengelige handlinger, ofte sider. I dette tilfellet handler ACL ved påmelding, innlogging og utlogging. De '?' indikerer at enhver bruker kan få tilgang til innlogging og påloggingssider, mens '@' indikerer at bare innloggede eller autentiserte brukere har tilgang. I eksemplet nedenfor kan bare loggede brukere logge ut:

bruk yii \ web \ Controller; bruk yii \ filters \ AccessControl; Klassen SiteController utvider Controller public function behaviors () return ['access' => ['class' => AccessControl :: className (), 'only' => ['logg inn', 'logout', 'signup'], '' '' '', '' '' '', '' '' '', '' '' ' 'actions' => ['logg ut'], 'roller' => ['@'],],],],];  // //

Når kontrolleren vokser, må hver ny handling defineres i AccessControl-reglene. Og etter hvert som applikasjonen din vokser, må hver kontroller og alle handlinger integrere ACL-filtrering for sikkerhet.

Rollebasert tilgangskontroll

Rollbasert tilgangskontroll (RBAC) gir et mer robust autentiseringssystem, men krever også mye mer forhåndsdesign og implementering. 

Med RBAC definerer du autentisering gjennom roller som kan arves (eller ikke), og du bruker roller til brukere. Du kan også definere regler for roller. RBAC implementeringer kan bli ganske komplekse.

I figuren nedenfor kan admins utføre noen oppgaver, og forfattere kan opprette et innlegg og oppdatere sine egne innlegg. Jane er en administrator, slik at hun kan utføre oppgaver for administratorer, og John er bare en forfatter:

Yii implementerer hva det kaller "en generell hierarkisk RBAC, etter NIST RBAC-modellen." RBAC-funksjonalitet er gitt av sin authManager-applikasjonskomponent.

Jeg vil ikke gå inn i for mye dybde med RBAC her, men jeg håper i en fremtidig opplæring. Igjen er det opp til de redaksjonelle gudinnene - det er aldri lett å snakke med dem:

via PopSugar

I utgangspunktet, for å implementere RBAC grundig, må du:

  • definer roller og tillatelser
  • etablere forhold mellom dine roller og tillatelser
  • definer eventuelle regler som eksisterer
  • knytte regler til dine roller og tillatelser
  • og til slutt, tildele roller til brukerne

Du kan se koden som kreves for å aktivere begynnelsen av et RBAC-system nedenfor:

authManager; // legge til "createPost" tillatelse $ createPost = $ auth-> createPermission ('createPost'); $ createPost-> description = 'Opprett et innlegg'; $ Auth-> legge til ($ createPost); // legge til "updatePost" permission $ updatePost = $ auth-> createPermission ('updatePost'); $ updatePost-> description = 'Oppdater posten'; $ Auth-> legge til ($ updatePost); // legge "forfatter" rolle og gi denne rollen "createPost" tillatelsen $ author = $ auth-> createRole ('author'); $ Auth-> legge til ($ forfatter); $ auth-> addChild ($ forfatter, $ createPost); // legge til "admin" -rollen og gi denne rollen "updatePost" -tillatelsen // samt tillatelsene til "forfatter" -rollen $ admin = $ auth-> createRole ('admin'); $ Auth-> legge til ($ admin); $ auth-> addChild ($ admin, $ updatePost); $ auth-> addChild ($ admin, $ author); // Tilordne roller til brukere. 1 og 2 er ID-er returnert av IdentityInterface :: getId () // vanligvis implementert i brukermodellen din. $ auth-> tilordne ($ forfatter, 2); $ auth-> tilordne ($ admin, 1); 

For å implementere RBAC må du være forberedt på å skrive mye kode foran, eller når søknaden din vokser. Og hvis du gjør det, vil Yii klare godkjenningen i henhold til godkjenningsrammen du definerer. Med andre ord gir design og koding opp front en solid, detaljert autentisering.

Arbeide med passord

Som Mark Zuckerberg lærte i juni, lagrer noen nettsteder brukerpassord i ren tekst, men din skal ikke; For å være rettferdig mot Zuckerberg ble min Facebook-konto en gang hacket på grunn av at PHPList hadde gjort det samme - før dagene med passordforvaltere. Uansett, gjør Yii det enkelt å kryptere og sikkert verifisere passord.

Yii krypteringsfunksjon bruker bcrypt til å generere hashes for passordet ditt. Når folk registrerer, er det opprettet en hash:

$ hash = Yii :: $ app-> getSecurity () -> generatePasswordHash ($ passord);

Da, når brukeren forsøker å logge inn, er den hashed og sammenlignet med hash i databasen:

hvis (Yii :: $ app-> getSecurity () -> validerePassword ($ passord, $ hash)) // alt bra, logger brukeren inn annet // feil passord

Men du kan også bruke Yii for å beskytte data med kryptering.

kryptografi

Yii Framework gir en rekke innebygde funksjoner for å støtte databeskyttelse:

  • Passord og nøkkelgenereringsfunksjoner som generateRandomKey, generateRandomString og generateSalt.
  • Passord validering: generatePasswordHash () og validerePassword ().
  • Kryptering / dekryptering: encryptByKey (), decryptByKey (), encryptByPassword () og decryptByPassword ().
  • Nøkkelavledning ved bruk av standardalgoritmer: pbkdf2 () og hkdf ().
  • Data manipulering forebygging: hashData () og validereData ().

Visninger Sikkerhet

Eventuelle data som kommer fra brukere er muligens smittet med angrep som SQL-injeksjon eller kryss-leser-skript. Det er viktig at alle data du sender ut til brukere i visninger, skal renses. Yii tilbyr et par metoder for dette. 

Først er det Html :: kode, som i det vesentlige bryter noen SQL eller skripting:

 
navn)?>

Og det er integrering med HtmlPurifier-biblioteket for større tekstblokker:

 
tekst)?>

Logg inn via Auth Client

Yii gir også muligheten for godkjenning fra tredjeparter, noe som er spesielt nyttig for å støtte sosial pålogging via Google, Facebook, Twitter, osv.

Jeg har skrevet flere opplæringsprogrammer for Envato Tuts + på bruk av AuthClient i Yii Framework med sosiale pålogginger:

  • Bygg opp oppstart: Forenkle Onramp Med AuthClient (i påvente av publisering)
  • Slik programmerer du med Yii2: Google-godkjenning
  • Slik programmerer du med Yii2: AuthClient-integrasjon med Twitter, Google og andre nettverk

Jeg har funnet sosial innlogging fungerer bra for Meeting Planner. Nye brukere kan begynne å planlegge et møte uten et passord.

Beste praksis

Yii anbefaler også en håndfull beste praksis når det gjelder webapplikasjonssikkerhet. Og dokumentasjonen gir en god primer på disse temaene for alle.

  1. Filtrering av inngang og utgang
  2. Unngå SQL-injeksjoner
  3. Unngå cross-site scripting (XSS)
  4. Unngå cross-site Request Forgery (CSRF)
  5. Unngå fil eksponering
  6. Unngå debug info og verktøy ved produksjon
  7. Bruk sikker tilkobling over TLS

De tre første emnene ovenfor styres godt ved koding diskutert ovenfor i Visninger Sikkerhet

Yii gir også innebygd CSRF-beskyttelse for vanlige aktiviteter - og den kan slås av når det er nødvendig. I møteplanleggeren måtte jeg slå av CSRF for å godta meldinger som ble postet fra Mailguns API-tjenester.

Når det gjelder fileksponering, hjelper rammen med å minimere dette ved å utdype alle innspillingsforespørsler i web / index.php-forespørselfilen. Dette begrenser i stor grad behovet for å skrive søknadskode som filtrerer forespørsler. Det klarte godt på ett sted.

Endelig kan bruk av HTTPS bidra til å beskytte forbindelsene dine og arbeide med Yii for å beskytte brukere. Tidligere i år skrev jeg om La oss kryptere - du kan bruke denne opplæringen til å installere HTTPS for Yii apps også.

Vil du lese mer?

Hvis du er interessert i å lese mer detaljert materiale om disse emnene, tilbyr Yii 1.x Framework disse innleggene. Sikkert, de er eldre og mindre spesifikke for Yii 2, men de forblir nyttige.

  • Spesielle temaer: Sikkerhet
  • Hvordan skrive sikre Yii applikasjoner
  • Yii Sikkerhetsutvidet veiledning

I Avslutning

Jeg håper du har hatt min sikkerhetsoversikt for Yii2. Hvis du integrerer aspekter av de fleste eller alle konseptene ovenfor i søknaden din, bør du ha en i utgangspunktet sikker webtjeneste. Du vil kanskje sjekke ut vårt Bygg din oppstart med PHP-serien for real-world implementering av noen av disse sikkerhetspraksis.

Se etter kommende opplæringsprogrammer i Programmering med Yii2-serien når vi fortsetter å dykke inn i ulike aspekter av rammen. Jeg aksepterer funksjon og emneforespørsler. Du kan legge inn dem i kommentarene under eller sende meg en e-post på Lookahead Consulting.

Hvis du vil vite når neste Yii2 opplæring kommer, følg meg @ reifman på Twitter eller sjekk min instruktørside. Min instruktørside vil inkludere alle artiklene fra denne serien så snart de er publisert. 

La oss jobbe sammen for å holde de redaksjonelle gudene lykkelige.

Relaterte linker

  • Yii beste sikkerhetspraksis
  • Yii Base Security Class 
  • Yii2 Developer Exchange