Programmierung mit Yii2 Sicherheit

Wenn Sie fragen: "Was ist Yii?" Auschecken Einführung in das Yii-Framework, Hier werden die Vorteile von Yii beschrieben und ein Überblick über Yii 2.0 gegeben.

In dieser Programmierserie mit Yii2 leite ich die Leser beim Einsatz des Yii2-Frameworks für PHP. Wenn Sie vorhaben, Ihre Anwendung für die Öffentlichkeit zugänglich zu machen, müssen Sie sie sicher sein. Am besten planen Sie dies von Anfang an. Glücklicherweise macht das Starten mit einem Framework wie Yii dies viel einfacher als es sonst wäre. Wie in Features von Yii angegeben:

Yii verfügt über zahlreiche Sicherheitsmaßnahmen, um Ihre Webanwendungen vor Angriffen zu schützen, z. B. SQL-Injection, Cross-Site-Scripting (XSS), Cross-Site Request Forgery (CSRF) und Manipulation von Cookies.

In diesem Tutorial werde ich Sie durch die grundlegenden Sicherheitskonzepte innerhalb des Yii-Anwendungsframeworks führen. Wenn Sie interessiert sind, werden zukünftige Episoden dazu beitragen, die Anwendung Meeting Planner, die in unserer Startup-Serie enthalten ist, abzusichern, während sie sich dem Alpha-Release nähert.

Bevor wir anfangen, denken Sie daran, ich versuche, an den folgenden Diskussionen teilzunehmen. Wenn Sie eine Frage oder ein Thema haben, schreiben Sie bitte einen Kommentar oder kontaktieren Sie mich unter Twitter @reifman. 

Hinweis: Wenn Sie die Lücke zwischen den Episoden der Programmierserie Yii bemerkt haben, liegt dies daran, dass ich es musste Gehirnoperation im letzten Jahr. Vielen Dank für Ihre Geduld und Ihre Unterstützung. Es ist schön, regelmäßig wieder zu schreiben. Ich freue mich darauf, Yii2 weiter zu behandeln.

Die Grundlagen der Sicherheit mit Yii

Wenn Sie sich mit der Sicherheit von Webanwendungen noch nicht auskennen, müssen Sie viel über die Angebote von Yii erfahren. Ich werde mein Bestes geben, um einen Überblick zu bieten, der auf der besten Yii 2.0-Dokumentation basiert. Das Yii-Team unterteilt Sicherheit in sieben Schlüsselbereiche:

  1. Authentifizierung
  2. Genehmigung
  3. Mit Passwörtern arbeiten
  4. Kryptographie
  5. Ansichten Sicherheit
  6. Auth-Clients
  7. Best Practices

Beginnen wir mit dem Eintauchen in diese.

1. Authentifizierung

Die Präsentation Yii Framework Security von Ilko Kacharov enthält einige hilfreiche Folien, die das Ziel der Authentifizierung (und des folgenden Unterthemas, Autorisierung) zusammenfassen. Im Wesentlichen sind hier die Fragen, die diese Themen beantworten müssen:

  • Wer ist der Benutzer??
  • Ist der Benutzer, von dem er sagt, dass er es ist??
  • Ist der Benutzer berechtigt, auf eine Ressource zuzugreifen?
  • Ist der Benutzer berechtigt, eine Aktion auszuführen?
  • Ist der Benutzer berechtigt, eine Aktion für eine Ressource auszuführen?

Die Benutzermodell- und Identitätsschnittstelle

Die yii / web / User-Klasse von Yii ist in yii \ web \ IdentityInterface integriert, um den Authentifizierungsstatus des Benutzers in Ihrer Anwendung zu verwalten. 

Im letzten November habe ich ein Tutorial über Yii's Advanced Application Template geschrieben. Einer der Vorteile der erweiterten Vorlage ist die vorgefertigte Integration des Benutzermodells mit ActiveRecord und Ihrer Datenbank. Ihre Anwendung bietet somit eine datenbankgestützte Authentifizierung, die sofort einsatzbereit ist.

Mit dem Benutzermodell können Sie sich programmgesteuert an- und abmelden:

  • login () legt die angegebene Identität fest und merkt sich den Authentifizierungsstatus in Sitzung und Cookie.
  • logout () markiert den Benutzer als Gast und löscht die relevanten Informationen aus Sitzung und Cookie.
  • setIdentity (): Ändert die Benutzeridentität, ohne Sitzung oder Cookie zu berühren, am besten für die API-Funktionalität.

Die $ isGuest-Eigenschaft bestimmt, ob sich der aktuelle Benutzer angemeldet hat oder nicht. Wenn der Benutzer abgemeldet ist, ist er null, gibt jedoch ansonsten eine Instanz des IdentityInterface zurück.

Im Wesentlichen benötigen Sie eine User-Klasse, die ActiveRecord erweitert und Methoden zur Unterstützung von IdentityInterface implementiert.

 $ token]);  / ** * @return int | string aktuelle Benutzer-ID * / public function getId () return $ this-> id;  / ** * @return string Aktueller Benutzerauthentifizierungsschlüssel * / public function getAuthKey () return $ this-> auth_key;  / ** * @param string $ authKey * @return boolean, wenn auth key für den aktuellen Benutzer gültig ist. 

Bevor ein Benutzer erstellt wird, generiert die Anwendung außerdem eine zufällige Zeichenfolge als Autorisierungsschlüssel. Dies kann in E-Mails "Passwort vergessen" oder anderen E-Mail-basierten Login-Links verwendet werden:

Klasse User erweitert ActiveRecord implementiert IdentityInterface … public-Funktion beforeSave ($ insert) if (parent :: beforeSave ($ insert)) if ($ this-> isNewRecord) $ this-> auth_key = \ Yii :: $ app- > Sicherheit-> generateRandomString ();  return true;  falsch zurückgeben; 

Genehmigung

Yii bietet zwei integrierte Ansätze für die Autorisierung. Die einfachere Zugriffssteuerungsliste (ACL) bestimmt, welche Benutzer oder Prozesse Aktionen für eine Ressource ausführen dürfen, und die intensivere rollenbasierte Zugriffssteuerung (Role-Based Access Control, RBAC) unterstützt Sie bei der Verwaltung des Zugriffs, indem Sie Rollen definieren. In RBAC können nur Benutzer oder Systemaufgaben mit bestimmten Rollen bestimmte Aktionen ausführen.

Zugriffskontrollliste

Die ACL wird manchmal auch als Access Control Filter (ACF) bezeichnet. Yii bietet ACL-Unterstützung innerhalb von yii \ filters \ AccessControl. Ideal für Anwendungen, die nur eine einfache Zugriffskontrolle benötigen. Es ist das, was ich bisher in Meeting Planner verwendet habe.

Hier ist ein Beispiel für den üblichen SiteController, der ein Zugriffsverhalten konfiguriert, um den Zugriff auf verfügbare Aktionen (häufig Seiten) zu filtern. In diesem Fall handelt die ACL beim Anmelden, Anmelden und Abmelden. Das '?' zeigt an, dass jeder Benutzer auf Anmelde- und Anmeldeseiten zugreifen kann '@' zeigt an, dass nur angemeldete oder authentifizierte Benutzer Zugriff haben. Im folgenden Beispiel können sich nur angemeldete Benutzer abmelden:

benutze yii \ web \ Controller; Verwenden Sie yii \ filters \ AccessControl; Die Klasse SiteController erweitert die Controller public function behaviors () return ['access' => ['class' => AccessControl :: className (), 'only' => ['login', 'logout', 'signup'], 'rules' => [['' allow '=> true,' actions '=> [' login ',' signup '],' Rollen '=> ['? '],], [' allow '=> true, 'Aktionen' => ['Abmelden'], 'Rollen' => ['@'],],],],];  //…

Wenn der Controller wächst, muss jede neue Aktion innerhalb der AccessControl-Regeln definiert werden. Wenn Ihre Anwendung wächst, muss jeder Controller und alle seine Aktionen aus Sicherheitsgründen eine ACL-Filterung integrieren.

Rollenbasierte Zugriffssteuerung

Die rollenbasierte Zugriffskontrolle (Role-Based Access Control, RBAC) bietet ein robusteres Authentifizierungssystem, erfordert jedoch viel mehr Vorentwurf für Design und Implementierung. 

Mit RBAC definieren Sie die Authentifizierung über Rollen, die vererbt werden können (oder nicht), und Sie wenden Rollen auf Benutzer an. Sie können auch Regeln für Rollen definieren. RBAC-Implementierungen können recht komplex werden.

In der folgenden Abbildung können Administratoren beliebige Aufgaben ausführen, und Autoren können einen Beitrag erstellen und ihre eigenen Beiträge aktualisieren. Jane ist ein Administrator, so dass sie die Aufgaben von Administratoren erledigen kann, und John ist nur ein Autor:

Yii implementiert das, was es "einen allgemeinen hierarchischen RBAC nach dem NIST-RBAC-Modell" nennt. Die RBAC-Funktionalität wird von der authManager-Anwendungskomponente bereitgestellt.

Ich werde hier mit RBAC nicht zu viel vertiefen, aber ich hoffe auf ein zukünftiges Tutorial. Wieder ist es an den redaktionellen Göttinnen, mit ihnen zu sprechen, ist nie einfach:

über PopSugar

Um RBAC gründlich zu implementieren, müssen Sie:

  • Rollen und Berechtigungen definieren
  • Stellen Sie Beziehungen zwischen Ihren Rollen und Berechtigungen her
  • Definiere eventuelle Regeln
  • Ordnen Sie den Rollen und Berechtigungen Regeln zu
  • und schließlich den Benutzern Rollen zuweisen

Den Code, der erforderlich ist, um den Beginn eines RBAC-Systems zu ermöglichen, finden Sie unten:

authManager; // add "createPost" Berechtigung $ createPost = $ auth-> createPermission ('createPost'); $ createPost-> description = 'Einen Beitrag erstellen'; $ auth-> add ($ createPost); // add "updatePost" Erlaubnis $ updatePost = $ auth-> createPermission ('updatePost'); $ updatePost-> description = 'Beitrag aktualisieren'; $ auth-> add ($ updatePost); // Rolle "author" hinzufügen und dieser Rolle die Berechtigung "createPost" zuweisen $ author = $ auth-> createRole ('author'); $ auth-> add ($ author); $ auth-> addChild ($ author, $ createPost); // füge die Rolle "admin" hinzu und gib dieser Rolle die Berechtigung "updatePost" // sowie die Berechtigungen der Rolle "author" $ auth-> add ($ admin); $ auth-> addChild ($ admin, $ updatePost); $ auth-> addChild ($ admin, $ author); // Weisen Sie den Benutzern Rollen zu. 1 und 2 sind IDs, die von IdentityInterface :: getId () // zurückgegeben werden, die normalerweise in Ihrem Benutzermodell implementiert sind. $ auth-> zuweisen ($ author, 2); $ auth-> zuweisen ($ admin, 1); 

Um RBAC zu implementieren, müssen Sie darauf vorbereitet sein, eine Menge Code im Voraus zu schreiben, oder wenn Ihre Anwendung wächst. Andernfalls verwaltet Yii die Authentifizierung gemäß dem von Ihnen definierten Authentifizierungs-Framework. Mit anderen Worten: Design und Codierung im Vorfeld bieten eine solide und detaillierte Authentifizierung.

Mit Passwörtern arbeiten

Wie Mark Zuckerberg im Juni erfuhr, speichern einige Websites die Benutzerkennwörter in Klartext, aber Ihre sollten dies nicht tun. Um Zuckerberg gegenüber fair zu sein, wurde mein Facebook-Account einmal gehackt, weil PHPList dasselbe getan hatte - vor den Tagen der Passwort-Manager. Auf jeden Fall macht es Yii einfach, Kennwörter zu verschlüsseln und sicher zu überprüfen.

Die Verschlüsselungsfunktion von Yii verwendet bcrypt, um Hashes für Ihr Passwort zu generieren. Wenn sich Leute registrieren, wird ein Hash erstellt:

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

Wenn der Benutzer versucht, sich anzumelden, wird er gehasht und mit dem Hash in der Datenbank verglichen:

if (Yii :: $ app-> getSecurity () -> validatePassword ($ password, $ hash)) // Alles in Ordnung, Benutzer in anmelden else // falsches Passwort

Sie können Yii jedoch auch zum Schutz von Daten mit Kryptographie verwenden.

Kryptographie

Das Yii Framework bietet eine Reihe von integrierten Funktionen zur Unterstützung des Datenschutzes:

  • Funktionen zur Generierung von Kennwörtern und Schlüsseln wie generateRandomKey, generateRandomString und generateSalt.
  • Passwortüberprüfung: generatePasswordHash () und validatePassword ().
  • Verschlüsselung / Entschlüsselung: encryptByKey (), decryptByKey (), encryptByPassword () und decryptByPassword ().
  • Schlüsselableitung unter Verwendung von Standardalgorithmen: pbkdf2 () und hkdf ().
  • Verhinderung von Datenmanipulationen: hashData () und validateData ().

Ansichten Sicherheit

Alle Daten, die von Benutzern stammen, sind möglicherweise mit Angriffen wie SQL-Injektion oder Cross-Browser-Skripts infiziert. Es ist wichtig, dass alle Daten, die Sie in Ansichten an Benutzer ausgeben, bereinigt werden. Yii bietet hierfür einige Methoden an. 

Zuerst ist es da Html :: encode, was im Grunde jede SQL oder Scripting bricht:

 
Name)?>

Und für größere Textblöcke gibt es eine Integration in die HtmlPurifier-Bibliothek:

 
text)?>

Login über Auth Client

Yii bietet auch die Möglichkeit der Authentifizierung durch Drittanbieter, was besonders nützlich ist, um Social Login über Google, Facebook, Twitter usw. zu unterstützen.

Ich habe mehrere Tutorials für Envato Tuts + zur Verwendung von AuthClient innerhalb des Yii Framework mit sozialen Logins geschrieben:

  • Startup erstellen: Onramp mit AuthClient vereinfachen (ausstehende Veröffentlichung)
  • So programmieren Sie mit Yii2: Google-Authentifizierung
  • Programmieren mit Yii2: AuthClient-Integration mit Twitter, Google und anderen Netzwerken

Ich habe festgestellt, dass Social Login für Meeting Planner sehr gut funktioniert. Neue Benutzer können mit der Planung eines Meetings ohne Kennwort beginnen.

Best Practices

Yii empfiehlt außerdem einige bewährte Methoden für die Sicherheit von Webanwendungen. Und seine Dokumentation bietet für jeden eine gute Einführung in diese Themen.

  1. Ein- und Ausgabe filtern
  2. SQL-Injektionen vermeiden
  3. Cross-Site Scripting (XSS) vermeiden
  4. Cross-Site Request Forgery (CSRF) vermeiden
  5. Vermeiden Sie das Belichten von Dateien
  6. Vermeiden von Debug-Informationen und Tools bei der Produktion
  7. Sichere Verbindung über TLS verwenden

Die ersten drei Themen oben werden durch die oben beschriebene Kodierung gut verwaltet Ansichten Sicherheit

Yii bietet auch einen integrierten CSRF-Schutz für allgemeine Aktivitäten - und kann bei Bedarf deaktiviert werden. In Meeting Planner musste ich CSRF deaktivieren, um Nachrichten zu akzeptieren, die von Mailguns API-Diensten gesendet wurden.

In Bezug auf die Dateibestimmung hilft das Framework dabei, dies zu minimieren, indem alle Eingabeaufforderungen in die Anforderungsdatei web / index.php geleitet werden. Dies beschränkt die Notwendigkeit, Anwendungscode zu schreiben, der Anforderungen filtert, erheblich. Es ist gut an einem Ort gelungen.

Schließlich können Sie mit HTTPS Ihre Verbindungen schützen und mit Yii zusammenarbeiten, um Benutzer zu schützen. Anfang dieses Jahres habe ich über Let's Encrypt geschrieben. Sie können dieses Tutorial auch verwenden, um HTTPS für Yii-Apps zu installieren.

Möchten Sie mehr lesen??

Wenn Sie an weiterführendem Material zu diesen Themen interessiert sind, bietet das Yii 1.x Framework diese Posts an. Sicherlich sind sie älter und weniger spezifisch für Yii 2, aber sie bleiben nützlich.

  • Spezielle Themen: Sicherheit
  • Wie schreibe ich sichere Yii-Anwendungen?
  • Yii Sicherheits-erweiterte Anleitung

Abschließend

Ich hoffe, Ihnen hat meine Sicherheitsübersicht für Yii2 gefallen. Wenn Sie Aspekte der meisten oder aller oben genannten Konzepte in Ihre Anwendung integrieren, sollten Sie über einen grundsätzlich sicheren Web-Service verfügen. Unter Umständen möchten Sie sich mit unserer PHP-Reihe "Startup mit PHP" vertraut machen, um einige dieser Sicherheitspraktiken in der Praxis umzusetzen.

Achten Sie auf kommende Tutorials in unserer Programmierserie "Programmieren mit Yii2", während wir weiter in verschiedene Aspekte des Frameworks eintauchen. Ich freue mich über Feature- und Themenanfragen. Sie können sie in den Kommentaren unten posten oder mich auf meiner Lookahead Consulting-Website per E-Mail benachrichtigen.

Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, folgen Sie mir @reifman auf Twitter oder besuchen Sie meine Instructor-Seite. Meine Ausbilderseite enthält alle Artikel dieser Serie, sobald sie veröffentlicht sind. 

Lassen Sie uns zusammenarbeiten, um die redaktionellen Göttinnen glücklich zu machen.

ähnliche Links

  • Yii Beste Sicherheitspraktiken
  • Yii Basis-Sicherheitsklasse 
  • Yii2 Developer Exchange