Valider 84f1d60c rédigé par esj's avatar esj
Parcourir les fichiers

Ajout d'une vérification d'opérationnalité des .htaccess.

Dans les distributions issues de la famille RedHat, Fedora ou CentOS, la configuration par défaut d'Apache applique la recommandation du {{mod_core}} suivante:

  For security and performance reasons, do not set AllowOverride to anything other than None in your <Directory />  block. Instead, find (or create) the <Directory> block that refers to the directory where you're actually planning to place a .htaccess file.

En conséquence, la fonction installant un .htaccess avec {{Deny from all}} pour la premiere fois, effecture une requête HEAD dans ce répertoire pour vérifier qu'il n'est pas accessible. S'il est quand même on l'indique dans le log, et au moment de l'installation aussi dans la dernière page affichée. Ce message étant inutilement alarmant si les répertoires sont en dehors du Document Root (ce qui est une bien meilleure protection qu'un .htacces de toutes façons), il faudrait pouvoir tester ça, mais ce n'est pas totalement faisable à cause des liens symboliques;
parent a7e8e9a9
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+5 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -12,7 +12,8 @@

if (!defined("_ECRIRE_INC_VERSION")) return;

// Authentifie et retourne la ligne SQL decrivant l'utilisateur si ok
// Authentifie et si ok retourne le tableau de la ligne SQL de l'utilisateur
// Si risque de secu repere a l'installation retourne False
function auth_spip_dist ($login, $pass, $serveur='') {

	// retrouver le login
@@ -65,7 +66,9 @@ function auth_spip_dist ($login, $pass, $serveur='') {
		include_spip('inc/acces'); // pour creer_uniqid
		@sql_update('spip_auteurs', array('alea_actuel' => 'alea_futur', 'pass' => sql_quote($shanext), 'alea_futur' => sql_quote(creer_uniqid())), "id_auteur=" . $row['id_auteur'],'',$serveur);
		// En profiter pour verifier la securite de tmp/
		verifier_htaccess(_DIR_TMP);
		// Si elle ne fonctionne pas a l'installation, prevenir
		if (!verifier_htaccess(_DIR_TMP) AND defined('_ECRIRE_INSTALL'))
			return false;
	}
	return $row;
}
+32 −19
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -155,33 +155,46 @@ function generer_htpass($pass) {
}

//
// Verifier la presence des .htaccess
// Installe ou verifie un .htaccess, y compris sa prise en compte par Apache
//
// http://doc.spip.org/@verifier_htaccess
function verifier_htaccess($rep) {
	$htaccess = rtrim($rep,"/") . "/" . _ACCESS_FILE_NAME;
	if ((!@file_exists($htaccess)) AND 
	    !defined('_ECRIRE_INSTALL') AND !defined('_TEST_DIRS')) {
		spip_log("demande de creation de $htaccess");
		if ($_SERVER['SERVER_ADMIN'] != 'www@nexenservices.com'){
			if (!$f = @fopen($htaccess, "w")) {
				spip_log("ECHEC DE LA CREATION DE $htaccess"); # ne pas traduire
			} else {
				fputs($f, "deny from all\n");
				fclose($f);
			}
		} else {
	if ((@file_exists($htaccess)) OR defined('_TEST_DIRS')) 
		return true;
	if ($_SERVER['SERVER_ADMIN'] == 'www@nexenservices.com')
		return nexen($rep);
	spip_log("Creation de $htaccess");
	if ($ht = @fopen($htaccess, "w")) {
		fputs($ht, "deny from all\n");
		fclose($ht);
		$t = rtrim($rep,"/") . "/.ok";
		if ($ht = @fopen($t, "w")) {
			@fclose($ht);
			include_spip('inc/distant');
			$t = '/' . _DIR_RACINE . $t;
			if (preg_match(',^(.*/)[^/]+/../(.*)$,',$t, $m))
				$t = $m[1] . $m[2];
			$f = $GLOBALS['meta']['adresse_site'] . $t;
			$ht = !recuperer_lapage($f, false, 'HEAD', 0);
		}
	}
	if (!$ht) spip_log("$htaccess inoperant sur $rep"); 
	return $ht;
}	

function nexen($rep)
{
	echo "<span style='color: #FF0000'>IMPORTANT : </span>";
	echo "Votre h&eacute;bergeur est Nexen Services.<br />";
	echo "La protection du r&eacute;pertoire <i>$rep/</i> doit se faire
			par l'interm&eacute;diaire de ";
			echo "<a href=\"http://www.nexenservices.com/webmestres/index.php\"
	echo "<a href=\"http://www.nexenservices.com/Webmestres/index.php\"
			target=\"_blank\">l'espace webmestres</a>.";
	echo "Veuillez cr&eacute;er manuellement la protection pour
			ce r&eacute;pertoire (un couple login/mot de passe est
			n&eacute;cessaire).<br />";
		}
	}
	return false;
}

// http://doc.spip.org/@gerer_htaccess
+16 −7
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -66,6 +66,7 @@ function install_etape_4_dist()
	# (les donnees arrivent de toute facon postees en _DEFAULT_CHARSET)

	lire_metas();
	$suite = '';
	if ($login) {
		include_spip('inc/charsets');

@@ -74,7 +75,8 @@ function install_etape_4_dist()
		$email = (importer_charset($email, _DEFAULT_CHARSET));
		# pour le passwd, bizarrement il faut le convertir comme s'il avait
		# ete tape en iso-8859-1 ; car c'est en fait ce que voit md5.js
		$pass = unicode2charset(utf_8_to_unicode($pass), 'iso-8859-1');		$mdpass = md5($pass);
		$pass = unicode2charset(utf_8_to_unicode($pass), 'iso-8859-1');	
		$mdpass = md5($pass);
		$htpass = generer_htpass($pass);
		$alea = creer_uniqid();
		$id_auteur = sql_getfetsel("id_auteur", "spip_auteurs", "login=" . sql_quote($login));
@@ -100,18 +102,25 @@ function install_etape_4_dist()

		// Connecter directement celui qui vient de (re)donner son login
		// mais sans cookie d'admin ni connexion longue
		if ($auth_spip = charger_fonction('spip', 'auth', true)
		AND $row = $auth_spip($login, $pass)
		AND $session = charger_fonction('session', 'inc')
		AND $cookie_session = $session($row))
		$spip = charger_fonction('spip', 'auth', true);
		$session = charger_fonction('session', 'inc', true);
		$row = ($spip AND $session) ?  $spip($login, $pass) : ''; 
		if ($row AND $cookie_session = $session($row)) {
			spip_setcookie('spip_session', $cookie_session);
		else spip_log("login automatique impossible $auth_spip $session" . count($row));
		} elseif ($row == false) {
			$suite = "<span style='color: red'>"
			  . _L('Attention: htaccess inoperant')
			  . '</span>';
		}
		    
		if (!$row)
			spip_log("login automatique impossible $spip $session");
	}

	$config = charger_fonction('config', 'inc');
	$config();

	$suite =  "\n<input type='hidden' name='etape' value='fin' />" 
	$suite .=  "\n<input type='hidden' name='etape' value='fin' />" 
	  . bouton_suivant(_T('login_espace_prive'));

	echo generer_form_ecrire('install', $suite);