一個隨機數管理器 PHP 函式庫,可用於防止 CSRF 和重播攻擊。
我們可能會找到幾篇文章和影片來解釋隨機數字試圖防止的漏洞:
然而,許多 PHP nonces 庫似乎限制太多,再加上一些框架,難以使用或難以理解它們是如何運作的。
pedroac/nonce
試圖解決這些問題。
它允許選擇任何 PSR-16 實作來暫時儲存隨機數、隨機數值產生器、過期間隔,甚至使用DateTime
提供者來覆蓋時鐘系統(此功能用於單元測試)。
它還提供幫助程式來管理輸入、產生隨機隨機數字名稱和值、根據隨機數字驗證提交的令牌並產生 HTML 元素。
運行命令:
composer require pedroac/nonce
HTML 表單可以使用 PHP 內建 Web 伺服器進行測試。
從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>
當使用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 ; >
除了隨機數快取儲存之外,還可以選擇隨機隨機數值產生器和過期間隔:
<?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 ' )
);
也可以建立具有指定名稱的隨機數:
$ 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 用戶發出的私人請求回應而開發的。