Programmeren met Yii2 Beveiliging

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.

De basisprincipes van beveiliging met Yii

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:

  1. authenticatie
  2. machtiging
  3. Werken met wachtwoorden
  4. geheimschrift
  5. Beveiliging van weergaven
  6. Auth Clients
  7. Beste praktijken

Laten we deze een voor een beginnen te onderzoeken.

1. Authenticatie

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:

  • Wie is de gebruiker?
  • Is de gebruiker die ze zeggen dat ze zijn??
  • Is de gebruiker gemachtigd om toegang te krijgen tot een bron?
  • Is de gebruiker gemachtigd om een ​​actie uit te voeren?
  • Is de gebruiker gemachtigd om een ​​actie uit te voeren op een resource?

Het gebruikersmodel en de identiteitsinterface

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:

  • login () stelt de opgegeven identiteit in en onthoudt de authenticatiestatus in sessie en cookie.
  • uitloggen () markeert de gebruiker als een gast en wist de relevante informatie uit sessie en cookie.
  • setIdentity (): wijzigt de gebruikersidentiteit zonder sessie of cookie aan te raken, het beste voor API-functionaliteit.

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; 

machtiging

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.

Toegangscontrole lijst

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 gebaseerde toegangscontrole

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 PopSugar

Kortom, om RBAC grondig te implementeren, moet u:

  • definieer rollen en machtigingen
  • vestig relaties tussen uw rollen en toestemmingen
  • definieer alle bestaande regels
  • koppel regels aan uw rollen en rechten
  • en ten slotte rollen toewijzen aan gebruikers

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.

Werken met wachtwoorden

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.

geheimschrift

Het Yii Framework biedt een aantal ingebouwde functies om gegevensbescherming te ondersteunen:

  • Wachtwoord- en sleutelgeneratiefuncties zoals generateRandomKey, generateRandomString en generateSalt.
  • Wachtwoordvalidatie: generatePasswordHash () en validatePassword ().
  • Encryptie / decryptie: encryptByKey (), decryptByKey (), encryptByPassword () en decryptByPassword ().
  • Sleutelafleiding met behulp van standaardalgoritmen: pbkdf2 () en hkdf ().
  • Preventie van misbruik van gegevens: hashData () en validateData ().

Beveiliging van weergaven

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:

 
naam)?>

En er is integratie met de HtmlPurifier-bibliotheek voor grotere tekstblokken:

 
tekst)?>

Inloggen via Auth Client

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:

  • Uw startup opbouwen: Onramp vereenvoudigen met AuthClient (in afwachting van publicatie)
  • Hoe te programmeren met Yii2: Google-verificatie
  • Hoe te programmeren met Yii2: AuthClient-integratie met Twitter, Google en andere netwerken

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.

Beste praktijken

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.

  1. In- en uitgang filteren
  2. SQL-injecties vermijden
  3. Cross-Site Scripting (XSS) vermijden
  4. Het vermijden van cross-site aanvraagvervalsing (CSRF)
  5. Bestandsbelichting vermijden
  6. Foutopsporingsinformatie en -hulpmiddelen tijdens productie voorkomen
  7. Veilige verbinding via TLS gebruiken

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.

Wilt u meer lezen?

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.

  • Speciale onderwerpen: beveiliging
  • Hoe beveiligde Yii-applicaties te schrijven
  • Gids voor uitgebreide Yii-beveiliging

In Closing

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.

Gerelateerde Links

  • Yii Best Beveiligingspraktijken
  • Yii-basisbeveiligingsklasse 
  • Yii2 Developer Exchange