Skip to content
Extraits de code Groupes Projets
Valider 7f47d636 rédigé par cerdic's avatar cerdic Validation de marcimat
Parcourir les fichiers

Utiliser hash_hmac et hash_equals pour calculer et verifier les jetons...

Utiliser hash_hmac et hash_equals pour calculer et verifier les jetons d'action - c'est un compromis entre rapidite et securite car utiliser les fonction hasher() et verifier() de Spip\Core\Chiffrer apporterait plus de secu sur ces hash, mais avec un prix performance important (~200ms pour calculer un hash et on peut en avoir N dans une page qui contient N formulaires)
On rappelle que la securite des actions ne doit jamais reposer sur ces hash mais sur un appel a autoriser() pour verifier que l'auteur a bien le droit de faire l'action
parent 40b0eecc
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -226,29 +226,31 @@ function caracteriser_auteur($id_auteur = null) { ...@@ -226,29 +226,31 @@ function caracteriser_auteur($id_auteur = null) {
* @param string $alea * @param string $alea
* @return string * @return string
*/ */
function _action_auteur($action, $id_auteur, $pass, $alea) { function _action_auteur(string $action, int $id_auteur, ?string $pass, string $alea): string {
static $sha = []; static $sha = [];
if (!isset($sha[$id_auteur . $pass . $alea])) { $pass = $pass ?? '';
if (!isset($GLOBALS['meta'][$alea])) { $entry = "$action:$id_auteur:$pass:$alea";
if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) { if (!isset($sha[$entry])) {
include_spip('inc/acces'); $sha[$entry] = hash_hmac('sha256', "$action::$id_auteur", "$pass::" . _action_get_alea($alea));
charger_aleas(); }
if (empty($GLOBALS['meta'][$alea])) {
include_spip('inc/minipres'); return $sha[$entry];
echo minipres(); }
spip_log("$alea indisponible");
exit; function _action_get_alea(string $alea): string {
} if (!isset($GLOBALS['meta'][$alea])) {
if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) {
include_spip('inc/acces');
charger_aleas();
if (empty($GLOBALS['meta'][$alea])) {
include_spip('inc/minipres');
echo minipres();
spip_log("$alea indisponible");
exit;
} }
} }
include_spip('auth/sha256.inc');
$sha[$id_auteur . $pass . $alea] = spip_sha256($id_auteur . $pass . @$GLOBALS['meta'][$alea]);
}
if (function_exists('sha1')) {
return sha1($action . $sha[$id_auteur . $pass . $alea]);
} else {
return md5($action . $sha[$id_auteur . $pass . $alea]);
} }
return $GLOBALS['meta'][$alea] ?? '';
} }
/** /**
...@@ -275,10 +277,10 @@ function calculer_action_auteur($action, $id_auteur = null) { ...@@ -275,10 +277,10 @@ function calculer_action_auteur($action, $id_auteur = null) {
*/ */
function verifier_action_auteur($action, $hash) { function verifier_action_auteur($action, $hash) {
[$id_auteur, $pass] = caracteriser_auteur(); [$id_auteur, $pass] = caracteriser_auteur();
if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) { if (
return true; hash_equals($hash,_action_auteur($action, $id_auteur, $pass, 'alea_ephemere'))
} or hash_equals($hash,_action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien'))
if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien')) { ) {
return true; return true;
} }
...@@ -312,11 +314,7 @@ function secret_du_site() { ...@@ -312,11 +314,7 @@ function secret_du_site() {
* @return string * @return string
*/ */
function calculer_cle_action($action) { function calculer_cle_action($action) {
if (function_exists('sha1')) { return hash_hmac('sha256', $action, secret_du_site());
return sha1($action . secret_du_site());
} else {
return md5($action . secret_du_site());
}
} }
/** /**
...@@ -327,7 +325,7 @@ function calculer_cle_action($action) { ...@@ -327,7 +325,7 @@ function calculer_cle_action($action) {
* @return bool * @return bool
*/ */
function verifier_cle_action($action, $cle) { function verifier_cle_action($action, $cle) {
return ($cle == calculer_cle_action($action)); return hash_equals( $cle, calculer_cle_action($action));
} }
...@@ -355,7 +353,7 @@ function calculer_token_previsu($url, $id_auteur = null, $alea = 'alea_ephemere' ...@@ -355,7 +353,7 @@ function calculer_token_previsu($url, $id_auteur = null, $alea = 'alea_ephemere'
// On nettoie l’URL de tous les var_. // On nettoie l’URL de tous les var_.
$url = nettoyer_uri_var($url); $url = nettoyer_uri_var($url);
$token = _action_auteur('previsualiser-' . $url, $id_auteur, null, $alea); $token = _action_auteur('previsualiser-' . $url, $id_auteur, secret_du_site(), $alea);
return "$id_auteur-$token"; return "$id_auteur-$token";
} }
...@@ -389,9 +387,9 @@ function verifier_token_previsu($token) { ...@@ -389,9 +387,9 @@ function verifier_token_previsu($token) {
// verifier le token // verifier le token
$_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere'); $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere');
if (!$_token or $token !== $_token) { if (!$_token or !hash_equals($token, $_token)) {
$_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien'); $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien');
if (!$_token or $token !== $_token) { if (!$_token or !hash_equals($token, $_token)) {
return false; return false;
} }
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter