Skip to content
Extraits de code Groupes Projets
Valider 54e185d9 rédigé par esj's avatar esj
Parcourir les fichiers

renforcement de sécurité dans les caches

parent 4ef44782
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -62,6 +62,7 @@ function ramener_squelette($squelette) ...@@ -62,6 +62,7 @@ function ramener_squelette($squelette)
{ {
spip_log("Squelette $squelette:\t($nom) chargé"); spip_log("Squelette $squelette:\t($nom) chargé");
flock($lock, LOCK_UN); flock($lock, LOCK_UN);
fclose($lock);
return $nom; return $nom;
} }
} }
...@@ -78,7 +79,8 @@ function ramener_squelette($squelette) ...@@ -78,7 +79,8 @@ function ramener_squelette($squelette)
} }
if (!$r) if (!$r)
{ {
if ($lock) flock($lock, LOCK_UN); if ($lock)
{ flock($lock, LOCK_UN); fclose($lock);}
include_ecrire ("inc_presentation.php3"); include_ecrire ("inc_presentation.php3");
install_debut_html(_T('info_erreur_systeme')); install_debut_html(_T('info_erreur_systeme'));
echo $sourcefile, _L(' squelette illisible'); echo $sourcefile, _L(' squelette illisible');
...@@ -97,6 +99,7 @@ function ramener_squelette($squelette) ...@@ -97,6 +99,7 @@ function ramener_squelette($squelette)
fwrite($f,'?'.'>'); fwrite($f,'?'.'>');
fclose($f); fclose($f);
flock($lock, LOCK_UN); flock($lock, LOCK_UN);
fclose($lock);
spip_log("Squelette $squelette: ($nom)" . strlen($r) . " octets, $timer ms"); spip_log("Squelette $squelette: ($nom)" . strlen($r) . " octets, $timer ms");
eval($r); # + rapide qu'un include puisqu'on l'a eval($r); # + rapide qu'un include puisqu'on l'a
return $nom; return $nom;
...@@ -255,6 +258,7 @@ function ramener_cache($cle, $calcul, $contexte, &$fraicheur) ...@@ -255,6 +258,7 @@ function ramener_cache($cle, $calcul, $contexte, &$fraicheur)
if (!function_exists($calcul)) if (!function_exists($calcul))
{ {
flock($lock2, LOCK_UN); flock($lock2, LOCK_UN);
# spip_log("libère verrou $cle (Compilateur absent)");
return(array('texte' => 'Compilateur absent')); return(array('texte' => 'Compilateur absent'));
} }
$page = $calcul($file, $contexte); $page = $calcul($file, $contexte);
...@@ -263,11 +267,12 @@ function ramener_cache($cle, $calcul, $contexte, &$fraicheur) ...@@ -263,11 +267,12 @@ function ramener_cache($cle, $calcul, $contexte, &$fraicheur)
if (!$n) if (!$n)
{ {
flock($lock2, LOCK_UN); flock($lock2, LOCK_UN);
# spip_log("libère verrou $cle (Page vide)");
@unlink($file); @unlink($file);
} }
else else
{ {
spip_log("Ecriture ($cle): $n octets (validité: $fraicheur sec.)"); spip_log("libère verrou $cle ($n octets, $fraicheur sec de validité.)");
fseek($lock2,0); fseek($lock2,0);
fwrite($lock2, "<!-- $fraicheur\t" . fwrite($lock2, "<!-- $fraicheur\t" .
$page['process_ins'] . $page['process_ins'] .
...@@ -405,9 +410,9 @@ function retire_caches($caches) ...@@ -405,9 +410,9 @@ function retire_caches($caches)
{ {
$dir = dir_var(); $dir = dir_var();
foreach ($caches as $path) foreach ($caches as $path)
{ if ((strpos($path, $dir) === 0) && (strpos($path, '../') === false)) { if (is_cache($path, $dir))
@unlink($GLOBALS['flag_ecrire'] ? ('../' . $path) : $path); @unlink($GLOBALS['flag_ecrire'] ? ('../' . $path) : $path);
else die("PIRATE"); else die(_T('info_acces_refuse') . ": $path");
} }
} }
} }
......
...@@ -101,4 +101,16 @@ function dir_of_file_cache($cle, $delai) ...@@ -101,4 +101,16 @@ function dir_of_file_cache($cle, $delai)
return subdir_cache($hache[16],$delai); return subdir_cache($hache[16],$delai);
} }
# teste si son argument est un ficher du re'pertoire de cache
function is_cache($path, $dir)
{
$n = strlen($dir);
return
((strpos($path, $dir) === 0) &&
(strpos("abcdef0123456789", $path[$n])) &&
($path[$n+1] == '/') &&
(strpos($path, '../') === 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