Auteur/autrice : Vincent Bonnal

Mapserver, PostGis et les mots de passe…

Lorsqu’on utilise Mapserver avec PostGIS, il faut créer dans le mapfile l’objet LAYER sous cette forme:

LAYER
NAME "Word"
  PROJECTION
    "init=epsg:4326"
  END
  STATUS ON
  METADATA
    "wms_title" "Le monde"
    "wms_feature_info_mime_type" "text/html"
    "wms_include_items" "all"
    "wms_srs" "epsg:4326"
  END
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=127.0.0.1 dbname=lupis password=toto user=postgres"
  DATA "the_geom FROM (SELECT id, name, the_geom FROM  spatial_reference_unity ) AS QUERY USING srid=4326 USING UNIQUE id"
  TYPE POLYGON
  OPACITY 100
  CLASS
    COLOR 255 255 255
    OUTLINECOLOR 0 0 0
  END
END

Il suffit, pour n’importe quel utilisateur, de récupérer l’url du fichier MAP (par exemple http://localhost/france.map) pour récupérer votre mot de passe de la base de données PostGIS (ici pour l’exemple « toto »). Il s’agit d’une faille de sécurité majeure pour votre système d’information.

La solution que j’utilise est l’outil msencrypt fourni par Mapserver (depuis sa version 4.10).

Voici les étapes à suivre pour crypter le mot de passe dans le lien ci-dessus:

  1. Générer une clé de chiffrement (à noter que cette clé ne doit pas être stockée n’importe où sur votre serveur Web, mais bien dans un répertoire à accès restreint):
    msencrypt -keygen « D:\site\
    restricted_folder\mykey.txt »
    Ce fichier de clé généré contient quelque chose comme:
    2137FEFDB5611448738D9FBB1DC5905
  2. Crypter le mot de passe de votre base de données PostGis en utilisant:
    msencrypt -key « D:\site\
    restricted_folder\mykey.txt » « toto »
    Ceci retourne le mot de passe crypté qui doit ressembler à cela:
    8A1B6A098F1BF956
  3. Modifier le mapfile pour s’assurer que le ficheier de clé ‘mykey.txt’ peuvent être trouvé:utiliser la variable d’environnement « MS_ENCRYPTION_KEY » . Le paramètre de configuration à l’intérieur de l’objet MAP peut être utilisé pour définir une variable d’environnement:
    MAP

    CONFIG « MS_ENCRYPTION_KEY » « D:/site/restricted_folder/myPostGisKey.txt »

    FIN # mapfile
  4. Modifier la chaîne connexion de la couche d’utiliser le mot de passe généré clés, en prenant soin d’utiliser les « { } » entre crochet autour de la clé:
    CONNECTION « host=127.0.0.1 dbname=lupis password={8A1B6A098F1BF956} user=postgres »

C’est tout !

Référence: http://mapserver.org/utilities/msencrypt.html

Question: < ? php ou < ?

Si comme moi vous vous êtes demandé pourquoi votre code php plantait à la première ligne alors que tout semble correct, regardez bien la façon dont votre tag php est écrit:

<?
phpinfo();
?>

… fonctionne, mais pas tout le temps. En fait, cela dépend d’une directive interne de php paramétrée dasn votre php.ini

Cette directive est short_open_tag qui définit si les balises courtes d’ouverture de PHP (<? ?> ) sont autorisées ou non.

Par défaut, cette directive est à true. Préférez la à false afin de pouvoir utiliser le XML (<?xml ?> ) plus tard dans vos projets (XML est fondamentalement utile à tout projet PHP). Et puis, un peu de rigeur dans les projets, ça ne fait de mal à personne… Donc, préférez <?php à <? seul

Notez que cette directive affecte également l’utilisation de <?= , qui est identique à <? echo (à titre personnel, je préfère ne pas l’utiliser).

Plus d’info ici: http://fr.php.net/manual/fr/ini.core.php

Types de caractère dans PostgreSQL

Il existe 3 types de caractère pour PostgreSQL.

  • character varying(n), varchar(n)     Longueur variable avec limite
  • character(n), char(n)     longueur fixe, complété par des espaces
  • text     longueur variable illimitée

Une différence fondamentale entre varchar et char est que le second type complète avec des espaces la chaine de caractères… c’est désagrable de devoir systématiquement trimmer lorsqu’on utilise les char…

if ($_REQUEST['mon_champ']!='NC')

s’écrit donc

if (trim($_REQUEST['champ'])!='NC')

Plus d’info sur http://docs.postgresqlfr.org/8.3/datatype-character.html