مكتبة PHP لإدارة غير مفيدة لمنع هجمات CSRF وإعادة التشغيل.
قد نجد العديد من المقالات ومقاطع الفيديو التي تشرح نقاط الضعف التي يحاول الأشخاص غير المتخصصين منعها:
على الرغم من ذلك، يبدو أن العديد من مكتبات PHP غير مقيدة للغاية، إلى جانب بعض الإطارات، ويصعب استخدامها أو يصعب فهم كيفية عملها.
يحاول pedroac/nonce
حل هذه المشكلات.
يسمح باختيار أي تطبيق PSR-16 للتخزين مؤقتًا لمولدات القيم noces وفترات انتهاء الصلاحية وحتى موفر DateTime
لتجاوز نظام الساعة (يتم استخدام هذه الميزة لاختبارات الوحدة).
كما يوفر أيضًا مساعدين لإدارة المدخلات، وإنشاء أسماء وقيم عشوائية، والتحقق من الرموز المميزة المقدمة مقابل الرقم، وإنشاء عناصر HTML.
قم بتشغيل الأمر:
composer require pedroac/nonce
يمكن اختبار نماذج HTML باستخدام خادم ويب PHP مدمج.
من مجلد php/examples
قم بتشغيل الأمر:
php -S localhost:8000
استخدم عنوان URL http://localhost:8000/ في المتصفح.
<?php
require __DIR__ . ' /../vendor/autoload.php ' ;
use Symfony Component Cache Simple FilesystemCache ;
use pedroac nonce NoncesManager ;
use pedroac nonce Form HtmlNonceField ;
use pedroac nonce Form NonceForm ;
// this handles automatically the input and nonce management
$ form = new NonceForm (
' token ' , // the HTML input name
new NoncesManager (
new FilesystemCache // a PsrSimpleCacheCacheInterface implementation
)
);
// this will be used to generate a HTML input element
$ htmlField = new HtmlNonceField ( $ form );
if ( $ form -> isSubmittedValid ()) {
/**
* handle the success:
* - if all form input is valid, show success page;
* - otherwise, show an error page and the form again;
*/
}
if ( $ form -> isSubmittedInvalid ()) {
/**
* handle failure:
* - don't show the form again;
* - show an error message;
*/
}
<form method=" POST ">
<?= $ htmlField ?>
<!-- more HTML -->
<input type="submit" name="myform" value="Submit" />
</form>
تنتهي صلاحية الرقم nonce تلقائيًا عند التحقق من الرمز المميز باستخدام فئة NonceForm
.
<?php
require __DIR__ . ' /../vendor/autoload.php ' ;
use Symfony Component Cache Simple FilesystemCache ;
use pedroac nonce NoncesManager ;
$ manager = new NoncesManager ( new FilesystemCache );
$ isValidToken = false ;
$ isValidForm = false ;
$ wasSubmitted = filter_has_var ( INPUT_POST , ' myform ' );
$ tokenName = filter_input ( INPUT_POST , ' token_name ' );
$ tokenValue = filter_input ( INPUT_POST , ' token_value ' ) ?? '' ;
if ( $ tokenName ) {
$ isValidToken = $ manager -> verifyAndExpire ( $ tokenName , $ tokenValue );
}
if ( $ wasSubmitted && $ isValidToken ) {
// validate input
}
if (! $ wasSubmitted || (! $ isValidForm && $ isValidToken )) {
$ nonce = $ manager -> create ();
}
<?php if ( $ nonce ) : ?>
<input type="hidden"
name="token_name"
value=" <?= htmlspecialchars ( $ nonce -> getName ()) ?> " />
<input type="hidden"
name="token_value"
value=" <?= htmlspecialchars ( $ nonce -> getValue ()) ?> " />
<input type="submit" name="myform" value="Submit" />
<?php endif ; >
إلى جانب تخزين ذاكرة التخزين المؤقت nonces، من الممكن تحديد منشئ قيمة nonce العشوائية والفاصل الزمني لانتهاء الصلاحية:
<?php
require __DIR__ . ' /../vendor/autoload.php ' ;
use Symfony Component Cache Simple ArrayCache ;
use pedroac nonce NoncesManager ;
use pedroac nonce Random HexRandomizer ;
$ manager = new NoncesManager (
new ArrayCache ( 60 ),
new HexRandomizer ( 32 ), // a pedroacnonceRandom implementation
new DateInterval ( ' PT3H ' )
);
من الممكن أيضًا إنشاء nonce باسم محدد:
$ user_id = $ _SESSION [ ' user_id ' ];
$ tokenName = "{ $ user_id } _form " ;
$ nonce = $ manager -> create ( $ tokenName );
مصدر الإدخال الافتراضي NonceForm
هو $_POST، لكنه يقبل أي إدخال للصفيف:
$ form = new NonceForm (
' token ' ,
new NoncesManager (
new FilesystemCache
),
filter_input_array ( INPUT_GET ) // use $_GET
);
تشغيل من المجلد الجذر للمكتبة:
php/vendor/bin/phpunit php/tests/ -c php/tests/configuration.xml
إذا كانت الاختبارات ناجحة، فيجب أن يكون لدى php/tests/coverage-html
تقرير تغطية الكود.
تشغيل من المجلد الجذر للمكتبة:
sh scripts/generate-docs.sh
يجب أن تكون الوثائق التي تم إنشاؤها داخل المجلد docs
.
وينبغي استخدامه SemVer للإصدارات.
يتم إصدار Pedroac/nonce بموجب ترخيص MIT العام.
راجع الترخيص المرفق للحصول على التفاصيل.
تم تطوير المكتبة كاستجابة لطلب خاص بواسطة مستخدم Stackoverflow.