User Tools

Site Tools


tecnica:gps_cartografia_gis:mapserver

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tecnica:gps_cartografia_gis:mapserver [2011/05/04 09:32] – [MapFile con parametri] niccolotecnica:gps_cartografia_gis:mapserver [2013/10/04 12:26] (current) – [Parametro map nell'URL] niccolo
Line 51: Line 51:
  
 In questo caso lo script CGI ha ricevuto come parametri GET il nome del file ''**.map**'' che definisce l'immagine da generare e il parametro ''**mode=map**'' che indica di restituire semplicemente l'oggetto bitmap, senza la pagina interattiva predefinita (''**mode=browse**''). In questo caso lo script CGI ha ricevuto come parametri GET il nome del file ''**.map**'' che definisce l'immagine da generare e il parametro ''**mode=map**'' che indica di restituire semplicemente l'oggetto bitmap, senza la pagina interattiva predefinita (''**mode=browse**'').
 +
 +===== Parametro map nell'URL =====
 +
 +Non è bello che nell'URL compaia per esteso la path del mapfile, sia per un discorso di sicurezza (si rivela la struttura interna del filesystem), sia per evitare di essere dipendenti da una particolare installazione. Tramite opportune **variabili di ambiente** è possibile modificare il comportamento di MapServer.
 +
 +Le variabili di ambiente possono essere impostate tramite la direttiva **''SetEnv''** di Apache, ad esempio inserita in una sezione ''Directory''.
 +
 +<file>
 +<Directory "/usr/lib/cgi-bin">
 +     AllowOverride None
 +     Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
 +     Order allow,deny
 +     Allow from all
 +     # CGI-MapServer environment variables:
 +     # Check mapfiles againts this path:
 +     #SetEnv MS_MAP_PATTERN "^/usr/local/lib/cgi-mapserver/"
 +     # Disallow mapfile full path, use env vars instead.
 +     SetEnv MS_MAP_NO_PATH "true"
 +     # To use this mapfile, put map=MAP_ORTOFOTO2011 into the URL:
 +     SetEnv MAP_ORTOFOTO2011 "/usr/local/lib/cgi-mapserver/ortofoto2011.map"
 +</Directory>
 +</file>
 +
 +^ ''MS_MAP_PATTERN''    | Con questa direttiva il parametro map ricevuto dal CGI è il percorso del mapfile, ma viene validato rispetto ad una espressione regolare. Si impedisce di poter scegliere arbitrariamente il mapfile da remoto.  |
 +^ ''MS_MAP_NO_PATH''    | Se questa variabile è istanziata, il parametro map non viene interpretato come percorso del mapfile, ma come il nome di una variabile di ambiente che a sua volta indica il mapfile.  |
 +^ ''MAP_ORTOFOTO2011''  | Esempio di variabile di ambiente che punta al mapfile.  |
  
 ===== MapFile ===== ===== MapFile =====
Line 64: Line 90:
 Ad esempio è possibile definire un **''MAP.LAYER.FILTER''** di questo tipo: Ad esempio è possibile definire un **''MAP.LAYER.FILTER''** di questo tipo:
  
-<code>+<file>
 FILTER ("multimedia = '%multimedia%' and seats >= %nseats% and sound = '%sound%') FILTER ("multimedia = '%multimedia%' and seats >= %nseats% and sound = '%sound%')
-</code>+</file>
  
 Nella query CGI sarà sufficiente aggiungere i parametri **''multimedia=yes&seats=100&sound=yes''**. Non tutti i parametri del mapfile accetta la sostituzione di variabile, ecco l'elenco: Nella query CGI sarà sufficiente aggiungere i parametri **''multimedia=yes&seats=100&sound=yes''**. Non tutti i parametri del mapfile accetta la sostituzione di variabile, ecco l'elenco:
Line 76: Line 102:
   * CLASS.EXPRESSION   * CLASS.EXPRESSION
  
-Se il prametro viene usato per comporre una query SQL (come nell'esempio precedente) questa possibilità espone al rischio di **SQL injection**. Per evitare questo rischio si definiscono i pattern di validazione per ciascuna variabile:+Se il prametro viene usato per comporre una query SQL (come nell'esempio precedente) questa possibilità espone al rischio di **SQL injection**. Per evitare questo rischio si definiscono i pattern di validazione per ciascuna variabile. Contestualmente è possibile definire dei valori di default per le variabili che non fossero presenti nella query:
  
-<code xml>+<file>
 METADATA METADATA
     'multimedia_validation_pattern' '^yes|no$'     'multimedia_validation_pattern' '^yes|no$'
     'sound_validation_pattern'      '^yes|no$'     'sound_validation_pattern'      '^yes|no$'
     'nseats_validation_pattern'     '^[0-9]{1,3}$'     'nseats_validation_pattern'     '^[0-9]{1,3}$'
 +    'default_sound'                 'yes'
 +    'default_nseats'                '5'
 +    'default_multimedia'            'yes'
 END END
-</code>+</file>
  
 +==== Parametri nella query su attributi ====
 +
 +Quando si effettua una query sugli attributi di un layer, nella richiesta CGI-BIN è possibile includere alcuni parametri per filtrare il risultato della ricerca:
 +
 +^ mode     | Se vale **''itemquery''** seleziona una sola feature, con **''itemnquery''** seleziona tutte le feature.  |
 +^ qlayer   | Obbligatorio: il nome del layer da interrogare.  |
 +^ qstring  | Obbligatorio: la clausola di selezione. Ad esempio **''idgpx=156''**. Per un layer PostgreSQL si tratta di una clausola WHERE.  |
 +^ qitem    | Facoltativo: limita il risultato della ricerca ad un solo attributo.  |
 +
 +Il layer deve essere interrogabile, cioè deve comprendere un ''LAYER.TEMPLATE'' valido. Per evitare attacchi di tipo SQL injection bisogna obbligatoriamente definire una regola di validazione per la QSTRING (comprensiva di eventuali spazi, parentesi, ecc.):
 +
 +<file>
 +METADATA
 +  'qstring_validation_pattern' '^idgpx=[0-9]+$'
 +END
 +</file>
 ===== MapFile collegato a PostGIS ===== ===== MapFile collegato a PostGIS =====
  
Line 258: Line 303:
 // Add the only one layer. // Add the only one layer.
 $layer = ms_newLayerObj($map); $layer = ms_newLayerObj($map);
-$layer->set('name',           'bnd'); +$layer->setConnectionType(MS_POSTGIS); 
-$layer->set('type',           MS_LAYER_POLYGON); +$layer->set('name',       'bnd'); 
-$layer->set('status',         MS_DEFAULT); +$layer->set('type',       MS_LAYER_POLYGON); 
-$layer->set('connectiontype', MS_POSTGIS); +$layer->set('status',     MS_DEFAULT); 
-$layer->set('connection',     $DB_CONNECT); +$layer->set('connection', $DB_CONNECT); 
-$layer->set('data',           'bnd FROM vmap0_polbnda using unique id and using SRID=4326');+$layer->set('data',       'bnd FROM vmap0_polbnda using unique id and using SRID=4326');
  
 // Add some colors. // Add some colors.
tecnica/gps_cartografia_gis/mapserver.1304494341.txt.gz · Last modified: 2011/05/04 09:32 by niccolo