Une bibliothèque PHP de gestionnaire de noms occasionnels utile pour empêcher les attaques CSRF et par relecture.
On peut trouver plusieurs articles et vidéos expliquant les vulnérabilités que l'on tente occasionnellement de prévenir :
Il semble cependant que de nombreuses bibliothèques PHP occasionnelles soient trop restrictives, associées à certains frameworks, difficiles à utiliser ou difficiles à comprendre comment elles fonctionnent.
pedroac/nonce
essaie de résoudre ces problèmes.
Il permet de choisir n'importe quelle implémentation PSR-16 pour stocker temporairement les noms occasionnels, les générateurs de valeurs occasionnels, les intervalles d'expiration et même un fournisseur DateTime
pour remplacer le système d'horloge (cette fonctionnalité est utilisée pour les tests unitaires).
Il fournit également des aides pour gérer les entrées, générer des noms et des valeurs de noms occasionnels aléatoires, vérifier les jetons soumis par rapport au nom occasionnel et générer des éléments HTML.
Exécutez la commande :
composer require pedroac/nonce
Les formulaires HTML peuvent être testés à l'aide d'un serveur Web intégré PHP.
Depuis le dossier php/examples
exécutez la commande :
php -S localhost:8000
Utilisez l'URL http://localhost:8000/ dans un navigateur.
<?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>
Le nom occasionnel expire automatiquement lorsque le jeton est vérifié avec la classe 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 ; >
Outre le stockage du cache des noms occasionnels, il est possible de sélectionner le générateur de valeurs aléatoires des noms occasionnels et l'intervalle d'expiration :
<?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 ' )
);
Il est également possible de créer un nom occasionnel avec un nom spécifié :
$ user_id = $ _SESSION [ ' user_id ' ];
$ tokenName = "{ $ user_id } _form " ;
$ nonce = $ manager -> create ( $ tokenName );
La source d'entrée par défaut NonceForm
est $_POST, mais elle accepte n'importe quelle entrée de tableau :
$ form = new NonceForm (
' token ' ,
new NoncesManager (
new FilesystemCache
),
filter_input_array ( INPUT_GET ) // use $_GET
);
Exécutez à partir du dossier racine de la bibliothèque :
php/vendor/bin/phpunit php/tests/ -c php/tests/configuration.xml
Si les tests ont réussi, php/tests/coverage-html
devrait avoir le rapport de couverture de code.
Exécutez à partir du dossier racine de la bibliothèque :
sh scripts/generate-docs.sh
La documentation générée doit se trouver dans le dossier docs
.
Il doit être utilisé SemVer pour le versioning.
pedroac/nonce est publié sous la licence publique MIT.
Voir la LICENCE ci-jointe pour plus de détails.
La bibliothèque a été développée en tant que réponse à une demande privée formulée par un utilisateur de Stackoverflow.