Pustaka PHP manajer nonce berguna untuk mencegah CSRF dan serangan replay.
Kami mungkin menemukan beberapa artikel dan video yang menjelaskan kerentanan yang coba dicegah oleh nonce:
Namun tampaknya banyak pustaka nonce PHP yang terlalu membatasi, ditambah dengan beberapa kerangka kerja, sulit digunakan atau sulit dipahami cara kerjanya.
pedroac/nonce
mencoba menyelesaikan masalah tersebut.
Hal ini memungkinkan pemilihan implementasi PSR-16 untuk menyimpan sementara nonce, generator nilai nonces, interval kedaluwarsa dan bahkan penyedia DateTime
untuk mengganti sistem jam (fitur ini digunakan untuk pengujian unit).
Ini juga menyediakan pembantu untuk mengelola masukan, menghasilkan nama dan nilai nonce acak, memverifikasi token yang dikirimkan terhadap nonce dan menghasilkan elemen HTML.
Jalankan perintah:
composer require pedroac/nonce
Formulir HTML dapat diuji menggunakan server web bawaan PHP.
Dari folder php/examples
jalankan perintah:
php -S localhost:8000
Gunakan URL http://localhost:8000/ di browser.
<?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 kedaluwarsa secara otomatis ketika token diverifikasi dengan kelas 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 ; >
Selain penyimpanan cache nonce, dimungkinkan untuk memilih generator nilai nonce acak dan interval kedaluwarsa:
<?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 ' )
);
Dimungkinkan juga untuk membuat nonce dengan nama tertentu:
$ user_id = $ _SESSION [ ' user_id ' ];
$ tokenName = "{ $ user_id } _form " ;
$ nonce = $ manager -> create ( $ tokenName );
Sumber input default NonceForm
adalah $_POST, tetapi menerima input array apa pun:
$ form = new NonceForm (
' token ' ,
new NoncesManager (
new FilesystemCache
),
filter_input_array ( INPUT_GET ) // use $_GET
);
Jalankan dari folder root perpustakaan:
php/vendor/bin/phpunit php/tests/ -c php/tests/configuration.xml
Jika pengujian berhasil, php/tests/coverage-html
seharusnya memiliki laporan cakupan kode.
Jalankan dari folder root perpustakaan:
sh scripts/generate-docs.sh
Dokumentasi yang dihasilkan harus berada di dalam folder docs
.
Ini harus digunakan SemVer untuk pembuatan versi.
pedroac/nonce dirilis di bawah lisensi publik MIT.
Lihat LISENSI terlampir untuk rinciannya.
Pustaka ini dikembangkan sebagai respons permintaan pribadi yang dibuat oleh pengguna Stackoverflow.