Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
doc:galette [07/11/2009 20:24] xavierdoc:galette [20/11/2014 14:02] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== Mini-audit de Galette ======
 +===== Généralités =====
 +
 +  * Galette : Gestionnaire d'Adhérents en Ligne Extrêmement Tarabiscoté mais Tellement Efficace
 +  * Site officiel : [[http://galette.tuxfamily.org]]
 +  * Version testée : 0.63.2 (06/10/2009)
 +===== C'est parti =====
 +==== Téléchargement et décompression de l'archive ====
 +
 +Commençons par nous procurer le code de la version 0.63.2 :
 +
 +<code bash>
 +wget http://download.gna.org/galette/galette-0.63.2.tgz
 +tar xzf galette-0.63.2.tgz
 +mv galette-0.63.2 galette
 +cd galette
 +</code>
 +
 +Observons les permissions des fichiers fournis :
 +<code bash>
 +find . -type f -perm /111 -print0 | xargs -0 /bin/ls -ald
 +</code>
 +
 +<file>
 +-rwxr-x--- 1 xavier xavier  3795 déc.  14  2008 ./docs/CHANGES
 +-rwxr-x--- 1 xavier xavier  3933 avril 20  2004 ./docs/UPGRADE-linux-fr
 +-rwxr-x--- 1 xavier xavier 10728 nov.  12  2006 ./lang/make_lang_l12n.py
 +-rwxr-x--- 1 xavier xavier  2003 janv. 30  2006 ./lang/xgettext.py
 +-rwxr-x--- 1 xavier xavier  1207 oct.   5 18:03 ./picture.php
 +-rwxr-x--- 1 xavier xavier  1307 sept. 10  2006 ./public/header.php
 +-rwxr-x--- 1 xavier xavier  3983 févr. 14  2006 ./templates/default/ajouter_contribution.tpl
 +-rwxr-x--- 1 xavier xavier  1926 févr. 14  2006 ./templates/default/ajouter_transaction.tpl
 +-rwxr-x--- 1 xavier xavier  3848 nov.    2007 ./templates/default/configurer_fiches.tpl
 +-rwxr-x--- 1 xavier xavier 10145 juin  13  2008 ./templates/default/galette.css
 +-rwxr-x--- 1 xavier xavier  7242 juin  16  2006 ./templates/default/gestion_contributions.tpl
 +-rwxr-x--- 1 xavier xavier  4746 janv. 31  2006 ./templates/default/gestion_transactions.tpl
 +-rwxr-x--- 1 xavier xavier  2605 juin  12  2008 ./templates/default/mailing_adherents.tpl
 +-rwxr-x--- 1 xavier xavier 10692 oct.   6 20:56 ./templates/default/preferences.tpl
 +-rwxr-x--- 1 xavier xavier  1230 juin  16  2006 ./templates/default/traduire_libelles.tpl
 +-rwxr-x--- 1 xavier xavier  4322 oct.   6 06:25 ./templates/default/voir_adherent.tpl
 +</file>
 +
 +Ces fichiers ont-ils vraiment besoin d'un flag exécutable ? Cela peut se comprendre pour les scripts utilitaires (*.py) mais beaucoup moins pour :
 +  * les templates (''*.tpl'')
 +  * les scripts PHP (''*.php'')
 +  * la documentation (''docs/*'')
 +
 +Détail :
 +<file>
 +-rw-r-----  1 xavier xavier   29 2004-07-13 22:11:55 .cvsignore
 +</file>
 +Fallait-il vraiment laisser cela dans le paquet final ?
 +==== Installation ====
 +<code bash>
 +vim docs/INSTALL
 +</code>
 +
 +<file>
 +  Requis :  - Serveur web supportant PHP :
 +          Apache est une bonne option
 +          Galette a été testé sur Apache 1.3.22 et 1.3.26
 +        - PHP (Au moins la version 4.1)
 +          Galette a été testé avec PHP 4.1.2 et 4.3.3
 +        - Base de données (MySQL ou PostgreSQL)
 +          Galette a été testé sur MySQL 3.23.49 et PostgresSQL
 +          7.0.2 et 7.2.1 (version récente recommandée)
 +</file>
 +
 +Sans vouloir remettre en cause la pertinence des tests upstream, n'en serions-nous point à Apache 2.2, PHP 5.2.11, MySQL 5.1 et PostgreSQL 8.4.1 ?
 +
 +<file>
 +  Il vous faut maintenant créer un utilisateur et une base pour Galette sur
 +  votre serveur SQL (MySQL ou PostgreSQL). L'utilisateur créé doit avoir
 +  tous les droits sur la base créée pour Galette.
 +
 +  Se reporter à la documentation de votre serveur SQL pour ce faire.
 +  Web.
 +</file>
 +
 +Pour ce test, nous choisirons le premier truc qui nous tombera sous la main, à savoir du MySQL.
 +Création des structures par un script d'install => tous privilèges pour cet utilisateur sur cette base donc ? Bon, pourquoi pas...
 +<code mysql>
 +GRANT ALL PRIVILEGES ON `galette` . * TO 'galette_user'@'localhost' WITH GRANT OPTION ;
 +</code>
 +
 +<file>
 +  Connectez-vous ensuite au sous répertoire "install" avec votre navigateur web.
 +  Dans notre exemple, il s'agit de http://serveur/galette-0.62/install.
 +
 +  Vous n'avez plus qu'à vous laissez guider par les 10 étapes de l'installeur
 +  Web.
 +</file>
 +
 +Rendons-nous joyeusement sur ''https://webdev/~xavier/galette/install/index.php'' (oui, c'est comme ça chez moi), faisons une nouvelle installation francophone.
 +<file>Les permissions des fichiers sont correctes !</file>
 +Merci mod_suphp.
 +<file>
 +Si ce n'est pas déjà fait, créez une base de données et un utilisateur pour Galette.
 +Les droits nécessaires sont CREATE, DROP, DELETE, UPDATE, SELECT et INSERT.
 +</file>
 +$#%#$%$# Pouvait pas le dire plus tôt non ?
 +<code mysql>
 +REVOKE ALL PRIVILEGES ON galette. * FROM galette_user@localhost;
 +REVOKE GRANT OPTION ON galette. * FROM galette_user@localhost;
 +GRANT CREATE, DROP, DELETE, UPDATE, SELECT, INSERT ON galette.* TO galette_user@localhost;
 +</code>
 +
 +Remplissons le formulaire pour la connexion à la base de données et passons à l'étape suivante :
 +<file>Les droits d'accès à la base sont corrects.</file>
 +Si c'est pas beau la vie. Créons les structures maintenant :
 +
 +<file>
 +DROP TABLE IF ...
 +CREATE TABLE galette_adherents ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_cotisations ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_transactions ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_statuts ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_types_cotisation ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_preferences ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_logs ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_field_types ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_dynamic_fields ...
 +DROP TABLE IF ...
 +CREATE TABLE `galette_pictures` ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_l10n ...
 +DROP TABLE IF ...
 +CREATE TABLE galette_tmppasswds ...
 +  (Les erreurs sur les opérations DROP et RENAME peuvent être ignorées)
 + Les tables ont été correctement créées.
 +</file>
 +Ah, c'était pour ça le droit de DROP. Et euh, ... on peut enlever les droits CREATE et DROP maintenant ?
 +
 +<file>Veuillez choisir les paramètres du compte administrateur Galette</file>
 +Alors, utilisateur "admin", mot de passe "maman"... ah nan, c'pas ça :p
 +
 +<file>
 +Fichier de configuration crée (includes/config.inc.php)
 +Paramètres sauvegardés dans la base de données
 +</file>
 +
 +Voyons ce fichier immédiatement après installation :
 +<file>
 +-rw------- 1 xavier xavier 298 2009-11-07 19:25:45 includes/config.inc.php
 +</file>
 +Les permissions sur ce fichier sont nickels. Est-ce volontaire ? D'après le code PHP situé dans install/index.php après création du fichier de configuration (ligne 959 et suivantes)... non. À priori, ça viendrait plutôt de la directive ''umask=0077'' dans la configuration suPHP de mon serveur. Dommage...
 +
 +<file>
 +  Une fois le script d'installation terminé, et après avoir vérifié que tout
 +  fonctionne, il est fortement conseillé de supprimer le dossier install/.
 +</file>
 +Voilà un sage conseil.
 +
 +==== Utilisation ====
 +On arrive ensuite sur galette/index.php, on s'identifie et wouah ça fonctionne. Cherchons maintenant la petite bête...
 +==== Petite balade dans le code ====
 +
 +Dans index.php, à partir de la ligne 56 :
 +<code php>
 +        if (
 +            ($_POST["login"]==PREF_ADMIN_LOGIN && $_POST["password"]==PREF_ADMIN_PASS) ||
 +            ($_POST["login"]==PREF_ADMIN_LOGIN && md5($_POST["password"])==PREF_ADMIN_PASS)
 +            )
 +        {
 +            $_SESSION["logged_status"]=1;
 +            $_SESSION["admin_status"]=1;
 +            $_SESSION["logged_username"]=$_POST["login"];
 +            $_SESSION["logged_nom_adh"]="Admin";
 +            dblog("Login");
 +        }
 +</code>
 +Intéressant : si on arrive à lire le MD5 du mot de passe de l'administrateur, on n'a pas besoin de s'emmerder à le bruteforcer ((au risque de tomber sur un mot de passe un tant soit peu solide, ou, pire encore, de s'impatienter pendant que chauffage.localdomain utilise ses 133 MHz pour le bruteforce...)) pour s'identifier avec. Les lignes 75 et 76 de ce même fichier nous indiquent que la même politique s'appliquent à l'identification des autres utilisateurs.
 +
 +Dans includes/functions.inc.php :
 +<code php>
 +function txt_sqls($champ) {
 +  return "'".str_replace("'", "\'", str_replace('\\', '', $champ))."'";
 +}
 +</code>
 +
 +Cette fonction, utilisée 6 fois dans le reste du code, paraît un peu légère par rapport à des fonctions plus spécialisées telles que :
 +  * [[http://php.net/manual/fr/function.mysql-real-escape-string.php|mysql_real_escape_string]]
 +  * [[http://fr.php.net/manual/fr/mysqli.real-escape-string.php|mysqli_real_escape_string]]
 +  * [[http://www.php.net/manual/en/function.pg-escape-string.php|pg_escape_string]]
 +
 +Observons maintenant les diverses bibliothèques fournies avec galette :
 +^  Lib                                                  ^  Version utilisée        ^ Dernière version          ^
 +| [[http://adodb.sourceforge.net/|ADOdb]]               | 4.92 (29/08/2006)       | 5.09a (26/06/2009)        |
 +| [[http://www.potentialtech.com/cms/node/6|phppdflib]] | Aucune idée. Vraiment.  | 2.9b2 (04/05/2004) :!:    |
 +| [[http://www.smarty.net/|Smarty]]                     | 2.6.5-dev (13/09/2004)  | 3.0b1 (31/10/2009)        |
 +
 +La plupart des autres fichiers font état d'un copyright 2003-2004.
  
Imprimer/exporter