Als je vraagt: "Wat is Yii?" uitchecken Introductie tot het Yii Framework, die de voordelen van Yii beoordeelt en een overzicht van Yii 2.0 bevat.
In deze serie Programming With Yii2 begeleid ik lezers in gebruik van het Yii2 Framework voor PHP. Als u van plan bent om uw aanvraag met het publiek te delen, moet u deze veilig hebben. U kunt dit het beste vanaf het begin plannen. Gelukkig, te beginnen met een kader zoals Yii maakt dit een stuk eenvoudiger dan het anders zou zijn. Zoals vermeld in Kenmerken van Yii:
Yii is uitgerust met veel beveiligingsmaatregelen om te voorkomen dat uw webtoepassingen aanvallen uitvoeren, zoals SQL-injectie, cross-site scripting (XSS), cross-site request vervalsing (CSRF) en cookie-manipulatie.
In deze zelfstudie laat ik u de basisbeveiligingsconcepten in het Yii-toepassingsraamwerk bekijken. En als u geïnteresseerd bent, zullen toekomstige afleveringen werken aan het beveiligen van de toepassing, Meeting Planner, die is opgenomen in onze opstartreeks, naarmate deze de alpha-release nadert.
Voordat we van start gaan, onthoud alsjeblieft dat ik probeer deel te nemen aan de onderstaande discussies. Als je een vraag of een suggestie voor een onderwerp hebt, plaats dan een reactie hieronder of neem contact met mij op via Twitter @reifman.
Opmerking: als je de kloof tussen de programmeerperiodes van de Yii-serie hebt opgemerkt, is dat omdat ik het moest hebben hersenoperatie vorig jaar. Bedankt voor uw geduld en ondersteuning - het is goed om regelmatig opnieuw te schrijven en ik kijk uit naar de voortzetting van de dekking van Yii2.
Als u nog niet bekend bent met de beveiliging van webtoepassingen, is er veel te begrijpen over het aanbod van Yii. Ik zal mijn best doen om een overzicht te bieden op basis van het beste van de Yii 2.0-documentatie. Het Yii-team verdeelt de beveiliging in zeven belangrijke gebieden:
Laten we deze een voor een beginnen te onderzoeken.
Ilko Kacharov's Yii Framework Security-presentatie biedt een paar handige dia's die het doel van authenticatie (en het volgende subonderwerp, autorisatie) samenvatten. Dit zijn in essentie de vragen die deze onderwerpen moeten beantwoorden:
Yii's yii / web / Gebruikersklasse integreert met de yii \ web \ IdentityInterface om de authenticatiestatus van de gebruiker binnen uw applicatie te beheren.
Afgelopen november heb ik een tutorial geschreven over Yii's Advanced Application Template. Een van de voordelen van de geavanceerde sjabloon is dat het een vooraf gebouwde integratie van het gebruikersmodel met ActiveRecord en uw database biedt. Uw toepassing biedt database-gestuurde authenticatie direct uit de doos.
Met het gebruikersmodel kunt u gebruikers programmatisch aanmelden en uitloggen:
De eigenschap $ isGuest bepaalt of de huidige gebruiker zich heeft aangemeld of niet. Wanneer de gebruiker is uitgelogd, is deze ongeldig, maar wordt anders een exemplaar van de IdentityInterface geretourneerd.
In essentie heeft u een gebruikersklasse nodig die ActiveRecord uitbreidt en implementeert methoden om de IdentityInterface te ondersteunen, zoals deze:
$ Token]); / ** * @return int | string huidige gebruikers-ID * / public function getId () return $ this-> id; / ** * @return string huidige gebruiker auth key * / public function getAuthKey () return $ this-> auth_key; / ** * @param string $ authKey * @return boolean als auth-sleutel geldig is voor huidige gebruiker * / public function validateAuthKey ($ authKey) return $ this-> getAuthKey () === $ authKey;
Voordat een gebruiker wordt gemaakt, genereert de toepassing ook een willekeurige tekenreeks als een machtigingssleutel. Dit kan worden gebruikt in e-mails met "wachtwoord vergeten" of andere op e-mail gebaseerde login-links:
class User breidt ActiveRecord implements IdentityInterface ... public function beforeSave ($ insert) if (parent :: beforeSave ($ insert)) if ($ this-> isNewRecord) $ this-> auth_key = \ Yii :: $ app- uit > beveiliging-> generateRandomString (); return true; return false;
Yii biedt twee ingebouwde benaderingen voor autorisatie. De eenvoudigere Access Control List (ACL) bepaalt welke gebruikers of processen acties mogen uitvoeren op een resource, en de meer intensieve Role-Based Access Control (RBAC) helpt u de toegang te beheren door rollen te definiëren. In RBAC kunnen alleen gebruikers of systeemtaken met specifieke rollen specifieke acties uitvoeren.
De ACL wordt soms ook een toegangscontrolefilter (ACF) genoemd. Yii biedt ACL-ondersteuning binnen yii \ filters \ AccessControl. Het is ideaal voor applicaties die alleen een eenvoudige toegangscontrole nodig hebben. Het is wat ik tot nu toe heb gebruikt in Meeting Planner.
Hier is een voorbeeld van de algemene SiteController die een toegangsgedrag configureert om toegang tot beschikbare acties, vaak pagina's, te filteren. In dit geval handelt ACL over aanmelden, inloggen en uitloggen. De '?'
geeft aan dat elke gebruiker toegang kan krijgen tot aanmeldings- en aanmeldingspagina's, terwijl de '@'
geeft aan dat alleen ingelogde of geverifieerde gebruikers toegang hebben gekregen. In het onderstaande voorbeeld kunnen alleen ingelogde gebruikers zich afmelden:
gebruik yii \ web \ Controller; gebruik yii \ filters \ AccessControl; class SiteController breidt Controller uit public function behaviors () return ['access' => ['class' => AccessControl :: className (), 'only' => ['login', 'logout', 'signup'], 'rules' => [['allow' => true, 'actions' => ['login', 'signup'], 'roles' => ['?'],], ['allow' => true, 'acties' => ['logout'], 'rollen' => ['@'],],],],]; // ...
Naarmate de controller groeit, moet elke nieuwe actie worden gedefinieerd binnen de AccessControl-regels. En naarmate uw toepassing groeit, moeten elke controller en al zijn acties ACL-filtering integreren voor beveiliging.
Op rollen gebaseerd toegangsbeheer (RBAC) biedt een robuuster authenticatiesysteem, maar vereist ook veel meer vooraf ontwerp en implementatie.
Met RBAC definieert u verificatie via rollen die kunnen worden overgenomen (of niet) en u past rollen toe op gebruikers. U kunt ook regels voor rollen definiëren. RBAC-implementaties kunnen behoorlijk ingewikkeld worden.
In de onderstaande afbeelding kunnen beheerders elke taak uitvoeren en kunnen auteurs een bericht maken en hun eigen berichten bijwerken. Jane is een beheerder zodat ze de taken van beheerders kan uitvoeren, en John is slechts een auteur:
Yii implementeert wat het 'een algemene hiërarchische RBAC noemt, volgens het NIST RBAC-model'. RBAC-functionaliteit wordt geleverd door de authManager-toepassingscomponent.
Ik ga hier niet te diep ingaan op RBAC, maar ik hoop het in een toekomstige tutorial. Nogmaals, het is aan de redactionele godinnen - met hen praten is nooit gemakkelijk:
via PopSugarKortom, om RBAC grondig te implementeren, moet u:
U kunt de code zien die vereist is om het begin van een RBAC-systeem hieronder in te schakelen:
authManager; // add "createPost" permissie $ createPost = $ auth-> createPermission ('createPost'); $ createPost-> description = 'Maak een bericht'; $ Autoritei-> toe te voegen ($ createPost); // voeg "updatePost" toestemming toe $ updatePost = $ auth-> createPermission ('updatePost'); $ updatePost-> description = 'Update bericht'; $ Autoritei-> toe te voegen ($ updatePost); // voeg de rol "auteur" toe en geef deze rol de machtiging "createPost" $ author = $ auth-> createRole ('auteur'); $ Autoritei-> toe te voegen ($ auteur); $ auth-> addChild ($ author, $ createPost); // voeg de rol "admin" toe en geef deze rol de machtiging "updatePost" // evenals de machtigingen van de rol "author" $ admin = $ auth-> createRole ('admin'); $ Autoritei-> toe te voegen ($ admin); $ auth-> addChild ($ admin, $ updatePost); $ auth-> addChild ($ admin, $ auteur); // Wijs rollen toe aan gebruikers. 1 en 2 zijn ID's geretourneerd door IdentityInterface :: getId () // meestal geïmplementeerd in uw gebruikersmodel. $ auth-> toewijzen ($ auteur, 2); $ auth-> toewijzen ($ admin, 1);
Om RBAC te implementeren, moet u bereid zijn om veel code vooraf te schrijven, of naarmate uw toepassing groeit. En als u dat doet, zal Yii de authenticatie beheren volgens het authenticatiekader dat u definieert. Met andere woorden, ontwerp en codering vooraan bieden solide, gedetailleerde authenticatie.
Zoals Mark Zuckerberg in juni leerde, slaan sommige websites gebruikerswachtwoorden op in platte tekst, maar de uwe zou dat niet moeten doen; om eerlijk te zijn tegen Zuckerberg, mijn Facebook-account werd ooit gehackt omdat PHPList hetzelfde had gedaan - nog voor de dagen van wachtwoordmanagers. Hoe dan ook, Yii maakt het eenvoudig om wachtwoorden te versleutelen en veilig te verifiëren.
De cryptfunctie van Yii gebruikt bcrypt om hashes voor uw wachtwoord te genereren. Wanneer mensen zich registreren, wordt een hash gemaakt:
$ hash = Yii :: $ app-> getSecurity () -> generatePasswordHash ($ wachtwoord);
Wanneer de gebruiker vervolgens probeert in te loggen, wordt deze gehasht en vergeleken met de hash in de database:
if (Yii :: $ app-> getSecurity () -> validatePassword ($ password, $ hash)) // all good, logging user in else // wrong password
Maar u kunt Yii ook gebruiken voor het beschermen van gegevens met cryptografie.
Het Yii Framework biedt een aantal ingebouwde functies om gegevensbescherming te ondersteunen:
Gegevens die afkomstig zijn van gebruikers, zijn mogelijk geïnfecteerd met aanvallen zoals SQL-injectie of scripts voor meerdere browsers. Het is belangrijk dat alle gegevens die u in views aan gebruikers levert, worden gereinigd. Yii biedt hiervoor een aantal methoden.
Ten eerste is dat zo Html :: encode
, die in essentie elke SQL of scripting verbreekt:
= Html::encode($user->naam)?>
En er is integratie met de HtmlPurifier-bibliotheek voor grotere tekstblokken:
= HtmlPurifier::process($post->tekst)?>
Yii biedt ook de mogelijkheid voor verificatie door derden, wat met name handig is voor het ondersteunen van sociale login via Google, Facebook, Twitter, enz.
Ik heb verschillende tutorials geschreven voor Envato Tuts + over het gebruik van AuthClient in het Yii Framework met sociale logins:
Ik heb ontdekt dat social login super goed werkt voor Meeting Planner. Nieuwe gebruikers kunnen aan de slag met het plannen van een vergadering zonder wachtwoord.
Yii beveelt ook een aantal best practices aan als het gaat om beveiliging van webtoepassingen. En de documentatie biedt voor iedereen een goed overzicht van deze onderwerpen.
De eerste drie bovenstaande onderwerpen worden goed beheerd door codering hierboven besproken in Beveiliging van weergaven.
Yii biedt ook ingebouwde CSRF-bescherming voor algemene activiteiten en kan worden uitgeschakeld wanneer dat nodig is. In Meeting Planner moest ik CSRF uitschakelen om berichten te accepteren die werden gepost van de API-services van Mailgun.
Wat de bestandsbelichting betreft, helpt het framework dit te minimaliseren door alle invoeraanvragen in het web / index.php aanvraagbestand te leiden. Dit beperkt de noodzaak om applicatiecode te schrijven die verzoeken filtert sterk. Het wordt goed beheerd op één plaats.
Ten slotte kan het gebruik van HTTPS uw verbindingen beschermen en samenwerken met Yii om gebruikers te beschermen. Eerder dit jaar schreef ik over Let's Encrypt - je kunt deze tutorial gebruiken om ook HTTPS voor Yii-apps te installeren.
Als u geïnteresseerd bent in het lezen van meer gedetailleerd materiaal over deze onderwerpen, biedt het Yii 1.x Framework deze berichten aan. Zeker, ze zijn ouder en minder specifiek voor Yii 2, maar ze blijven nuttig.
Ik hoop dat je mijn beveiligingsoverzicht voor Yii2 leuk vond. Als u aspecten van de meeste of alle bovenstaande concepten in uw toepassing integreert, zou u een in principe veilige webservice moeten hebben. Misschien wil je onze Building Your Startup With PHP-serie eens bekijken voor real-world implementatie van sommige van deze beveiligingspraktijken.
Bekijk de komende tutorials in onze Programming With Yii2-serie terwijl we doorgaan met duiken in verschillende aspecten van het framework. Ik verwelkom aanvragen voor functies en onderwerpen. Je kunt ze plaatsen in de reacties hieronder of e-mail me op mijn Lookahead Consulting-website.
Als je wilt weten wanneer de volgende Yii2-handleiding aankomt, volg me dan @reifman op Twitter of bekijk mijn instructeurspagina. Op mijn instructeurspagina staan alle artikelen uit deze serie zodra ze zijn gepubliceerd.
Laten we samenwerken om de redactionele godinnen blij te houden.