CSRF 및 재생 공격을 방지하는 데 유용한 임시 관리자 PHP 라이브러리입니다.
Nonce가 방지하려고 하는 취약점을 설명하는 여러 기사와 비디오를 찾을 수 있습니다.
그러나 많은 PHP nonce 라이브러리는 너무 제한적이며 일부 프레임워크와 결합되어 사용하기 어렵거나 작동 방식을 이해하기 어려운 것 같습니다.
pedroac/nonce
이러한 문제를 해결하려고 노력합니다.
이를 통해 임의의 PSR-16 구현을 선택하여 nonce, nonce 값 생성기, 만료 간격 및 시계 시스템을 재정의하는 DateTime
공급자까지 임시로 저장할 수 있습니다(이 기능은 단위 테스트에 사용됩니다).
또한 입력을 관리하고, 임의의 nonce 이름 및 값을 생성하고, 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 ; >
nonce 캐시 저장소 외에도 임의 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 사용자의 개인 요청 응답으로 개발되었습니다.