PHP 5.x-Polyfill für random_bytes()
und random_int()
erstellt und verwaltet von Paragon Initiative Enterprises.
Obwohl diese Bibliothek in früheren Versionen von PHP funktionieren sollte , werden wir nur Probleme berücksichtigen, die für unterstützte PHP-Versionen relevant sind. Wenn Sie eine nicht unterstützte PHP-Version verwenden, aktualisieren Sie bitte so schnell wie möglich.
Obwohl diese Bibliothek von einigen Sicherheitsexperten der PHP-Community untersucht wurde, besteht immer die Möglichkeit, dass wir etwas übersehen haben. Bitten Sie Ihre bevorzugten vertrauenswürdigen Hacker, es auf Implementierungsfehler und Bugs zu untersuchen, bevor Sie überhaupt darüber nachdenken, es in der Produktion einzusetzen.
Verwenden Sie nicht den Master-Zweig, sondern eine stabile Version.
Informationen zum Hintergrund dieser Bibliothek finden Sie in unserem Blogbeitrag zum Generieren zufälliger Ganzzahlen und Zeichenfolgen in PHP.
Wenn PHP keine sicheren Zufallsdaten generieren kann, löst diese Bibliothek eine Exception
aus. Es wird niemals auf unsichere Zufallsdaten zurückgreifen. Sollte dies weiterhin passieren, aktualisieren Sie sofort auf eine neuere PHP-Version.
Mit Komponist:
# For libraries and frameworks that support PHP 5 but may be used by # other software that only supports PHP 7: composer require paragonie/random_compat:>=2 # For software that explicitly needs PHP 5 support: composer require paragonie/random_compat:<9.99
Signiertes PHP-Archiv:
Ab Version 1.2.0 liefern wir mit jeder stabilen Version auf Github auch ein ECDSA-signiertes PHP-Archiv aus.
Laden Sie die Dateien .phar
, .phar.pubkey
und .phar.pubkey.asc
herunter.
( Empfohlen , aber nicht erforderlich) Überprüfen Sie die PGP-Signatur von .phar.pubkey
(in der .asc
Datei enthalten) mithilfe des öffentlichen PGP-Schlüssels für Paragon Initiative Enterprises.
Extrahieren Sie sowohl die Dateien .phar
als auch .phar.pubkey
in dasselbe Verzeichnis.
require_once "/path/to/random_compat.phar";
Wenn eine neue Version veröffentlicht wird, müssen Sie nur die .phar
Datei ersetzen; Der .pubkey
ändert sich nicht (es sei denn, unser Signaturschlüssel wird jemals kompromittiert).
Manuelle Installation:
Laden Sie eine stabile Version herunter.
Extrahieren Sie die Dateien in Ihr Projekt.
require_once "/path/to/random_compat/lib/random.php";
Der Einstiegspunkt sollte direkt lib/random.php
sein, nicht eine der anderen Dateien in /lib
.
Diese Bibliothek stellt die in PHP 7 hinzugefügten CSPRNG-Funktionen für die Verwendung in PHP 5-Projekten bereit. Ihr Verhalten sollte identisch sein.
versuche es mit {$string = random_bytes(32); } Catch (TypeError $e) {// Nun, es ist eine Ganzzahl, also ist dies unerwartet.die("Ein unerwarteter Fehler ist aufgetreten"); } Catch (Error $e) {// Dies ist auch unerwartet, da 32 eine vernünftige Ganzzahl ist.die("Ein unerwarteter Fehler ist aufgetreten"); } Catch (Exception $e) {// Wenn Sie diese Meldung erhalten, ist der CSPRNG fehlgeschlagen. hard.die("Konnte keine zufällige Zeichenfolge generieren. Ist unser Betriebssystem sicher?"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
versuche es mit {$int = random_int(0, 255); } Catch (TypeError $e) {// Nun, es ist eine Ganzzahl, also ist dies unerwartet.die("Ein unerwarteter Fehler ist aufgetreten"); } Catch (Error $e) {// Dies ist auch unerwartet, da 0 und 255 beide vernünftige Ganzzahlen sind.die("Ein unerwarteter Fehler ist aufgetreten"); } Catch (Exception $e) {// Wenn Sie diese Meldung erhalten, ist der CSPRNG fehlgeschlagen. hard.die("Konnte keinen zufälligen Int generieren. Ist unser Betriebssystem sicher?"); }var_dump($int);// int(47)
Bei der Behandlung von Ausnahmen und Fehlern müssen Sie die Unterschiede zwischen PHP 5 und PHP7 berücksichtigen.
Die Unterschiede:
Das Abfangen Error
funktioniert, solange sie vor Exception
abgefangen werden.
Das Abfangen Exception
hat ein anderes Verhalten, ohne dass zuvor Error
abgefangen wird.
Es gibt keine tragbare Möglichkeit, alle Fehler/Ausnahmen abzufangen.
Fangen Sie Error
immer vor Exception
ab.
Versuchen Sie es mit {return random_int(1, $userInput); } Catch (TypeError $e) {// Das ist in Ordnung, solange „Error“ vor „Exception“ abgefangen wird.throw new Exception('Please enter a number!'); } Catch (Error $e) {// Dies ist erforderlich, wenn Sie nichts tun müssen, einfach rethrow.throw $e; } Catch (Exception $e) {// Dies ist optional und kann möglicherweise weggelassen werden, wenn Sie keine Fehler// während der Generierung behandeln möchten.throw new InternalServerErrorException('Ups, unser Server ist kaputt und kann keine Zufallsdaten generieren.',500 ,$e); }
Wenn eine Ausnahme ausgelöst wird, ist Ihr Betriebssystem nicht sicher.
Wenn Sie Windows verwenden, stellen Sie sicher, dass Sie mcrypt aktivieren.
Wenn Sie ein anderes Betriebssystem verwenden, stellen Sie sicher, /dev/urandom
lesbar ist.
FreeBSD-Jails müssen /dev/urandom
vom Host-Betriebssystem aus verfügbar machen
Wenn Sie open_basedir
verwenden, stellen Sie sicher, dass /dev/urandom
zulässig ist
Diese Bibliothek greift nicht auf einen unsicheren Zufallszahlengenerator zurück (und akzeptiert auch keine Patches dafür).
Wenn Sie ein Projekt verwenden, dessen Composer.json eine Zeile wie diese enthält
"require" { ... "paragonie/random_compat": "~1.1", ... }
...und wenn Sie dann versuchen, random_compat 2 hinzuzufügen (oder eine andere Bibliothek, die explizit random_compat 2 erfordert, wie z. B. diese sichere PHP-Verschlüsselungsbibliothek), erhalten Sie einen Versionskonflikt.
Die Lösung besteht darin, das Projekt dazu zu bringen, seine Anforderungszeichenfolge zu aktualisieren, um die Verwendung von Version 2 und höher zu ermöglichen, anstatt Benutzer fest auf Version 1 zu sperren.
"erfordern" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
Hinweis : Es gibt eine spezielle Version namens 9.99.99
, die diese Bibliothek dazu bringt, nichts zu tun, sondern nur auf PHP 7 installierbar ist.
Wenn Sie Software (z. B. eine Bibliothek) schreiben, die PHP 5 unterstützt, aber möglicherweise von Software verwendet wird, die dies nicht unterstützt, sollten Sie die Installation von 9.99.99
zulassen. Der obige Unterschied ist das, was Sie wollen.
Wenn Sie umgekehrt Software schreiben, die (an und für sich) PHP 5 unterstützt, möchten Sie nicht, dass 9.99.99 installiert wird, also sollten Sie stattdessen diese Änderung vornehmen:
"erfordern" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
Um die Installation der „leeren“ Version 9.99.99
zu vermeiden, können Sie replace
in Ihrer Root composer.json
hinzufügen:
"replace": { "paragonie/random_compat": "9.99.99" },
Wenn Sie den PHP Archive (Phar)-Ansatz anstelle von Composer verwenden und eine Fehlermeldung erhalten, die besagt, dass die manifeste Leselänge {int1}
sein sollte {int2}
sein sollte, ist die Phar-Erweiterung möglicherweise nicht aktiviert.
In diesem Kommentar finden Sie spezifische Anleitungen zur Behebung dieses Problems.
Dieses Projekt wäre nicht annähernd so hervorragend wie heute, wenn es nicht die Beiträge der folgenden Personen gäbe:
@AndrewCarterUK (Andrew Carter)
@asgrim (James Titcumb)
@bcremer (Benjamin Cremer)
@chriscct7 (Chris Christoff)
@CodesInChaos (Christian Winnerlein)
@ConnorVG (Connor S. Parks)
@cs278 (Chris Smith)
@cweagans (Cameron Eagans)
@dd32 (Dion Hulse)
@geggleto (Glenn Eggleton)
@glensc (Elan Ruusamäe)
@GrahamCampbell (Graham Campbell)
@ircmaxell (Anthony Ferrara)
@jdevalk (Joost de Valk)
@jedisct1 (Frank Denis)
@juliangut (Julián Gutiérrez)
@kelunik (Niklas Keller)
@lt (Leigh)
@MasonM (Mason Malone)
@menkaff (Mehran NikNafs)
@mmeyer2k (Michael M)
@narfbg (Andrey Andreev)
@nicolas-grekas (Nicolas Grekas)
@ocean90 (Dominik Schilling)
@oittaa
@oucil (Kevin Farley)
@philios33 (Phil Nicholls)
@redragonx (Stephen Chavez)
@relaxnow (Junge Baukema)
@rchouinard (Ryan Chouinard)
@rugk
@SammyK (Sammy Kaye Powers)
@scottchiefbaker (Scott Baker)
@skyosev (Stoyan Kyosev)
@sthen (Stuart Henderseon)
@stof (Christophe Coevoet)
@teohhanhui (Teoh Han Hui)
@tom-- (Tom Worster)
@tsyr2ko
@trowski (Aaron Piotrowski)
@twistor (Chris Lepannen)
@vinkla (Vincent Klaiber)
@voku (Lars Moelleken)
@xabbuh (Christian Flothmann)
Wenn Ihr Unternehmen diese Bibliothek in seinen Produkten oder Dienstleistungen verwendet, könnten Sie daran interessiert sein, einen Supportvertrag von Paragon Initiative Enterprises abzuschließen.