Index: trunk/mapbender/http/nav/alkisnav_fls.php
===================================================================
--- trunk/mapbender/http/nav/alkisnav_fls.php	(revision 376)
+++ trunk/mapbender/http/nav/alkisnav_fls.php	(revision 399)
@@ -1,20 +1,63 @@
 <?php
-/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil FlurstÃŒck-Suche 
-	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
-
-Hinweis: In der Mapbender-Konfiguration muss die Gemeindenummer nun 3stellig mit fÃŒhrenden 0 angegeben sein. 
-
+/*	Navigation mit ALKIS-Daten im Mapbender 2 - Teil FlurstÃŒck-Suche 
+	Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
 Version vom
 	2016-02-11 Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
 	2016-03-02 $gemeinde auf feste LÃ€nge korrigieren
 	2016-11-28 Gemeinsam genutzte Datenbanken ermÃ¶glichen
+	2017-03-06 Korrektur: Gemeinde-Suche bei Kreis-DB in norGIS-Struktur
+	2018-02-15 Strikte Input-Validation der Parameter
 */
 
-// Variable initialisieren
-$hist="n";
-$gm="";
-
 $cntget = extract($_GET);
-$gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); // temporÃ€r bei Umstellung auf norGIS, besser im Mapbender 3stellig konfigurieren.
+
+// Input-Validation
+// Parameter aus Konfiguration oder Links sollten keine "Eingabefehler" enthalten.
+// Entweder falsche Konfiguration oder Hack. Programm sofort abbrechen.
+if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} // Mandant, muss!
+
+if(isset($epsg)) { // SRS, kann. Wenn als Parameter ...
+	if (preg_match('#^EPSG:[0-9]{4,5}$#', $epsg)) { // Prefix aus MB-Mapframe
+		$epsg = str_replace("EPSG:", "" , $epsg);
+	} elseif (!preg_match('#^[0-9]{4,5}$#', $epsg)) { // nur die Nummer
+		die("Eingabefehler epsg");
+	}
+} else { // Nichts ÃŒbergeben
+	$epsg=$gui_epsg; // dann default aus Conf
+}
+
+// Filter-Parameter fÃŒr Gemeindenummer in Kreis-Datenbank aus der Mapbender GUI-Konfiguration
+if (isset($gemeinde) AND trim($gemeinde, '0') != "") {
+	if (!preg_match('#^[0-9]{1,3}$#', $gemeinde)) {die("Eingabefehler Gemeinde");}
+	$gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT);
+	if(strpos($gemeinde, ",") === false) {
+		$gfilter = 1; // Einzelwert
+	} else {
+		$gfilter = 2; // Liste
+	}
+} else { // Kein Filter
+	$gemeinde = "";
+	$gfilter = 0;
+}
+
+// Suche nach historischen FS
+if(isset($hist)) { // Wenn ÃŒbergeben
+	if (!preg_match('#^[jn]{1}$#', $hist)) {die("Eingabefehler hist");} // Ja/Nein
+	if ($hist == "j") {
+		$phist = true; // als Boolean
+	} else {
+		$phist = false;
+	}
+} else { // Nichts ÃŒbergeben
+	$phist = false; // default = aktuelle FS
+}
+
+// Gemeinde-Nummer als Link aus der Baumstruktur
+if (isset($gm) ) {
+	if (!preg_match('#^[0-9]{8}$#', $gm)) {die("Eingabefehler gm");}
+} else {
+	$gm=""; // Var. init.
+}
+
 include("../../conf/alkisnav_conf.php");
 include("alkisnav_fkt.php"); // Funktionen
@@ -252,10 +295,12 @@
 	switch ($gfilter) {
 		case 1: // Einzelwert
-			$sql.="WHERE substring(gemshl from 6 for 3) = '".$gemeinde."' "; break;
+			$sql.="WHERE substring(gemshl from 6 for 3) = '".$gemeinde."' ";
+			break;
 		case 2: // Liste
-			$sql.="WHERE substring(gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') "; break;
+			$sql.="WHERE substring(gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') ";
+			break;
 		default: break;
 	}
-	$sql.=" AND endet IS NULL ORDER BY gemname LIMIT $1 ;";
+	$sql.="ORDER BY gemname LIMIT $1 ;";
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", array($linelimit));
@@ -269,5 +314,5 @@
 		$gnr=$row["gemshl"];
 		$gemeindename=$row["gemname"];
-		zeile_gemeinde($gnr, $gemeindename);
+		zeile_gemeinde($gnr, $gemeindename, false);
 		$cnt++;
 	}
@@ -327,4 +372,6 @@
 	if(preg_match("/\*/",$fskennz)){
 		$match = trim(preg_replace("/\*/i","%", strtoupper($fskennz)));
+		// Durchsuchte Namenspalte ist rechts mit Leerstellen aufgefÃŒllt. Darum Wildcard am Ende erzwingen.
+		if (substr($match, strlen($match), 1) != "%") {$match.="%";}
 	} else {
 		$match = trim($fskennz)."%";
@@ -333,6 +380,6 @@
 	// Pass auf! GemeindeschlÃŒssel ist in den beiden SchlÃŒsseltabellen linksbÃŒndig gefÃŒllt,
 	// aber unterschiedlich lang hinten mit Leerstellen aufgefÃŒllt.
-	$sql ="SELECT substring(g.gemshl from 1 for 8) AS gemshl, g.gemashl, trim(trailing from g.gemarkung) AS gemarkung, trim(trailing from s.gemname) AS gemname 
-	FROM gema_shl g JOIN gem_shl s ON substring(g.gemshl from 1 for 8) = substring(s.gemshl from 1 for 8) WHERE g.gemarkung ILIKE $1 ";
+	$sql ="SELECT substring(g.gemshl from 1 for 8) AS gemshl, g.gemashl, trim(trailing from g.gemarkung) AS gemarkung, trim(trailing from s.gemname) AS gemname "
+	."FROM gema_shl g JOIN gem_shl s ON substring(g.gemshl from 1 for 8) = substring(s.gemshl from 1 for 8) WHERE g.gemarkung ILIKE $1 ";
 
 	switch ($gfilter) {
@@ -735,21 +782,18 @@
 // Start hier!
 // ===========
-if(isset($epsg)) {
-	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+if ($debug >= 1) {echo "\n<p class='dbg'>gemeinde='".$gemeinde."'. gfilter='".$gfilter."'</p>";}
+
+// Validation: Eingabefeld aus Formular.
+// Suchbegriff (Gemarkungsname) oder FlurstÃŒcks-Kennzeichen (ll)gggg-fff-zzzz/nnn (11).
+// Hier formatierte Meldung und html-Foot.
+if (isset($fskennz) and $fskennz != "" ) {
+	if (!preg_match('#^[0-9a-zA-ZÃ€Ã¶ÃŒÃÃÃÃ* -]{1,25}$#', $fskennz)) {
+		echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
+		$fskennz="";
+	}
 } else {
-	#if ($debug >= 1) {echo "\n<p class='dbg'>kein EPSG gesetzt</p>";}	
-	$epsg=$gui_epsg; // Conf
-}
-
-// Filter aus Mapbender-GUI-Einbindung
-if ($gemeinde == "") {
-	$gfilter = 0;
-} elseif(strpos($gemeinde, ",") === false) {
-	$gfilter = 1; // Einzelwert
-} else {
-	$gfilter = 2; // Liste
-}
-if ($hist == "j") {$phist = true;} else {$phist = false;}
-
+	$fskennz="";
+}
+	
 if($gm != "") { // Self-Link aus Gemeinde-Liste
 	$trans="Gemarkungen zur Gemeinde";
@@ -821,6 +865,5 @@
 }
 
-// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion 
-// im Kopf des Ergebnisrahmens anzeigen.
+// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion im Kopf des Ergebnisrahmens anzeigen.
 // Dazu die im HTML-Header definierte Javascript-Function benutzen.
 // Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
@@ -829,5 +872,4 @@
 	transtitle('".$trans."'); 
 </script>";
-
 ?>
 
