PHP 5.x polyfill สำหรับ random_bytes()
และ random_int()
สร้างและดูแลโดย Paragon Initiative Enterprises
แม้ว่าไลบรารีนี้ ควรจะ ทำงานใน PHP เวอร์ชันก่อนหน้า แต่เราจะพิจารณาเฉพาะปัญหาที่เกี่ยวข้องกับเวอร์ชัน PHP ที่รองรับเท่านั้น หากคุณใช้ PHP เวอร์ชันที่ไม่รองรับ โปรดอัปเกรดโดยเร็วที่สุด
แม้ว่าไลบรารีนี้จะได้รับการตรวจสอบโดยผู้เชี่ยวชาญด้านความปลอดภัยบางคนในชุมชน PHP แต่ก็มีโอกาสที่เราจะมองข้ามบางสิ่งบางอย่างอยู่เสมอ โปรดขอให้แฮ็กเกอร์ที่เชื่อถือได้คนโปรดของคุณค้นหาข้อผิดพลาดและจุดบกพร่องในการใช้งาน ก่อนที่จะคิดถึงการติดตั้งใช้งานจริง
อย่าใช้สาขาหลัก ให้ใช้รุ่นเสถียร
สำหรับความเป็นมาของไลบรารีนี้ โปรดดูบล็อกโพสต์ของเราเกี่ยวกับการสร้างจำนวนเต็มและสตริงแบบสุ่มใน PHP
หาก PHP ไม่สามารถสร้างข้อมูลแบบสุ่มได้อย่างปลอดภัย ไลบรารีนี้จะทำให้เกิด Exception
มันจะไม่ถอยกลับไปสู่ข้อมูลสุ่มที่ไม่ปลอดภัย หากยังเกิดเหตุการณ์เช่นนี้อยู่ ให้อัปเกรดเป็น PHP เวอร์ชันใหม่ทันที
ด้วยผู้แต่ง:
# 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
ไฟล์เก็บถาวร PHP ที่ลงนามแล้ว:
ในเวอร์ชัน 1.2.0 เรายังจัดส่ง PHP Archive ที่ลงนามโดย ECDSA พร้อมด้วยการเผยแพร่ที่เสถียรแต่ละรายการบน Github
ดาวน์โหลดไฟล์ .phar
, .phar.pubkey
และ .phar.pubkey.asc
( แนะนำ แต่ไม่จำเป็น) ตรวจสอบลายเซ็น PGP ของ .phar.pubkey
(ที่มีอยู่ในไฟล์ .asc
) โดยใช้คีย์สาธารณะ PGP สำหรับ Paragon Initiative Enterprises
แตกไฟล์ทั้ง .phar
และ .phar.pubkey
ไปยังไดเร็กทอรีเดียวกัน
require_once "/path/to/random_compat.phar";
เมื่อมีการออกเวอร์ชันใหม่ คุณจะต้องแทนที่ไฟล์ .phar
เท่านั้น .pubkey
จะไม่เปลี่ยนแปลง (เว้นแต่ว่ารหัสลงนามของเราจะถูกบุกรุก)
การติดตั้งด้วยตนเอง:
ดาวน์โหลดรุ่นที่เสถียร
แตกไฟล์ลงในโครงการของคุณ
require_once "/path/to/random_compat/lib/random.php";
จุดแรกเข้าควรเป็น lib/random.php
โดยตรง ไม่ใช่ไฟล์อื่นๆ ใน /lib
ไลบรารีนี้เปิดเผยฟังก์ชัน CSPRNG ที่เพิ่มใน PHP 7 เพื่อใช้ในโครงการ PHP 5 พฤติกรรมของพวกเขาควรจะเหมือนกัน
ลอง {$string = Random_bytes(32); } catch (TypeError $e) {// มันคือจำนวนเต็ม ดังนั้นนี่คือสิ่งที่ไม่คาดคิด ("เกิดข้อผิดพลาดที่ไม่คาดคิด"); } catch (ข้อผิดพลาด $e) {// นี่เป็นสิ่งที่ไม่คาดคิดเช่นกัน เนื่องจาก 32 เป็นจำนวนเต็มสมเหตุสมผล ("เกิดข้อผิดพลาดที่ไม่คาดคิด"); } catch (ข้อยกเว้น $e) {// หากคุณได้รับข้อความนี้ แสดงว่า CSPRNG ล้มเหลว hard.die("ไม่สามารถสร้างสตริงสุ่มได้ ระบบปฏิบัติการของเราปลอดภัยหรือไม่?"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
ลอง {$int = Random_int(0, 255); } catch (TypeError $e) {// มันคือจำนวนเต็ม ดังนั้นนี่คือ ISไม่คาดคิด.die("เกิดข้อผิดพลาดที่ไม่คาดคิด"); } catch (ข้อผิดพลาด $e) {// นี่เป็นสิ่งที่ไม่คาดคิดเช่นกัน เนื่องจาก 0 และ 255 เป็นจำนวนเต็มที่เหมาะสมทั้งคู่ ("เกิดข้อผิดพลาดที่ไม่คาดคิด"); } catch (ข้อยกเว้น $e) {// หากคุณได้รับข้อความนี้ แสดงว่า CSPRNG ล้มเหลว hard.die("ไม่สามารถสร้าง int แบบสุ่มได้ ระบบปฏิบัติการของเราปลอดภัยหรือไม่?"); }var_dump($int);// int(47)
เมื่อจัดการกับข้อยกเว้นและข้อผิดพลาด คุณต้องคำนึงถึงความแตกต่างระหว่าง PHP 5 และ PHP7
ความแตกต่าง:
Catching Error
ใช้งานได้ตราบใดที่ถูกจับได้ก่อน Exception
Catching Exception
มีพฤติกรรมที่แตกต่างกัน โดยไม่เคยจับ Error
มาก่อน
ไม่มี วิธีแบบพกพาที่จะตรวจจับข้อผิดพลาด/ข้อยกเว้นทั้งหมด
ให้จับ Error
ก่อน Exception
เสมอ
ลอง {return Random_int(1, $userInput); } catch (TypeError $e) {// ไม่เป็นไร ตราบใดที่ตรวจพบ `Error` ก่อน `Exception`.throw new Exception('Please enter a number!'); } catch (ข้อผิดพลาด $e) {// จำเป็น หากคุณไม่จำเป็นต้องทำอะไร เพียงแค่ rethrow.throw $e; } catch (ข้อยกเว้น $e) {// นี่เป็นทางเลือกและอาจละไว้หากคุณไม่ต้องการจัดการกับข้อผิดพลาด// ในระหว่างการสร้าง โยนใหม่ InternalServerErrorException('อ๊ะ เซิร์ฟเวอร์ของเราขัดข้องและไม่สามารถสร้างข้อมูลสุ่มใด ๆ ได้',500 ,$อี); -
หากมีข้อยกเว้นเกิดขึ้น แสดงว่าระบบปฏิบัติการของคุณไม่ปลอดภัย
หากคุณใช้ Windows ตรวจสอบให้แน่ใจว่าคุณเปิดใช้งาน mcrypt
หากคุณใช้ระบบปฏิบัติการอื่น ตรวจสอบให้แน่ใจว่า /dev/urandom
สามารถอ่านได้
คุก FreeBSD จำเป็นต้องเปิดเผย /dev/urandom
จากระบบปฏิบัติการโฮสต์
หากคุณใช้ open_basedir
ให้แน่ใจว่าอนุญาต /dev/urandom
ไลบรารีนี้ไม่ (และจะไม่ยอมรับแพตช์ใดๆ) ถอยกลับไปยังตัวสร้างตัวเลขสุ่มที่ไม่ปลอดภัย
หากคุณใช้โปรเจ็กต์ที่มีบรรทัดเช่นนี้ใน composer.json
"require" { ... "paragonie/random_compat": "~1.1", ... }
... จากนั้นคุณลองเพิ่ม Random_compat 2 (หรือไลบรารีอื่นที่ต้องใช้ Random_compat 2 อย่างชัดเจน เช่น ไลบรารีการเข้ารหัส PHP ที่ปลอดภัยนี้) คุณจะได้รับข้อขัดแย้งของเวอร์ชัน
วิธีแก้ไขคือให้โปรเจ็กต์อัปเดตสตริงข้อกำหนดเพื่ออนุญาตให้ใช้เวอร์ชัน 2 ขึ้นไปแทนผู้ใช้ฮาร์ดล็อคเป็นเวอร์ชัน 1
"จำเป็นต้อง" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... -
หมายเหตุ : มีเวอร์ชันพิเศษที่เรียกว่า 9.99.99
ซึ่งทำให้ไลบรารีนี้ไม่ทำอะไรเลย แต่สามารถติดตั้งได้บน PHP 7 เท่านั้น
หากคุณกำลังเขียนซอฟต์แวร์ (เช่น ไลบรารี่) ที่รองรับ PHP 5 แต่ซอฟต์แวร์อาจไม่รองรับ คุณจะต้องอนุญาตให้ติดตั้ง 9.99.99
ได้ ความแตกต่างข้างต้นคือสิ่งที่คุณต้องการ
ในทางกลับกัน หากคุณกำลังเขียนซอฟต์แวร์ที่รองรับ PHP 5 (ในตัวมันเอง) คุณไม่ต้องการติดตั้ง 9.99.99 ดังนั้นคุณจะต้องทำการเปลี่ยนแปลงนี้แทน:
"จำเป็นต้อง" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... -
เพื่อหลีกเลี่ยงการติดตั้ง "ว่าง" เวอร์ชัน 9.99.99
คุณสามารถเพิ่มส่วน replace
ใน root composer.json
ของคุณ:
"replace": { "paragonie/random_compat": "9.99.99" },
หากคุณใช้แนวทาง PHP Archive (Phar) แทนที่จะเป็น Composer และคุณได้รับข้อความแสดงข้อผิดพลาดแจ้งว่า "manifest read length was {int1}
should be {int2}
" ส่วนขยาย Phar อาจไม่ได้เปิดใช้งาน
ดูความคิดเห็นนี้สำหรับคำแนะนำเฉพาะเกี่ยวกับวิธีแก้ไขปัญหานี้
โครงการนี้คงไม่ได้เข้าใกล้ความเป็นเลิศเหมือนทุกวันนี้ หากไม่ได้รับการสนับสนุนจากบุคคลต่อไปนี้:
@AndrewCarterUK (แอนดรูว์ คาร์เตอร์)
@asgrim (เจมส์ ทิตคัมบ์)
@bcremer (เบนจามิน ครีมเมอร์)
@chriscct7 (คริส คริสตอฟ)
@CodesInChaos (คริสเตียน วินเนอร์ลีน)
@ConnorVG (คอนเนอร์ เอส. พาร์คส์)
@cs278 (คริส สมิธ)
@cweagans (คาเมรอน อีแกนส์)
@dd32 (ดิออน ฮัลส์)
@geggleto (เกลนน์ เอ็กเกิลตัน)
@glensc (เอลัน รุสซาเม่)
@GrahamCampbell (เกรแฮม แคมป์เบลล์)
@ircmaxell (แอนโทนี่ เฟอร์รารา)
@jdevalk (จูสต์ เดอ วาลค์)
@jedisct1 (แฟรงค์ เดนิส)
@juliangut (จูเลียน กูติเอร์เรซ)
@kelunik (นิคลาส เคลเลอร์)
@lt (ลีห์)
@MasonM (เมสัน มาโลน)
@menkaff (เมห์ราน นิคนาฟส์)
@mmeyer2k (ไมเคิล เอ็ม)
@narfbg (อันเดรย์ อันดรีฟ)
@nicolas-grekas (นิโคลัส เกรคัส)
@ocean90 (โดมินิค ชิลลิง)
@oittaa
@oucil (เควิน ฟาร์ลีย์)
@philios33 (ฟิล นิโคลส์)
@redragonx (สตีเฟน ชาเวซ)
@relaxnow (บอย โบเคมา)
@rchouinard (ไรอัน ชูยนาร์ด)
@รักค
@SammyK (พลังของ Sammy Kaye)
@scottchiefbaker (สกอตต์ เบเกอร์)
@skyosev (สโตยาน เคียวเซฟ)
@sthen (สจวร์ต เฮนเดอร์สัน)
@stof (คริสตอฟ โคเอโวเอต)
@teohhanhui (แต้ว ฮัน ฮุย)
@tom-- (ทอม เวอร์สเตอร์)
@tsyr2ko
@trowski (แอรอน ปิโอโทรสกี้)
@twistor (คริส เลปันเนน)
@vinkla (วินเซนต์ ไคลเบอร์)
@voku (ลาร์ส โมเอลเลเกน)
@xabbuh (คริสเตียน โฟลธมันน์)
หากบริษัทของคุณใช้ไลบรารีนี้ในผลิตภัณฑ์หรือบริการของตน คุณอาจสนใจซื้อสัญญาการสนับสนุนจาก Paragon Initiative Enterprises