Om du frågar, "Vad är Yii?" checka ut Introduktion till Yii Framework, som granskar fördelarna med Yii och innehåller en översikt över Yii 2.0.
I denna programmering med Yii2-serien guidar jag läsare som använder Yii2 Framework for PHP. Om du planerar att dela din ansökan med allmänheten behöver du den vara säker, och det är bäst att planera det från början. Lyckligtvis börjar med en ram som Yii göra det mycket lättare än vad det annars skulle vara. Som anges i funktionerna i Yii:
Yii är utrustad med många säkerhetsåtgärder för att förhindra att dina webbprogram är attacker som SQL-injektion, cross-site scripting (XSS), cross-site request forgery (CSRF) och cookie manipulering.
I denna handledning går jag igenom de grundläggande säkerhetskoncepten inom Yii-applikationsramen. Och om du är intresserad kommer framtida episoder att fungera för att säkra programmet, Mötesplaneraren, som finns i vår startserie, när den närmar sig alfa-frisläppande.
Innan vi börjar, kom ihåg, jag försöker delta i diskussionerna nedan. Om du har en fråga eller ett ämnesförslag, vänligen skriv en kommentar nedan eller kontakta mig på Twitter @ reifman.
Obs! Om du märkte klyftan mellan episoderna för Programming Yii-serien, beror det på att jag måste ha hjärnkirurgi förra året. Tack för ditt tålamod och stöd - det är trevligt att skriva regelbundet igen, och jag ser fram emot att fortsätt att täcka Yii2.
Om du är ny för webbapplikationssäkerhet, finns det mycket att förstå om Yiis erbjudanden. Jag gör mitt bästa för att erbjuda en översikt baserad på det bästa av Yii 2.0-dokumentationen. Yii-teamet delar säkerhet i sju nyckelområden:
Låt oss börja dyka in i dessa en efter en.
Ilko Kacharovs Yii Framework Security Presentation erbjuder några användbara bilder som sammanfattar målet för autentisering (och följande underrubrik, auktorisation). I huvudsak här är de frågor som dessa ämnen behöver svara på:
Yiis yii / web / Användarklass integreras med yii \ web \ IdentityInterface för att hantera användarens autentiseringsstatus inom din ansökan.
I november skrev jag en handledning om Yiis avancerade applikationsmall. En av de avancerade mallens fördelar är att den ger förbyggd integration av användarmodellen med ActiveRecord och din databas. Så din ansökan erbjuder databasdriven autentisering direkt ur lådan.
Användarmodellen låter dig programmera in och logga ut användare:
Egenskapen $ isGuest bestämmer om den nuvarande användaren har loggat in eller inte. När användaren är utloggad är den noll, men returnerar annars en instans av IdentityInterface.
I huvudsak behöver du en användarklass som utökar ActiveRecord och implementerar metoder för att stödja IdentityInterface, så här:
$ Token]); / ** * @return int | sträng aktuellt användarnamn * / allmän funktion getId () return $ this-> id; / ** * @return sträng aktuell användarens auth-nyckel * / allmän funktion getAuthKey () return $ this-> auth_key; / ** * @paramsträng $ authKey * @return boolean om auth-nyckel är giltig för nuvarande användare * / public function validateAuthKey ($ authKey) return $ this-> getAuthKey () === $ authKey;
Även innan en användare skapas genererar applikationen en slumpmässig sträng som en behörighetsnyckel. Detta kan användas i "Glömt ditt lösenord" e-post eller andra e-postbaserade inloggnings länkar:
klass användaren utökar ActiveRecord implementerar IdentityInterface ... public function beforeSave ($ insert) if (förälder :: beforeSave ($ insert)) if ($ this-> isNewRecord) $ this-> auth_key = \ Yii :: $ app- > säkerhet-> generateRandomString (); returnera sant; returnera false;
Yii ger två inbyggda metoder för godkännande. Den enklare åtkomstkontrolllistan (ACL) avgör vilka användare eller processer som får utföra handlingar på en resurs, och den mer intensiva rollbaserade åtkomstkontrollen (RBAC) hjälper dig att hantera åtkomst genom att definiera roller. I RBAC kan endast användare eller systemuppgifter med specifika roller utföra specifika åtgärder.
ACL kallas ibland också ett Access Control Filter (ACF). Yii tillhandahåller ACL-stöd inom yii \ filters \ AccessControl. Den är idealisk för applikationer som bara behöver enkel åtkomstkontroll. Det är vad jag hittills har använt i mötesplaneraren.
Här är ett exempel på den gemensamma SiteController som konfigurerar ett åtkomstbeteende för att filtrera åtkomst till tillgängliga åtgärder, ofta sidor. I det här fallet handlar ACL om registrering, inloggning och utloggning. De '?'
indikerar att någon användare kan komma åt inloggnings- och registreringssidor, medan '@'
indikerar att endast inloggade eller autentiserade användare är tillåtna. I exemplet nedan kan endast inloggade användare logga ut:
använd yii \ web \ Controller; använd yii \ filters \ AccessControl; klassen SiteController utökar Controller public function behaviors () return ['access' => ['class' => AccessControl :: className (), 'only' => ['login', 'logout', 'signup'], 'regler' => ['' '', '', 'true' => ['login', 'signup'], 'roller' => 'actions' => ['logout'], 'roller' => ['@'],],],],]; // //
När regulatorn växer måste varje ny åtgärd definieras i AccessControl-reglerna. Och när din ansökan växer måste varje kontroller och alla dess åtgärder integrera ACL-filtrering för säkerhet.
Rollbaserad åtkomstkontroll (RBAC) ger ett mer robust autentiseringssystem, men kräver också mycket mer förhandsdesign och implementering.
Med RBAC definierar du autentisering genom roller som kan vara ärvda (eller inte), och du tillämpar roller till användare. Du kan också definiera regler för roller. RBAC-implementeringar kan bli ganska komplexa.
I bilden nedan kan administratörer utföra en uppgift, och författare kan skapa ett inlägg och uppdatera sina egna inlägg. Jane är en admin så att hon kan utföra administratörernas uppgifter, och John är bara en författare:
Yii implementerar vad det kallar "en allmän hierarkisk RBAC, som följer NIST RBAC-modellen." RBAC-funktionalitet tillhandahålls av sin authManager-applikationskomponent.
Jag kommer inte att gå in på för mycket djup med RBAC här, men jag hoppas i en framtida handledning. Återigen är det upp till de redaktionella gudinnorna - det är aldrig lätt att prata med dem:
via PopSugarI grund och botten, för att genomföra RBAC noggrant måste du:
Du kan se koden som krävs för att aktivera början av ett RBAC-system nedan:
authManager; // lägg till "createPost" permission $ createPost = $ auth-> createPermission ('createPost'); $ createPost-> description = 'Skapa ett inlägg'; $ Myndig-> lägga ($ createPost); // lägg till "updatePost" permission $ updatePost = $ auth-> createPermission ('updatePost'); $ updatePost-> description = 'Uppdatera inlägg'; $ Myndig-> lägga ($ updatePost); // lägg till "författarroll" och ge den här rollen "createPost" -tillståndet $ author = $ auth-> createRole ("author"); $ Myndig-> lägga ($ författare); $ auth-> addChild ($ författare, $ createPost); // lägg till "admin" roll och ge denna roll tillståndet "updatePost" // samt behörigheterna för "författarrollen" $ admin = $ auth-> createRole ('admin'); $ Myndig-> lägga ($ admin); $ auth-> addChild ($ admin, $ updatePost); $ auth-> addChild ($ admin, $ author); // Tilldela roller till användare. 1 och 2 är ID: er som returneras av IdentityInterface :: getId () // vanligtvis implementerad i din användarmodell. $ auth-> tilldela ($ författare, 2); $ auth-> tilldela ($ admin, 1);
För att implementera RBAC måste du vara beredd att skriva mycket kod framför, eller när din ansökan växer. Och om du gör det kommer Yii att hantera autentiseringen enligt den autentiseringsram du definierar. Med andra ord ger design och kodning uppifrån en solid, detaljerad autentisering.
Som Mark Zuckerberg lärde sig i juni, lagrar vissa webbplatser användarlösenord i vanlig text, men din bör inte. För att vara rättvist mot Zuckerberg blev mitt Facebook-konto en gång hackad på grund av att PHPList har gjort det samma - före dagarna för lösenordsansvariga. Hur som helst gör Yii det enkelt att kryptera och säkert verifiera lösenord.
YiS kryptfunktion använder bcrypt för att skapa hash för ditt lösenord. När folk registrerar skapas en hash:
$ hash = Yii :: $ app-> getSecurity () -> genereraPasswordHash ($ lösenord);
Då, när användaren försöker logga in, har den hashed och jämförts med hash i databasen:
om (Yii :: $ app-> getSecurity () -> valideraPassword ($ lösenord, $ hash)) // alla bra, logga användaren i annat // fel lösenord
Men du kan också använda Yii för att skydda data med kryptografi.
Yii Framework innehåller ett antal inbyggda funktioner för att skydda dataskydd:
Alla data som kommer från användare är eventuellt smittade av attacker som SQL-injektion eller cross-browser-skript. Det är viktigt att alla data du skickar till användare i visningar ska rengöras. Yii erbjuder ett par metoder för detta.
För det första finns det Html :: encode
, som väsentligen bryter mot SQL eller skript:
= Html::encode($user->namn)?>
Och det finns integration med HtmlPurifier-biblioteket för större textblock:
= HtmlPurifier::process($post->text)?>
Yii ger också möjlighet till tredjepartsautentisering, vilket är särskilt användbart för att stödja social inloggning via Google, Facebook, Twitter, etc..
Jag har skrivit flera handledning för Envato Tuts + om att använda AuthClient inom Yii Framework med sociala inloggningar:
Jag har hittat social inloggning fungerar bra för mötesplaneraren. Nya användare kan komma igång med att planera ett möte utan lösenord.
Yii rekommenderar också en handfull bästa praxis när det gäller säkerhet för webbapplikationer. Och dess dokumentation ger en bra grund för dessa ämnen för alla.
De tre första ämnena ovan hanteras bra genom kodning som diskuteras ovan i Visningar Säkerhet.
Yii ger också inbyggt CSRF-skydd för gemensamma aktiviteter, och det kan stängas av vid behov. I mötesplaneraren var jag tvungen att stänga av CSRF för att acceptera meddelanden som skickades från Mailguns API-tjänster.
När det gäller filexponering bidrar ramen till att minimera detta genom att hitta alla inmatningsförfrågningar i web / index.php-förfrågningsfilen. Detta begränsar kraftigt behovet av att skriva programkod som filtrerar förfrågningar. Det lyckades väl på ett ställe.
Slutligen kan du använda HTTPS för att skydda dina kontakter och arbeta med Yii för att skydda användare. Tidigare i år skrev jag om Låt oss kryptera - du kan använda den här handledningen för att installera HTTPS för Yii apps också.
Om du är intresserad av att läsa mer detaljerat material om dessa ämnen, erbjuder Yii 1.x Framework dessa inlägg. Visst är de äldre och mindre specifika för Yii 2, men de är fortfarande användbara.
Jag hoppas att du har haft min säkerhetsöversikt för Yii2. Om du integrerar aspekter av de flesta eller alla begreppen ovan i din ansökan, borde du ha en i princip säker webbtjänst. Du kanske vill kolla in vår Bygga din start med PHP-serien för verklig implementering av några av dessa säkerhetsrutiner.
Titta på kommande tutorials i vår programmering med Yii2-serien när vi fortsätter att dyka in i olika aspekter av ramen. Jag välkomnar funktion och ämnesförfrågningar. Du kan skicka in dem i kommentarerna nedan eller maila mig på min Lookahead Consulting webbplats.
Om du vill veta när nästa Yii2 handledning kommer, följ mig @ reifman på Twitter eller kolla min instruktörssida. Min instruktörssida kommer att innehålla alla artiklar från denna serie så snart de publiceras.
Låt oss arbeta tillsammans för att hålla de redaktionella gudinnorna lyckliga.