Polyfill PHP 5.x untuk random_bytes()
dan random_int()
dibuat dan dikelola oleh Paragon Initiative Enterprises.
Meskipun perpustakaan ini seharusnya berfungsi di versi PHP sebelumnya, kami hanya akan mempertimbangkan masalah yang relevan dengan versi PHP yang didukung. Jika Anda menggunakan versi PHP yang tidak didukung, harap tingkatkan versi sesegera mungkin.
Meskipun perpustakaan ini telah diperiksa oleh beberapa pakar keamanan di komunitas PHP, selalu ada kemungkinan kita melewatkan sesuatu. Silakan minta peretas tepercaya favorit Anda untuk memeriksa kesalahan dan bug implementasi sebelum berpikir untuk menerapkannya dalam produksi.
Jangan gunakan cabang master, gunakan rilis stabil.
Untuk latar belakang perpustakaan ini, silakan merujuk ke postingan blog kami tentang Menghasilkan Integer dan String Acak di PHP.
Jika PHP tidak dapat menghasilkan data acak dengan aman, perpustakaan ini akan mengeluarkan Exception
. Itu tidak akan pernah kembali ke data acak yang tidak aman. Jika hal ini terus terjadi, segera upgrade ke versi PHP yang lebih baru.
Dengan Komposer:
# 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
Arsip PHP yang Ditandatangani:
Mulai versi 1.2.0, kami juga mengirimkan Arsip PHP bertanda tangan ECDSA dengan setiap rilis stabil di Github.
Unduh file .phar
, .phar.pubkey
, dan .phar.pubkey.asc
.
( Direkomendasikan tetapi tidak wajib) Verifikasi tanda tangan PGP .phar.pubkey
(terdapat dalam file .asc
) menggunakan kunci publik PGP untuk Paragon Initiative Enterprises.
Ekstrak file .phar
dan .phar.pubkey
ke direktori yang sama.
require_once "/path/to/random_compat.phar";
Saat versi baru dirilis, Anda hanya perlu mengganti file .phar
; .pubkey
tidak akan berubah (kecuali kunci penandatanganan kami pernah disusupi).
Instalasi Manual:
Unduh rilis stabil.
Ekstrak file ke dalam proyek Anda.
require_once "/path/to/random_compat/lib/random.php";
Titik masuknya harus lib/random.php
secara langsung, bukan file lain di /lib
.
Pustaka ini memaparkan fungsi CSPRNG yang ditambahkan di PHP 7 untuk digunakan dalam proyek PHP 5. Perilaku mereka harus sama.
coba {$string = random_bytes(32); } catch (TypeError $e) {// Ya, ini bilangan bulat, jadi ini IS yang tidak terduga.die("Terjadi kesalahan yang tidak terduga"); } catch (Error $e) {// Ini juga tidak terduga karena 32 adalah bilangan bulat yang wajar.die("Terjadi kesalahan yang tidak terduga"); } catch (Pengecualian $e) {// Jika Anda mendapatkan pesan ini, CSPRNG gagal hard.die("Tidak dapat menghasilkan string acak. Apakah OS kami aman?"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
coba {$int = random_int(0, 255); } catch (TypeError $e) {// Ya, ini bilangan bulat, jadi IS ini tidak terduga.die("Terjadi kesalahan yang tidak terduga"); } catch (Error $e) {// Ini juga tidak terduga karena 0 dan 255 merupakan bilangan bulat yang masuk akal.die("Telah terjadi kesalahan yang tidak terduga"); } catch (Pengecualian $e) {// Jika Anda mendapatkan pesan ini, CSPRNG gagal hard.die("Tidak dapat menghasilkan int acak. Apakah OS kami aman?"); }var_dump($int);// int(47)
Saat menangani pengecualian dan kesalahan, Anda harus memperhitungkan perbedaan antara PHP 5 dan PHP7.
Perbedaannya:
Catching Error
berfungsi, asalkan ditangkap sebelum Exception
.
Catching Exception
memiliki perilaku berbeda, tanpa sebelumnya menangkap Error
.
Tidak ada cara portabel untuk menangkap semua kesalahan/pengecualian.
Selalu tangkap Error
sebelum Exception
.
coba {return random_int(1, $userInput); } catch (TypeError $e) {// Tidak apa-apa, asalkan `Error` tertangkap sebelum `Exception`.throw new Exception('Silakan masukkan nomor!'); } catch (Error $e) {// Ini diperlukan, jika Anda tidak perlu melakukan apa pun, cukup rethrow.throw $e; } catch (Pengecualian $e) {// Ini opsional dan mungkin dihilangkan jika Anda tidak ingin menangani kesalahan// selama pembuatan.throw new InternalServerErrorException('Ups, server kami rusak dan tidak dapat menghasilkan data acak apa pun.',500 ,$e); }
Jika Pengecualian muncul, maka sistem operasi Anda tidak aman.
Jika Anda menggunakan Windows, pastikan Anda mengaktifkan mcrypt.
Jika Anda menggunakan OS lain, pastikan /dev/urandom
dapat dibaca.
Penjara FreeBSD perlu mengekspos /dev/urandom
dari OS host
Jika Anda menggunakan open_basedir
, pastikan /dev/urandom
diizinkan
Pustaka ini tidak (dan tidak akan menerima patch apa pun) kembali ke generator nomor acak yang tidak aman.
Jika Anda menggunakan proyek yang memiliki baris seperti ini di composer.json-nya
"require" { ... "paragonie/random_compat": "~1.1", ... }
...lalu Anda mencoba menambahkan random_compat 2 (atau pustaka lain yang secara eksplisit memerlukan random_compat 2, seperti pustaka enkripsi PHP aman ini), Anda akan mendapatkan konflik versi.
Solusinya adalah membuat proyek memperbarui string persyaratannya agar versi 2 dan yang lebih baru dapat digunakan, alih-alih mengunci pengguna ke versi 1.
"memerlukan" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
Catatan : Ada versi khusus bernama 9.99.99
yang membuat perpustakaan ini tidak melakukan apa pun, tetapi hanya dapat diinstal di PHP 7.
Jika Anda sedang menulis perangkat lunak (misalnya perpustakaan) yang mendukung PHP 5, namun mungkin digunakan oleh perangkat lunak yang tidak mendukungnya, Anda sebaiknya mengizinkan instalasi 9.99.99
. Perbedaan di atas adalah yang Anda inginkan.
Sebaliknya, jika Anda menulis perangkat lunak yang (dengan sendirinya) mendukung PHP 5, Anda tidak ingin menginstal 9.99.99, jadi Anda sebaiknya melakukan perubahan ini:
"memerlukan" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
Untuk menghindari instalasi versi "kosong" 9.99.99
Anda dapat menambahkan bagian replace
di root composer.json
Anda:
"replace": { "paragonie/random_compat": "9.99.99" },
Jika Anda menggunakan pendekatan Arsip PHP (Phar) dan bukan Komposer, dan Anda mendapatkan pesan kesalahan yang menyatakan "panjang baca manifes adalah {int1}
seharusnya {int2}
", ekstensi Phar mungkin tidak diaktifkan.
Lihat komentar ini untuk panduan spesifik tentang cara memperbaiki masalah ini.
Proyek ini tidak akan sebaik sekarang jika tidak ada kontribusi dari individu-individu berikut:
@AndrewCarterUK (Andrew Carter)
@asgrim (James Titcumb)
@bcremer (Benjamin Cremer)
@chriscct7 (Chris Christoff)
@CodesInChaos (Pemenang Kristen)
@ConnorVG (Connor S.Taman)
@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 (Boy Baukema)
@rchouinard (Ryan Chouinard)
@rugk
@SammyK (Kekuatan Sammy Kaye)
@scottchiefbaker (Scott Baker)
@skyosev (Stoyan Kyosev)
@sthen (Stuart Henderseon)
@stof (Christophe Coevoet)
@teohhanhui (Teoh Han Hui)
@tom-- (Tom Terburuk)
@ tsyr2ko
@trowski (Aaron Piotrowski)
@twistor (Chris Lepannen)
@vinkla (Vincent Klaiber)
@voku (Lars Moelleken)
@xabbuh (Christian Flothmann)
Jika perusahaan Anda menggunakan perpustakaan ini dalam produk atau layanannya, Anda mungkin tertarik untuk membeli kontrak dukungan dari Paragon Initiative Enterprises.