ไลบรารี PHP nonce manager มีประโยชน์ในการป้องกัน CSRF และการโจมตีซ้ำ
เราอาจพบบทความและวิดีโอหลายรายการที่อธิบายช่องโหว่ที่ noces พยายามป้องกัน:
อย่างไรก็ตาม ดูเหมือนว่าไลบรารี PHP nonces จำนวนมากจะเข้มงวดเกินไป ประกอบกับเฟรมเวิร์กบางอย่าง ใช้งานยากหรือเข้าใจวิธีการทำงานได้ยาก
pedroac/nonce
พยายามแก้ไขปัญหาเหล่านั้น
ช่วยให้สามารถเลือกการใช้งาน PSR-16 เพื่อจัดเก็บ nonces ตัวสร้างค่า nonces ช่วงเวลาหมดอายุ และแม้แต่ผู้ให้บริการ DateTime
เพื่อแทนที่ระบบนาฬิกาชั่วคราว (คุณสมบัตินี้ใช้สำหรับการทดสอบหน่วย)
นอกจากนี้ยังมีตัวช่วยในการจัดการอินพุต สร้างชื่อและค่า nonces แบบสุ่ม ตรวจสอบโทเค็นที่ส่งเทียบกับ nonce และสร้างองค์ประกอบ 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