Einfache Techniken zum Sperren Ihrer Website

Ein wichtiger Teil der PHP-Entwicklungspraxis ist immer zu bedenken, dass Sicherheit nicht etwas ist, das Sie einfach in Ihrem lokalen Ladengeschäft kaufen können. Die Gewährleistung der Sicherheit Ihrer Webanwendungen ist ein Prozess, der im Laufe der Zeit ständig überprüft, überwacht und gehärtet werden muss.


Einführung

Während die Verwendung von Filtern und Validieren von Daten ein Teil des Sicherheitsprozesses ist, sollte ein Webentwickler wissen, dass Randomisierung, Verschleierung und Kryptografie in PHP die Sicherheit von Webanwendungen beeinflussen können. Dieses Tutorial führt Sie durch einige einfache Techniken zum Erstellen und Verwenden zufälliger oder eindeutiger Werte in Ihren Webanwendungen, einen Blick und die Anwendung einiger allgemeiner Verschleierungstechniken sowie einen tieferen Einblick in die Wissenschaft der Kryptologie und ihre Verwendung in PHP.


Was du lernen wirst

  • Wie man mit PHP zufällige Werte generiert
  • Zufällige Passwörter generieren
  • Salting Passwörter und Authentifizierung des Benutzers
  • Verschleierung in PHP, eine Übersicht
  • Kryptographie in PHP und seinen Anwendungen

Zufällige Werte erzeugen

Dictionary.com definiert Randomisierung als:

"-verb: zufällig ordnen oder auswählen, wie in einer Probe oder in einem Experiment, insbesondere um die durch irrelevante Variablen verursachten Verzerrungen und Interferenzen zu reduzieren; machen Sie zufällig."

Die Generierung von Zufallszahlen wird auf verschiedene Weise bestimmt, jedoch fehlt den rechnerischen Generatoren die "wahre" Zufälligkeit, wie sie in der Natur oder im elektronischen Rauschen (dem unscharfen, kreischenden Schwarz-Weiß-Kanal im Fernsehen) zu sehen ist. Diese berechneten Werte werden als pseudozufällig betrachtet.

PHP bietet uns verschiedene Möglichkeiten, zufällige Werte zu erstellen. Schauen wir uns einige der beliebtesten Funktionen an.

 

Die zwei Funktionen rand () und mt_rand () sind wahrscheinlich die am häufigsten verwendeten Funktionen, um eine Menge von Zufallszahlen in PHP zu generieren. Die Funktion rand (); ist ein älterer Generator und wird wegen nicht verwendet mt_rand (); Dies ist schneller, zuverlässiger und kann auf einigen Plattformen mit einem höheren maximalen Integerwert verarbeitet werden. Die Funktion str_shuffle () macht genau das, was Sie erwarten würden, es mischt einen String, der an ihn übergeben wurde.

 "; print mt_rand (0, 20); // gibt eine zufällige ganze Zahl zwischen 0 und 20 aus"
"; // Beispiele für die Verwendung von rand () print rand (); // Standardecho"
"; print rand (0, 25); // gibt eine zufällige Ganzzahl zwischen 0 und 25 aus"
"; // Beispiel für die Verwendung von str_shuffle $ string = 'abcefghijklmnopqrstuvwxyz'; print str_shuffle ($ string); // mischt $ string?>

Das rand () und mt_rand () Funktionen akzeptieren beide zwei Parameter wobei $ min ist die niedrigste Ganzzahl, mit der begonnen wird, und $ max die größte ganze Zahl sein, die mit enden soll. Die Funktion str_shuffle nimmt einen Parameter, einen String, der eine gemischte Mutation des Strings ausgibt. Es verhält sich so, als würden Sie ein Kartenspiel mischen.

Während mt_rand (); wird eine zufällige ganze Zahl ausspucken, und str_shuffle Eine Zeichenfolge wird gemischt, eine Funktion, die häufig zum Erstellen zufälliger eindeutiger Werte verwendet wird uniqid (). Auf diese Weise wird eine eindeutige Kennung mit Vorzeichen basierend auf der aktuellen Zeit in Mikrosekunden (über php.net) generiert. Die Verwendung dieser Funktion ist beim Erstellen von Sitzungs-Tokens und sogar Formularschlüsseln hilfreich, wie in Sichern Sie Ihre Formulare mit Formularschlüsseln.

 "; print uniqid (" NETTUTS ", TRUE); // Hinzufügen eines zusätzlichen Präfixes und Setzen von more_entropy auf TRUE?>

Die Funktion uniqid () akzeptiert zwei Parameter. Der erste fügt ein Präfix an die Ergebnisse an, während der zweite Parameter, wenn er auf TRUE gesetzt ist, zusätzliche Entropie am Ende des zurückgegebenen Werts hinzufügt.


Zufällige Passwörter generieren

Es gibt eine Fülle von Beispielen im Web, die zufällige Passwörter generieren, die alle gute Arbeit leisten. "Aber warum", fragen Sie, "müsste ich ein zufälliges Passwort generieren?" Nun, die Antwort ist ganz einfach: Sie müssen sich also nicht darauf verlassen, dass sich der Endbenutzer beim Start mit einem weniger sicheren Passwort versorgt. Das Generieren von Zufallskennwörtern ist sehr nützlich bei Benutzerregistrierungen oder wenn ein Benutzer eine Anforderung stellt, weil er sein Kennwort vergessen hat. Dadurch wird zu Beginn eines Benutzererlebnisses auf Ihrer Website ein sicheres Kennwort sichergestellt oder Codezeilen können reduziert werden, wenn ein Benutzer erneut Zugriff erhalten muss.

Sehen wir uns einige Beispiele an: Beispiel 1

 

Dieses Beispiel mischt einen String mit str_shuffle und gibt einen String innerhalb eines gezählten Bereichs zurück. Wenn Sie also ein aus acht Zeichen bestehendes Passwort generieren möchten, würden Sie 8 an die Funktion randompassword oder randompassword (8) aus Ihrem Quellcode übergeben.

Beispiel 2

 

Im Vergleich dazu nimmt Beispiel 1 einen statischen String und mischt ihn auf, dann gibt er ihn zurück, Beispiel 2 fügt einen dynamischeren Geschmack hinzu (mmm lecker). In Beispiel 2 ist die gemischte Zeichenfolge nicht mehr statisch, sondern ändert sich mit jeder Generation. Während das erste Beispiel in den meisten Fällen ausreicht, um ein sicheres Kennwort zu generieren, können Sie im zweiten Beispiel sicherstellen, dass sich die Zeichenfolgenlänge und -zeichen mit der Verwendung ändern, was die Wahrscheinlichkeit einer Duplizierung erheblich verringert.

Wenn die Verwendung von sicheren Kennwörtern in einer Webanwendung erzwungen wird, werden Benutzer davon abgehalten, eine Website zu besuchen oder sich zu registrieren. Es ist oft ein Kompromiss zwischen dem Abrufen des gewünschten Datenverkehrs und der Gewährleistung der Sicherheit der Anwendung. Ich empfehle Ihnen, Ihren Benutzern zu erlauben, bei der Anmeldung eigene Kennwörter zu erstellen, oder ihnen die Wahl zwischen den beiden geben.


Bitte reiche mir das Salz. Salting Passwörter für mehr Sicherheit.

Salting-Kennwörter sind ein wirksames Mittel, um die Sicherheit Ihrer Benutzerkonten zu erhöhen, selbst wenn ein Angreifer Zugriff auf Ihre Datenbank erhält, wenn dies richtig ist. Es kann argumentiert werden, dass ein Angreifer mit Zugriff auf das Salt immer noch Ihre Anmeldeinformationen erwerben kann. Obwohl dies der Fall ist, wird die Anwendung einiger Randomisierungstechniken bei der Speicherung von Kennwörtern diesen Prozess extrem schwierig machen, insbesondere wenn die Speicherung von Benutzerinformationen und Inhalten in separate Datenbanken aufgeteilt wird.


Warum und wie?

Dies fällt wiederum unter die "Nichtbeachtung des Endbenutzers, um sich einfache Sicherheitsmaßnahmen zu bieten". In der Regel verwenden Benutzer Kennwörter, die leicht zu merken sind, und verwenden sogar dieselben Kennwörter auf mehreren Websites (ich weiß, richtig !?). Leicht zu merkende Kennwörter sind im Allgemeinen Wörter, die in einem Wörterbuch gefunden werden, und andere Werte (z. B. 12345, QWERTY). Als Entwickler machen wir uns oft über diese Praxis lustig, aber wir können nicht leugnen, dass es einfach so ist.

Damit eine Webanwendung ein Salt in einem Kennwort verwenden kann, muss sie von der Anwendung irgendwo gespeichert werden. Es wird nicht empfohlen, dasselbe Salt für eine gesamte Kennwortdatenbank zu verwenden, sondern einen eindeutigen Salt pro Benutzer zu generieren. Durch das Generieren eines Salt für eine gesamte Datenbank wird die Sicherheit der Webanwendung tatsächlich herabgesetzt. Dies bedeutet, dass ein Angreifer das gesamte Schema beschädigt oder bei Verlust die Datenbank unbrauchbar macht. Das Erstellen eines vollwertigen Mitgliederregistrierungssystems mit allen Schnickschnackern fällt nicht in den Umfang dieses Tutorials. Wir werden jedoch ein einfaches System erstellen, um ein Beispiel zu verwenden. Lassen Sie uns einen Salt erzeugen und einige Randomisierungstechniken anwenden:


1. Die Datenbankverbindung

Hier ist die SQL-Tabelle, die wir verwenden werden.

 CREATE TABLE WENN NICHT 'EXISTS-Benutzer' ('usr_id' int (11) NOT NULL) AUTO_INCREMENT, 'usr_name' varchar (24) NOT NULL, 'usr_pass' varchar (32) NOT NULL, 'usr_email' varchar (255) NOT NULL, 'usr_salt' varchar (255) NOT NULL, PRIMARY KEY ('usr_id')) ENGINE = MyISAM DEFAULT CHARSET = latin1; 
 

2. Die Registrierungsdatei

 Erfolg';  else echo '

Fehler

'; ?>

Gehen wir den PHP-Code durch. Zur Vereinfachung enthalten wir unsere Datenbank-Konfigurationsdatei. Als Nächstes prüft PHP, ob das Formular-HTML übermittelt wurde, indem geprüft wird, ob der HTML-Code verwendet wird $ _POST Variablen sind nicht leer. Wenn sie nicht leer sind, entgeht das Skript den veröffentlichten Formulardaten vom Benutzer und bereitet sie für das Einfügen in die Datenbank vor. Wir erzeugen dann ein einfaches Salz mit uniqid () und mt_rand () und speichern Sie es in der Variablen $ salt_gen. Um unser Passwort zu salzen, kombinieren wir das $ Passwort und dann das Salt. Nächster Schritt: Hashing der kombinierten Variablen mit md5.

"Aber warten Sie! Sie haben auch die E-Mail-Adresse der Benutzer vor der Kennwort- und Salz-Kombination hinzugefügt!" Jep! Ich habe dies getan, weil der Angreifer, wenn ein Angreifer auf irgendeine Weise Zugriff auf meine Datenbank erhält, sicher ist, dass die E-Mail-Adresse im Hash des Kennworts verwendet wird, wenn er Zugriff hat der Quellcode. Wie zufällig und einzigartig ist eine E-Mail-Adresse?

Um den Rest des PHP-Codes zu vervollständigen, fügen wir unsere Variablen in die jeweiligen Datenfelder in die Datenbanktabelle ein und geben dem Benutzer ein Feedback zu Erfolg oder Misserfolg. Nun auf den Rest der Registrierungsdatei, den HTML-Code

      



Hier erstellen wir ein einfaches HTML-Formular, das einen Benutzernamen, eine E-Mail-Adresse und ein Passwort von einem Benutzer erfasst. Nichts Besonderes hier.


3. Authentifizierung des Benutzers

Wir haben jetzt ein einfaches Anmeldeformular, das einen Benutzer zusammen mit seinem gesalzenen Passwort in die Datenbank einfügt. Erstellen Sie eine Anmeldeseite, auf der wir Informationen aus der Datenbank abrufen und den Benutzer authentifizieren müssen. Zuerst das PHP:

 Yippie, wir sind authentifiziert!';  else echo '

Oh nein, wir werden nicht authentifiziert!

'; else echo '

Oh nein, wir sind nicht in der Datenbank!

'; ?>

Grundsätzlich übernehmen wir in der Datei login.php die übergebenen Formularvariablen, greifen die mit dem Benutzernamen verknüpfte Tabellenzeile auf, erstellen das Kennwort aus den Elementen in der Datenbank, in der es erstellt wurde (E-Mail, Pass, Salt), und erneuern diese . Anschließend überprüfen wir die Datenbank erneut auf den Benutzernamen UND den überholten Kennwortwert, um eine Übereinstimmung zu finden, und gibt den Benutzer bei Erfolg oder Misserfolg aus. Zum Schluss noch das HTML:

      


Verschleierung in PHP

Eine einfache, aber komplexe Definition von Verschleierung ist (verwenden Sie die in der Quelle enthaltene Version, wenn Sie den Code ausführen möchten):

 

Wie Sie sehen können, soll dieser Code nicht unterscheidbar sein. Es gibt keine eindeutigen Variablennamen, keine Kommentare, keine Abstände, keine Einrückung, keine eindeutige Reihenfolge und alles in einer Zeile. Obwohl wir den Code nicht unterscheiden können, wissen unsere Maschinen immer noch, was es ist. Es klappt. Diese eine Zeile des Chaos ist einfach echos "Obfusction ist eine Technik, die dazu benutzt wird, Code so zu komplizieren, dass er nicht verständlich ist." Ja, ich kenne die Fehler.

Verschleierung hat Vor- und Nachteile. Ihr Zweck ist es, eine Person davon abzuhalten, herauszufinden, welcher Code auf einen Blick oder für einen bestimmten Zeitraum funktioniert. Dies ist ein Plus für Personen mit geringen bis keinen Kenntnissen der Programmiersprache. Jeder, der ein Grundverständnis von PHP hat, kann jedoch den oben genannten verschleierten Code verbreiten und herausfinden, was er tut. Dies kann nur ein wenig Zeit in Anspruch nehmen. Dies ist einer der Mängel der Verschleierung, es ist keine Form der Verschlüsselung, es ist nur ein Versuch, kryptisch zu sein. Die Verschleierung erhöht normalerweise auch die Dateigröße. Meistens stoßen Sie auf verschleierten Code in proprietärer und bösartiger Software.


Wie kann ich meinen Code verschleiern??

Dies ist eine häufig gestellte Frage. Es gibt hauptsächlich zwei Möglichkeiten, Ihren Code zu verschleiern. Erstens können Sie es von Hand machen. Das Schreiben von verschleiertem Code dauert lange. Das Beispiel, das in diesem Artikel verwendet wurde, dauerte einige Zeit, um zu schreiben, aus den gleichen Gründen, in denen Sie Verschleierung an erster Stelle verwenden (fehlende Struktur, Ordnung usw.). Dies führte sogar zu einigen geringfügigen Fehlern, die ich nicht einmal verfolgen wollte und fixieren. Die zweite Möglichkeit, Ihren Code zu verschleiern, besteht darin, Software zu kaufen, die dies für Sie erledigt. Die Verwendung eines Programms zum Verschleiern von Code ist trivial und kostet natürlich viel Zeit. Einige Software, die behauptet, Ihren Code zu verschleiern, verschlüsselt und / oder kodiert ihn auf eine solche Weise, dass er auf einem Handshake basiert. Häufig finden Sie Software, deren Hersteller nicht einmal garantiert, dass Ihr Code funktioniert, wenn er fertig ist. Auch im Beispiel habe ich eine einfache verwendet Base64 Funktion zum Codieren der Konstruktion der Skriptausgabe.


Einige Verschleierungstipps

  • Behalten Sie immer eine saubere Version der Quelle für sich.
  • Je zufälliger Ihre Technik ist, desto besser.
  • Beseitigen Sie alle Leerzeichen, wo sie nicht benötigt werden.
  • Character Encode druckt / echoed Zeichen und Leerzeichen (d. H. Zitate, dünne Leerzeichen, Apostrophe, Hypens)
  • Je komplexer der Code ist, desto besser.
  • Ignorieren Sie die Struktur, es sei denn, dies wirkt sich nachteilig auf die Funktionsweise des Codes aus (z. B. variable Speicherorte vor dem Aufruf).
  • Verwenden Sie keine unterscheidbaren Variablennamen, Namespaces oder Klassennamen.
  • Je weniger Code Sie wiederverwenden, desto besser
  • Glaube nicht, dass es narrensicher ist

Zu verschleiern oder nicht zu verschleiern?

Das hängt wirklich von Ihrem Plan ab. Insbesondere wenn Sie Ihr PHP-Skript (oder eine andere Software) verkaufen möchten, müssen Sie es lizenzieren. Dies wird eine der vordersten Verteidigungslinien sein, um die Zielgruppe der Software daran zu hindern, das zu tun, was sie wollen. Ein gutes Beispiel für die Lizenzierung finden Sie im Envato Marketplace Wiki. Möglicherweise möchten Sie jedoch einige oder den gesamten Code aus irgendeinem Grund verschleiern. Aufgrund negativer Verschleierungen kann es sich jedoch lohnen, stattdessen nach Verschlüsselung zu suchen, wenn Sie sich wirklich Sorgen um die Sicherheit Ihres Quellcodes machen.


Kryptographie in PHP

Wikipedia.com definiert Kryptographie als:

"die Praxis und das Studium des Versteckens von Informationen."

Kryptographie ist eine große Sache, ob Sie sich dessen bewusst sind oder nicht. In fast allen derzeit eingesetzten Webanwendungen wird Kryptografie (z. B. E-Mail-Clients und Websites) verwendet. Als Entwickler müssen wir über die praktischen Anwendungen der Kryptographie in unserer Software informiert und informiert sein. PHP bietet uns einige grundlegende und praktische Funktionen, mit denen wir Daten verschlüsseln können. In diesem Abschnitt werde ich mich hauptsächlich mit Einweg-Hash-Algorithmen beschäftigen, obwohl ich mich leicht mit der auf Symmetric-Key basierenden Verschlüsselung beschäftige. Es gibt noch viel mehr (Steganographie, Asymmetric-Key, um ein Paar zu nennen).


Der One-Way-Hash

In vielen Fällen verwenden wir One-Way-Hashing, um Kennwörter sicher zu speichern und die Datenintegrität von Dateien zu überprüfen. Um die Mitglieder einer Webanwendung zu authentifizieren, hashieren wir die von Benutzern eingegebenen Passwörter und vergleichen sie mit den gespeicherten Hashwerten der Benutzer. Die gleiche Technik gilt für die Überprüfung der Integrität von Dateien.

SHA-1, 2 und 3

Die SHA-Familie von Hash-Algorithmen ist derzeit die beliebteste, insbesondere SHA-1. Obwohl der SHA-1-Algorithmus eine Schwäche aufweisen kann, ist er noch weit verbreitet.

 "; echo $ hash2."

"// Ausgabe: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c?>

In PHP wird SHA-2 in einer anderen Hinsicht aufgerufen und erfordert PHP 5 größer oder gleich 5.1.2. SHA-2 ist SHA-1 überlegen und kann mit verschiedenen Bitgrößen aufgerufen werden.

 "; echo $ hash_sha384."
"; echo $ hash_sha512."
? „; / * Ausgänge repspectively: sha256: 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc sha384: 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32 sha512: c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a * />

Die Hash-Funktion wird von Hash (Algorithmus, String) aufgerufen. In den neuesten PHP-Versionen kann die Funktion hash () verwendet werden, um beliebige von PHP unterstützte Einweg-Algorithmen (d. H. Md5, sha-1, haval, ghost) aufzurufen. Wenn Sie eine Liste aller registrierten Hash-Algorithmen anzeigen möchten, können Sie Folgendes verwenden:

 = 5.1.2 print_r (hash_algos ()); ?>

SHA-3 wird noch entwickelt und für die Standardisierung in Betracht gezogen. Ein Wettbewerb, um einen guten Kandidaten für den neuen sicheren Hash-Algorithmus zu finden, wurde vom National Institute of Standards and Technology ins Leben gerufen, und die Einreichungen für den Wettbewerb wurden für den 31. Oktober 2008 eingestellt. Ein ziemlich beliebter Beitrag namens Skein verfügt über ein PHP-Modul Sie können herunterladen (obwohl Sie es selbst kompilieren müssen). Skein wurde von einigen großen Namen aus der Sicherheitsbranche entwickelt, darunter Bruce Schneier, Niels Ferguson und Stefan Lucks, um nur einige zu nennen. Die offizielle Website von Skein finden Sie hier.


Schlüsselbasierte Verschlüsselung

Bei Symmetric-Key-Verschlüsselungsverfahren liegt die Sicherheit der Verschlüsselung hauptsächlich in einem Schlüssel, der von zwei Punkten gemeinsam genutzt wird, an denen die Daten verschlüsselt werden und an denen die Daten entschlüsselt werden. Ein sehr gutes Beispiel dafür, wie dies funktionieren kann, wurde von Christian Beikov im Tutorial "Erstellen einer Crypter-Klasse mit PHP" beschrieben.


HMAC

Im Wesentlichen ist HMAC eine Mischung aus One-Way-Hashing und schlüsselbasierter Verschlüsselung. Die HMAC-Sicherheit hängt von der verwendeten Schlüsselgröße und der Stärke der Hash-Funktion ab, mit der sie berechnet wird. Sie können diese Methode etwas mit Salting-Passwörtern vergleichen.

 ";?>

Alles einpacken

Nun, was für eine Reise! Werte zufallsgenerieren, zufällige Passwörter generieren, Benutzer einsalzen, speichern und authentifizieren, Verschleierung, Krypto… scheint viel zu akzeptieren. Aber es lohnt sich! Es ist wichtig zu wissen, welche Art von Sicherheit Sie in Ihre Webanwendungen implementieren und wie Sie diese schützen. Darüber hinaus ist es wichtig, eine kluge Haltung gegenüber diesen Implementierungen zu wahren und nicht zu glauben, dass Sicherheit nur durch wenige Methoden implementiert wird, sondern durch eine Kombination dieser Methoden mit einem Schuss Kreativität.