PHP 5.x polyfill لـ random_bytes()
و random_int()
تم إنشاؤها وصيانتها بواسطة Paragon Innovation 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 موقّع من ECDSA مع كل إصدار ثابت على Github.
قم بتنزيل الملفات .phar
و .phar.pubkey
و .phar.pubkey.asc
.
( موصى به ولكن ليس مطلوبًا) تحقق من توقيع PGP لـ .phar.pubkey
(الموجود في ملف .asc
) باستخدام مفتاح PGP العام لـ Paragon Innovation 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) {// حسنًا، إنه عدد صحيح، لذا فهو غير متوقع.die("حدث خطأ غير متوقع"); } Catch (Error $e) {// وهذا أيضًا غير متوقع لأن 32 عدد صحيح صحيح ("حدث خطأ غير متوقع")؛ } Catch (Exception $e) {// إذا تلقيت هذه الرسالة، فهذا يعني فشل CSPRNG hard.die("تعذر إنشاء سلسلة عشوائية. هل نظام التشغيل لدينا آمن؟"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
حاول {$int = Random_int(0, 255); } Catch (TypeError $e) {// حسنًا، إنه عدد صحيح، لذا فهو غير متوقع.die("حدث خطأ غير متوقع"); } Catch (Error $e) {// وهذا أيضًا غير متوقع لأن 0 و255 كلاهما أعداد صحيحة معقولة.die("حدث خطأ غير متوقع"); } Catch (Exception $e) {// إذا تلقيت هذه الرسالة، فهذا يعني فشل CSPRNG hard.die("Could not generator int 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('الرجاء إدخال رقم!'); } Catch (Error $e) {// هذا مطلوب، إذا لم تكن بحاجة إلى القيام بأي شيء، فقط rethrow.throw $e; } Catch (Exception $e) {// هذا اختياري وقد يتم حذفه إذا كنت لا ترغب في معالجة الأخطاء // أثناء الإنشاء.throw new InternalServerErrorException('عفوًا، خادمنا معطل ولا يمكنه إنشاء أي بيانات عشوائية.',500 ،$ه)؛ }
إذا تم طرح استثناء، فهذا يعني أن نظام التشغيل الخاص بك غير آمن.
إذا كنت تستخدم نظام التشغيل Windows، فتأكد من تمكين mcrypt.
إذا كنت تستخدم أي نظام تشغيل آخر، فتأكد من أن /dev/urandom
قابل للقراءة.
تحتاج سجون FreeBSD إلى كشف /dev/urandom
من نظام التشغيل المضيف
إذا كنت تستخدم open_basedir
، فتأكد من السماح بـ /dev/urandom
هذه المكتبة لا (ولن تقبل أي تصحيحات) تعود إلى مولد أرقام عشوائية غير آمن.
إذا كنت تستخدم مشروعًا يحتوي على سطر مثل هذا في ملف Composer.json الخاص به
"require" { ... "paragonie/random_compat": "~1.1", ... }
...ثم تحاول إضافة Random_compat 2 (أو مكتبة أخرى تتطلب بشكل صريح Rand_compat 2، مثل مكتبة تشفير PHP الآمنة هذه)، سوف تحصل على تعارض في الإصدار.
الحل هو جعل المشروع يقوم بتحديث سلسلة المتطلبات الخاصة به للسماح باستخدام الإصدار 2 وما فوق بدلاً من تقييد المستخدمين على الإصدار 1.
"يتطلب" { ...- "paragonie/random_compat": "~1.1"،+ "paragonie/random_compat": ">=1"،... }
ملاحظة : هناك إصدار خاص يسمى 9.99.99
يجعل هذه المكتبة لا تفعل شيئًا، ولكنها قابلة للتثبيت فقط على PHP 7.
إذا كنت تكتب برنامجًا (مكتبة مثلاً) يدعم PHP 5، ولكن قد يتم استخدامه بواسطة برنامج لا يدعم PHP، فستحتاج إلى السماح بتثبيت 9.99.99
. الفرق أعلاه هو ما تريد.
على العكس من ذلك، إذا كنت تكتب برنامجًا يدعم (في حد ذاته) PHP 5، فأنت لا تريد تثبيت 9.99.99، لذا ستحتاج إلى إجراء هذا التغيير بدلاً من ذلك:
"يتطلب" { ...- "paragonie/random_compat": "~1.1"،+ "paragonie/random_compat": ">=1 <9.99"،... }
لتجنب تثبيت الإصدار "الفارغ" 9.99.99
يمكنك إضافة قسم replace
في جذر composer.json
الخاص بك:
"replace": { "paragonie/random_compat": "9.99.99" },
إذا كنت تستخدم أسلوب PHP Archive (Phar) بدلاً من Composer، وتلقيت رسالة خطأ تفيد بأن "طول قراءة البيان كان {int1}
يجب أن يكون {int2}
"، فقد لا يتم تمكين ملحق Phar.
راجع هذا التعليق للحصول على إرشادات محددة حول كيفية حل هذه المشكلة.
لم يكن لهذا المشروع أن يكون ممتازًا كما هو اليوم لولا مساهمات الأفراد التاليين:
@AndrewCarterUK (أندرو كارتر)
@asgrim (جيمس تيتكومب)
@bcremer (بنجامين كريمر)
@chriscct7 (كريس كريستوف)
@CodesInChaos (كريستيان وينرلاين)
@ConnorVG (كونور س. باركس)
@cs278 (كريس سميث)
@cweagans (كاميرون إيجانز)
@ dd32 (ديون هولس)
@geggleto (جلين إيجلتون)
@glensc (إيلان روساماي)
@جراهامكامبل (جراهام كامبل)
@ircmaxell (أنتوني فيرارا)
@jdevalk (جوست دي فالك)
@jedisct1 (فرانك دينيس)
@juliangut (جوليان جوتيريز)
@kelunik (نيكلاس كيلر)
@lt (لي)
@MasonM (ميسون مالون)
@menkaff (مهران نيكنفس)
@ mmeyer2k (مايكل م)
@narfbg (أندري أندريف)
@نيكولاس غريكاس (نيكولاس غريكاس)
@ocean90 (دومينيك شيلينغ)
@oittaa
@oucil (كيفن فارلي)
@philios33 (فيل نيكولز)
@redragonx (ستيفن تشافيز)
@relaxnow (الصبي بوكيما)
@rchouinard (ريان شوينارد)
@rugk
@SammyK (سامي كاي باورز)
@scott Chiefbaker (سكوت بيكر)
@skyosev (ستويان كيوسيف)
@sthen (ستيوارت هندرسون)
@stof (كريستوف كوفيت)
@teohhanhui (تيوه هان هوي)
@توم-- (توم ورستر)
@tsyr2ko
@ تروسكي (آرون بيوتروسكي)
@twistor (كريس ليبانين)
@فينكلا (فنسنت كلايبر)
@فوكو (لارس موليكين)
@xabbuh (كريستيان فلوثمان)
إذا كانت شركتك تستخدم هذه المكتبة في منتجاتها أو خدماتها، فقد تكون مهتمًا بشراء عقد دعم من Paragon Innovation Enterprises.