[Résolu] Interdire l'accès à ecrire/?exec=install

Bonjour tout le monde,
je me suis aperçu récemment qu’une partie de ma config spip était disponible publiquement via l’url ecrire/?exec=install&etape=4.

Je souhaite masquer ces informations ( pour vivre heureux vivons cachés) et par curiosité j’ai été voir ce que fait spip.net: j’ai une belle 403, et je voudrais la même!

Ma question: je n’ai pas trouvé d’option permettant de le faire nativement dans spip, est ce bien le cas? Sinon je ferais une règle dans mon htaccess mais si je peux éviter du code je suis preneur.

Merci!

PS: je n’utilise pas cette interface graphique, je pilote tout via la ligne de commande donc pas de soucis pour la bannir complètement.

ne serait.pas parce que tu connecté que tu a accès sans error 403 ?

Tu es certainement connecté parce que j’ai essayé sur un site où je suis webmestre mais pas connecté en ce moment et j’ai un bel accès interdit :slight_smile:

1 « J'aime »

Je déplace dans général qui est plus adapté aux questions d’usages de SPIP :slight_smile:

Et bien c’est vraiment étrange, je confirme qu’en étant NON connecté (navigation privée dans un autre browser) j’ai bien accès à cette page, et pas de 403… :thinking:

Le .htaccess est bien actif ?

Je pense que j’ai une piste, il semble que j’ai un problème avec analyse_fichier_connection et la regex (de la mort :sweat: ) qui ne détecte pas ma chaîne spip_connect_db dans mon fichier config/connect.php. Du coup il part dans le processus d’installation…

Je vais creuser, je mettrais plus d’infos quand j’en aurais.

Bon, la regex n’est pas particulièrement souple.
On parle de: #spip_connect_db[(]\s*'([^']*)'\s*,\s*'([^']*)'\s*,\s*'([^']*)'\s*,\s*'([^']*)'\s*,\s*'([^']*)'(?:\s*,\s*'([^']*)'(?:\s*,\s*'([^']*)'(?:\s*,\s*'([^']*)'(?:\s*,\s*'([^']*)')?)?)?)?#

Cette regex s’attend explicitement à avoir une chaîne de caractère comme: spip_connect_db('DB_HOST', '', 'DB_USER', 'DB_PASSWORD','DB_NAME', 'mysql', 'spip', '');
alors que moi j’ai
spip_connect_db($_ENV['DB_HOST'], '', $_ENV['DB_USER'], $_ENV['DB_PASSWORD'], $_ENV['DB_NAME'], 'mysql', 'spip', '');
car je vais lire mes infos de config depuis un fichier .env en même temps que plein d’autres paramètres…

Flûte, ça va être relou à contourner ça :confused:

3 « J'aime »

Sur un projet où j’ai aussi ce type de connect je n’ai pas le soucis mais un « SPIP est déjà installé »
Tu as quoi exactement ? les infos de login à la bdd ?

Sur l’url ecrire/?exec=install j’ai:

et sur ecrire/?exec=install&etape=4 j’ai:

Le code de la fonction est:

function analyse_fichier_connection(string $file): array {
	if (!file_exists($file)) {
		return [];
	}
	$s = file_get_contents($file);
	if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) {
		array_shift($regs);

		return $regs;
	} else {
		$ar = '\s*\'([^\']*)\'';
		$r = '\s*,' . $ar;
		$r = "#spip_connect_db[(]$ar$r$r$r$r(?:$r(?:$r(?:$r(?:$r)?)?)?)?#";
		if (preg_match($r, $s, $regs)) {
			$regs[2] = $regs[1] . (!$regs[2] ? '' : ':' . $regs[2] . ';');
			array_shift($regs);
			array_shift($regs);

			return $regs;
		}
	}
	spip_log("$file n'est pas un fichier de connexion");

	return [];
}

donc on teste la présence au choix de 2 strings: mysql_connect ou spip_connect_db.

Tu utilises quoi comme fonction? spip_connect_db?

Est-ce que le comportement est le même sur la 4.4 ? La 4.3.8 est en « correctifs de sécurité seulement »

J’ai ceci

spip_connect_db($_SERVER['MYSQL_HOST'], '', $_SERVER['MYSQL_USER'], $_SERVER['MYSQL_PASSWORD'], $_SERVER['MYSQL_DATABASE'], 'mysql', 'spip', '', 'utf8');

Et en effet, je suis en 4.4

Hmmm bonne piste, avec l’eclatement en sous modules composer cette partie du code a été réécrite semble t-il install · 4.4 · spip / ecrire · GitLab . Je vais tester une upgrade en local mais ça semble prometteur

Je crois que tu as raison (je reproduis en 5.0-dev) : si tu as des $ dans l’appel de spip_connect_db config/connect.php ça semble pouvoir être écrasé dans l’install, et la page ecrire/?exec=install semble visible, effectivement parce que analyse_fichier_connection n’arrive pas à retourner du contenu…

Par exemple rien qu’avec cela dans config/connect.php (et un environnement local ddev/mysql)

<?php

if (!defined("_ECRIRE_INC_VERSION")) return;
defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);
$GLOBALS['spip_connect_version'] = 0.8;

$_ENV['db_host'] = 'db';
$_ENV['db_port'] = '3306';
$_ENV['db_login'] = 'db';
$_ENV['db_pass'] = 'db';
$_ENV['db_name'] = 'db';

spip_connect_db($_ENV['db_host'], $_ENV['db_port'], $_ENV['db_login'],$_ENV['db_pass'], $_ENV['db_name'], 'mysql', 'spip','','utf8');

Il semble que ça ne soit pas prévu pour ça d’une part…

D’autre part (mais c’est un autre point d’évolution)… toute cette mécanique pour les accès bdd devrait être… différente… soit déclaré dans .env, soit avec un fichier de config retournant un array…

Je t’invite à faire un ticket sur spip/ecrire déjà.

OK, au début je ne pensais pas que ça partirait aussi loin dans le code d’où mon intervention ici plutôt que sur la forge.
Je reproduis le problème en 4.4…

@pierretux je ne comprends pas pourquoi nous n’avons pas le même comportement…

edit: je ferai un ticket quand je comprendrais un peu mieux pourquoi ça passe pour Pierre, un truc m’échappe pour le moment…

Je viens de tester regarder plus en détail sur une 4.4, la fonction qui teste la connexion est identique même si la structure du code à changé.

@pierretux , tu n’aurais pas du code commenté dans ton fichier par hasard?
Car si un //spip_connect_db('DB_HOST', '', 'DB_USER', 'DB_PASSWORD','DB_NAME', 'mysql', 'spip', ''); traîne (ou l’équivalent en /* */) dans ton fichier connect.php, et bien ça suffit pour leurrer le système et lui faire croire que spip est installé… (testé avec succès à l’instant chez moi avec des valeurs à la noix)

non je ne fais pas ça et c’est mon fichier de prod

étrange, je ne reproduis pas ça chez moi.
Quoi qu’il en soit, j’ai réponse à ma question donc je ferme le sujet.

Merci à tous pour vore aide.

edit: bon je trouve pas le bouton pour marquer en résolu, j’ai édité le titre…

c’est fait: Détection d'une installation spip depuis config/connect.php (#75) · Issues · spip / ecrire · GitLab

edit: bon je trouve pas le bouton pour marquer en résolu, j’ai édité le titre…

C’était bien ce qu’il fallait faire :slight_smile: