Index: trunk/mapbender/http/nav/alkisnav_eig.php
===================================================================
--- trunk/mapbender/http/nav/alkisnav_eig.php	(revision 376)
+++ trunk/mapbender/http/nav/alkisnav_eig.php	(revision 399)
@@ -1,20 +1,59 @@
 <?php
-/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil EigentÃŒmer-Suche 
-	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
-
- Version vom
+/*	Navigation mit ALKIS-Daten im Mapbender 2 - Teil EigentÃŒmer-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-07-18 Personendaten: Zeilen getauscht. Wie Brief-Anschrift.
 	2016-11-28 Gemeinsam genutzte Datenbanken ermÃ¶glichen
+	2018-02-15 Strikte Input-Validation der Parameter
 */
 
-// Variable initialisieren
-$gbkennz="";
-$blattgml="";
-$person ="";
-
 $cntget = extract($_GET);
-$gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); // temporÃ€r ..
+
+// 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;
+}
+if (isset($blattgml) and $blattgml != "" ) {
+	if (!preg_match('#^[0-9a-zA-Z]{16}$#', $blattgml)) {die("Eingabefehler GML-ID Blatt");}
+} else {
+	$blattgml="";
+}
+if (isset($person) and $person != "" ) {
+	if (!preg_match('#^[0-9a-zA-Z]{16}$#', $person)) {die("Eingabefehler GML-ID Person");}
+} else {
+	$person="";
+}
+if (isset($gbkennz) and $gbkennz != "" ) { // gggg-bbbbbbA-0001
+	if (!preg_match('#^[0-9A-E -]{4,17}$#', $gbkennz)) {die("Eingabefehler Grundbuch-Kennzeichen");}
+} else {
+	$gbkennz="";
+}
+
 include("../../conf/alkisnav_conf.php"); // Konfigurations-Einstellungen
 include("alkisnav_fkt.php"); // Funktionen
@@ -53,11 +92,14 @@
 function familiensuche() {
 	// Einen Link generieren, um nach anderen Personen mit gleichem Familiennamen (Nachnamen) zu suchen.
-	// Bei versehendlich falschem Vornamen muss nicht von vorn begonnen werden.
+	// Bei versehendlich falschem Vornamen muss somit nicht von vorn begonnen werden.
+
 	global $gkz, $gemeinde, $epsg, $name;
-	if(isset($name)) { // Familiensuche
-		echo "\n<div class='back' title='Andere Personen mit diesem Nachnamen'>";
-			echo "\n\t\t<img class='nwlink' src='ico/Eigentuemer_2.png' width='16' height='16' alt='FAM' title='Andere Personen mit diesem Nachnamen'> ";
-			echo "\n<a class='back' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;name=".$name."'>\"".$name."\"</a>";
-		echo "\n</div>\n<br>";	
+	$lnknam=urlencode(substr($name,0,50));
+	$dspnam=htmlentities($name, ENT_QUOTES, "UTF-8");
+	if(isset($name)) {
+		echo "\n<div class='back' title='Andere Personen mit diesem Nachnamen'>"
+			."\n\t\t<img class='nwlink' src='ico/Eigentuemer_2.png' width='16' height='16' alt='FAM' title='Andere Personen mit diesem Nachnamen'> "
+			."\n<a class='back' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;name=".$lnknam."'>\"".$dspnam."\"</a>"
+		."\n</div>\n<br>";	
 	}
 	return;
@@ -68,8 +110,8 @@
 	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $auskpath; // $debug
 
-	$sql ="SELECT p.nachnameoderfirma, p.vorname, p.geburtsdatum, p.namensbestandteil, 
-	a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer 
-	FROM ax_person p LEFT JOIN ax_anschrift a ON a.gml_id=ANY(p.hat) 
-	WHERE p.gml_id= $1 AND p.endet IS NULL AND a.endet IS NULL LIMIT 1;";	
+	$sql ="SELECT p.nachnameoderfirma, p.vorname, p.geburtsdatum, p.namensbestandteil, "
+	."a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer "
+	."FROM ax_person p LEFT JOIN ax_anschrift a ON a.gml_id=ANY(p.hat) "
+	."WHERE p.gml_id= $1 AND p.endet IS NULL AND a.endet IS NULL LIMIT 1;";	
 	// Es wird nur EINE Zeile ausgewertet
 
@@ -160,10 +202,10 @@
 
 	if($match1 != '%'){
-		$sql.="nachnameoderfirma ILIKE $1 AND p.vorname ILIKE $2 ";		
-		$sql.="ORDER BY p.nachnameoderfirma, p.vorname LIMIT $3 ;";
+		$sql.="nachnameoderfirma ILIKE $1 AND p.vorname ILIKE $2 "
+		."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $3 ;";
 		$v=array($match, $match1, $linelimit);
 	}else{
-		$sql.="nachnameoderfirma ILIKE $1 ";		
-		$sql.="ORDER BY p.nachnameoderfirma, p.vorname LIMIT $2 ;";
+		$sql.="nachnameoderfirma ILIKE $1 "
+		."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $2 ;";
 		$v=array($match, $linelimit);
 	} 
@@ -189,4 +231,5 @@
 	} elseif($cnt == 1){ // Eindeutig!
 		$person = $persongml;
+		$name = $nachname; // familiensuche() verwendet sonst den Suchbegriff
 	} else {
 		echo "\n<p class='anz'>".$cnt." Eigent&uuml;mer mit '".$name."'</p>";	// im Limit
@@ -213,8 +256,8 @@
 	// Body
 	// Suche nach GrundbÃŒchern der Person
-	$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam 
-	FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id 
-	JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk 
-	WHERE n.bennennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL;";
+	$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
+	."FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id "
+	."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
+	."WHERE n.bennennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL;";
 
 	// Parameter $gbkennz, z.B. nach Klick auf Zeile "Bezirk"
@@ -275,7 +318,7 @@
 		$nxtbltblatt=urlencode($blatt);
 		$nxtbltseite=$bltseite + 1;
-		echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltseite=".$nxtbltseite."' ";
-		echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt."'>weitere</a>";
-		echo "</p>";
+		echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltseite=".$nxtbltseite."' "
+		."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt."'>weitere</a>"
+		."</p>";
 	} elseif($cnt == 1) { // Eindeutig!
 		$blattgml=$gml; // dann Stufe 3 gleich nachschieben
@@ -305,7 +348,7 @@
 
 		// Grundbuch-Daten ermitteln
-		$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam ";
-		$sql.="FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
-		$sql.="WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;";
+		$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
+		."FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
+		."WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;";
 		$v=array($blattgml);
 		$res=pg_prepare("", $sql);
@@ -353,19 +396,18 @@
 
 	// Baustein 1: SQL-Anfang fuer beide Varianten
-	$sql1 ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam, 
-	s1.gml_id as bsgml, s1.laufendenummer AS lfd, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.gemeinde, ot.gemashl, trim(trailing from ot.gemarkung) AS gemarkungsname, ";
+	$sql1 ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam, "
+	."s1.gml_id as bsgml, s1.laufendenummer AS lfd, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.gemeinde, ot.gemashl, trim(trailing from ot.gemarkung) AS gemarkungsname, ";
 	if($epsg == "25832") { // Transform nicht notwendig
-		$sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, ";
-		$sql1.="st_y(st_centroid(f.wkb_geometry)) AS y ";
+		$sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, st_y(st_centroid(f.wkb_geometry)) AS y ";
 	} else {  
-		$sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
-		$sql1.="st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y ";			
+		$sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, "
+			."st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y ";			
 	}
 
 	// NamenNummer >istbestandteilvon> buchungsblatt <istbestandteilvon< buchungsstelle-1
-	$sql1.="FROM ax_namensnummer nn 
-	JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon 
-	JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk
-	JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon ";
+	$sql1.="FROM ax_namensnummer nn "
+	."JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon "
+	."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
+	."JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon ";
 
 	// Baustein A: Auswahl 1 oder 2
@@ -374,10 +416,10 @@
 
 	// buchungsStelle1 (herr.) >an> buchungsStelle2 (dien.) <istGebucht< FS
-	$sqla2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) ";
-	$sqla2.="JOIN ax_flurstueck f ON s2.gml_id=f.istgebucht ";
+	$sqla2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) "
+		."JOIN ax_flurstueck f ON s2.gml_id=f.istgebucht ";
 
 	// Baustein 2: SQL-Ende fuer beide Varianten
-	$sql2 ="JOIN gema_shl ot ON f.land || f.gemarkungsnummer = ot.gemashl  "; // Ortsteil
-	$sql2.="WHERE nn.benennt = $1 AND nn.endet IS NULL AND gb.endet IS NULL AND s1.endet IS NULL AND f.endet IS NULL ";
+	$sql2 ="JOIN gema_shl ot ON f.land || f.gemarkungsnummer = ot.gemashl "  // Ortsteil
+		."WHERE nn.benennt = $1 AND nn.endet IS NULL AND gb.endet IS NULL AND s1.endet IS NULL AND f.endet IS NULL ";
 	$sqlw2="AND s2.endet IS NULL ";
 
@@ -407,7 +449,7 @@
 		$bltwhere ="";
 	} else { // BlÃ€ttern, Fortsetzen bei ...
-		$bltwhere ="AND ((b.bezeichnung > '".$bltbez."') ";
-		$bltwhere.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."') ";
-		$bltwhere.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung = '".$bltblatt."' AND cast(s1.laufendenummer AS integer) >= ".$bltbvnr." )) ";
+		$bltwhere ="AND ((b.bezeichnung > '".$bltbez."') "
+			."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."') "
+			."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung = '".$bltblatt."' AND cast(s1.laufendenummer AS integer) >= ".$bltbvnr." )) ";
 	} // FlurstÃŒcke in der angeblÃ€tterten BVNR werden ggf. wiederholt
 
@@ -489,9 +531,9 @@
 			$nxtbltblatt=urlencode($blatt);
 			$nxtbltseite=$bltseite + 1;
-			echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person;
-			echo "&amp;gbkennz=".$zgbbez; // Filter Bezirk
-			echo "&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=ohne' ";
-			echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>";
-			echo "</p>";
+			echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person
+			."&amp;gbkennz=".$zgbbez // Filter Bezirk
+			."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=ohne' "
+			."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"
+			."</p>";
 		} elseif($zfs1 > 1) { // Meldung (Plural) ab 2, im Limit
 			echo "\n<p class='anz'>";
@@ -567,9 +609,9 @@
 			$nxtbltblatt=urlencode($blatt);
 			$nxtbltseite=$bltseite + 1;
-			echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person;
-			echo "&amp;gbkennz=".$zgbbez; // Filter Bezirk
-			echo "&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=nur' ";
-			echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>";
-			echo "</p>";
+			echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person
+			."&amp;gbkennz=".$zgbbez // Filter Bezirk
+			."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=nur' "
+			."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"
+			."</p>";
 		} elseif($zfs2 > 1) { // ab 2
 			echo "\n<p class='anz'>";
@@ -589,18 +631,18 @@
 // 3. gb     = gml_id des Grundbuches -> Suche nach FlurstÃŒcken
 
-if(isset($epsg)) {
-	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+// Validation: Eingabefeld aus Formular. Wird aber auch an Link angehÃ€ngt (LÃ€nge!)
+// Suchbegriff (EigentÃŒmer)
+// Hier formatierte Meldung und html-Foot.
+if (isset($name) and $name != "" ) { 
+	if (!preg_match('#^[a-zA-Z0-9Ã€Ã¶ÃŒÃÃÃÃ*,. \-&/]{1,50}$#', $name)) {
+		echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
+	//	if ($debug > 1) {echo "<p class='err'>Name='".$name."' LÃ€nge='".strlen($name)."</p>";}
+		$name="";
+	}
 } else {
-	$epsg=$gui_epsg; // aus Conf
-}
-if ($gemeinde == "") {
-	$gfilter = 0; // Gemeinde ungefiltert
-} elseif(strpos($gemeinde, ",") === false) {
-	$gfilter = 1; // Gemeinde Einzelwert
-} else {
-	$gfilter = 2; // Gemeinde Filter-Liste
-}
-
-$kennztyp=ZerlegungGBKennz($gbkennz); // Grundbuch-Kennzeichen aus Parameter zerlegen: $z__ 
+	$name="";
+}
+
+$kennztyp=ZerlegungGBKennz($gbkennz); // Grundbuch-Kennzeichen aus Parameter zerlegen
 // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
 
@@ -633,7 +675,6 @@
 		if ($kennztyp > 1) {
 			$trans="Grdb. und Flst. von .. in .."; // Filter GB-Bez,
-			// darunter sind dann Name und Bezirk farblich markiert
 		} else {
-			$trans="Grundb. und Flurst. von .."; // der EigentÃŒmer steht darunter
+			$trans="Grundb. und Flurst. von .."; // Name steht darunter
 		}
 		getGBuFSbyPerson(); // Schritte 2+3 gleichzeitig, dabei Gemeinde-Filter auf Stufe 3
@@ -645,5 +686,5 @@
 	getEigByName(); // Suchen nach Namensanfang
 
-	if($person != "") { // genau EIN Treffer zum Namen
+	if($person != "") { // genau EIN Treffer zum gesuchten Namen
 		if ($gfilter == 0) {
 			$trans="Grundb&uuml;cher zum Namen";
Index: trunk/mapbender/http/nav/alkisnav_adr.php
===================================================================
--- trunk/mapbender/http/nav/alkisnav_adr.php	(revision 376)
+++ trunk/mapbender/http/nav/alkisnav_adr.php	(revision 399)
@@ -1,12 +1,11 @@
 <?php
-/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil Adressen-Suche 
-	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
-
+/*	Navigation mit ALKIS-Daten im Mapbender 2 - Teil Adressen-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
-
-	ToDo:
+	2018-02-15 Strikte Input-Validation der Parameter
+ToDo:
 	-	Gruppierung (mit Zeile) der StraÃenliste nach Gemeinde
 	-	Eingabe aus "Balken" von Buchauskunft "Lage" zulassen: Numerisch: Gem-Str-Haus-lfd
@@ -17,10 +16,41 @@
 */
 
-// Variable Initialisieren
-$str_schl="";
-$skey="";
-
 $cntget = extract($_GET);
-$gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); // temporÃ€r
+
+// 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;
+}
+// // http://skrzmaptest01.asp.krzwan.de/mapbender/nav/alkisnav_adr.php?gkz=210&gemeinde=004&epsg=25832&str_schl=0575800401798
+if (isset($str_schl) ) {
+	if (!preg_match('#^[0-9]{4,13}$#', $str_schl)) {die("Eingabefehler Stra&zlig;enschl&uuml;ssel");}
+} else {
+	$str_schl="";
+}
+
 include("../../conf/alkisnav_conf.php");
 include("alkisnav_fkt.php"); // Funktionen
@@ -75,8 +105,8 @@
 	}
 
-	$sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage 
-	FROM ax_lagebezeichnungkatalogeintrag k 
-	JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde 
-	WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
+	$sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage "
+	."FROM ax_lagebezeichnungkatalogeintrag k "
+	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde "
+	."WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
 
 	switch ($gfilter) {
@@ -143,8 +173,8 @@
 		$match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten 
 	}
-	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage 
-	FROM ax_lagebezeichnungkatalogeintrag as k 
-	JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde 
-	WHERE k.lage LIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
+	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage "
+	."FROM ax_lagebezeichnungkatalogeintrag as k "
+	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde "
+	."WHERE k.lage LIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
 	switch ($gfilter) {
 		case 1: // Einzelwert
@@ -192,8 +222,8 @@
 	// Head
 	// Strasse zum Strassenschluessel
-	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage 
-	FROM ax_lagebezeichnungkatalogeintrag as k 
-	JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde 
-	WHERE k.schluesselgesamt = $1 AND k.endet IS NULL AND g.endet IS NULL LIMIT 1"; 
+	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage "
+	."FROM ax_lagebezeichnungkatalogeintrag as k "
+	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde "
+	."WHERE k.schluesselgesamt = $1 AND k.endet IS NULL AND g.endet IS NULL LIMIT 1"; 
 
   	$v=array($str_schl);	// Schluessel-Gesamt ..
@@ -220,14 +250,11 @@
 			$sqlko ="SELECT ";
 			if($epsg == "25832") { // Transform nicht notwendig
-				$sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
-				$sqlko.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
+				$sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, st_y(st_Centroid(f.wkb_geometry)) AS y ";
 			} else {
-				$sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
-				$sqlko.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";
+				$sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, "
+				."st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";
 			}
-			$sqlko.="FROM ax_lagebezeichnungohnehausnummer o ";
-			$sqlko.="JOIN ax_flurstueck f ON o.gml_id=ANY(f.zeigtauf) ";
-			$sqlko.="WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 ";	
-			$sqlko.="LIMIT 1;"; // die erstbeste Koordinate
+			$sqlko.="FROM ax_lagebezeichnungohnehausnummer o JOIN ax_flurstueck f ON o.gml_id=ANY(f.zeigtauf) "
+			."WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 LIMIT 1;"; // die erstbeste Koordinate
 
 			$v=array($land,$regb,$kreis,$gemnd,$nr);
@@ -249,13 +276,12 @@
 
 			if ($x > 0) { // Koord. bekommen?
-				echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:"; // mit Link
-						echo "transtitle(\"auf Stra&szlig;e positioniert\"); ";
-						echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); ";
-						echo "parent.parent.showHighlight(".$x.",".$y."); ";
-					//	echo "document.location.href=\"".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$str_schl."\"";
-					echo "' "; // end href
-					echo "\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' ";
-					echo "\n\t\tonmouseout='parent.parent.hideHighlight()'";
-				echo ">\n\t\t".$sname." (".$nr.")\n\t</a>";
+				echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:" // mit Link
+						."transtitle(\"auf Stra&szlig;e positioniert\"); "
+						."parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); "
+						."parent.parent.showHighlight(".$x.",".$y."); "
+						."' " // end href
+					."\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' "
+					."\n\t\tonmouseout='parent.parent.hideHighlight()'"
+				.">\n\t\t".$sname." (".$nr.")\n\t</a>";
 			} else { // keine Koord. gefunden
 				echo $sname." (".$nr.")"; // nur Anzeige, ohne Link
@@ -276,15 +302,14 @@
 		$sql="SELECT min(replace(h.hausnummer,' ','')) AS hsnr, ";
 		if($epsg == "25832") { // Transform nicht notwendig
-			$sql.="avg (st_x(p.wkb_geometry)) AS x, ";
-			$sql.="avg (st_y(p.wkb_geometry)) AS y ";		
+			$sql.="avg (st_x(p.wkb_geometry)) AS x, avg (st_y(p.wkb_geometry)) AS y ";		
 		} else {  
-			$sql.="avg (st_x(st_transform(p.wkb_geometry,".$epsg."))) AS x, ";
-			$sql.="avg (st_y(st_transform(p.wkb_geometry,".$epsg."))) AS y ";		
-		}
-		$sql.="FROM ap_pto p JOIN ax_lagebezeichnungmithausnummer h ON h.gml_id=ANY(p.dientzurdarstellungvon) 
-		WHERE p.art='HNR' AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 
-		AND p.endet IS NULL AND h.endet IS NULL
-		GROUP BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2) 
-		ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);";
+			$sql.="avg (st_x(st_transform(p.wkb_geometry,".$epsg."))) AS x, "
+			."avg (st_y(st_transform(p.wkb_geometry,".$epsg."))) AS y ";		
+		}
+		$sql.="FROM ap_pto p JOIN ax_lagebezeichnungmithausnummer h ON h.gml_id=ANY(p.dientzurdarstellungvon) "
+		."WHERE p.art='HNR' AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 "
+		."AND p.endet IS NULL AND h.endet IS NULL "
+		."GROUP BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2) "
+		."ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);";
 		// Problem: In der Datenbank gibt es mehrere hausnummern-Koordinaten fÃŒr verschiedene 
 		// MaÃstÃ€be der Kartendarstellung
@@ -312,14 +337,12 @@
 			$x=$rowh["x"];
 			$y=$rowh["y"];
-			echo "\n\t<td class='hsnr'>";
-				echo "<a href='";
-					echo "javascript:";
-					echo "transtitle(\"auf Haus ".$hsnr." positioniert\"); ";
-					echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalehs."); ";
-					echo "parent.parent.showHighlight(".$x.",".$y.");' ";
-				echo "onmouseover='parent.parent.showHighlight(".$x.",".$y.")' ";
-				echo "onmouseout='parent.parent.hideHighlight()";
-				echo "'>".$hsnr."</a>";
-			echo "</td>";
+			echo "\n\t<td class='hsnr'>"
+				."<a href='javascript:transtitle(\"auf Haus ".$hsnr." positioniert\"); "
+					."parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalehs."); "
+					."parent.parent.showHighlight(".$x.",".$y.");' "
+					."onmouseover='parent.parent.showHighlight(".$x.",".$y.")' "
+					."onmouseout='parent.parent.hideHighlight()"
+				."'>".$hsnr."</a>"
+			."</td>";
 			$cnt++;
 			$count++;
@@ -342,29 +365,21 @@
 // Start hier!
 // ===========
-if(isset($epsg)) {
-	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+
+// Validation: Eingabefeld aus Formular.
+// Suchbegriff (StraÃenname) oder StraÃenschlÃŒssel.
+// Hier formatierte Meldung und html-Foot.
+if (isset($street) and $street != "" ) {
+	if (!preg_match('#^[0-9a-zA-ZÃ€Ã¶ÃŒÃÃÃÃ* -.]{1,25}$#', $street)) {
+		echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
+		$street="";
+	}
 } else {
-	$epsg=$gui_epsg; // aus Conf
-}
-
-// Filter auf Zustaendigkeit z.B. ein Stadtgebiet
-if ($gemeinde == "") {
-	$gfilter = 0; // ungefiltert
-} elseif(strpos($gemeinde, ",") === false) {
-	$gfilter = 1; // Einzelwert
-} else {
-	$gfilter = 2; // Liste
-}
-// ax_lagebezeichnungkatalogeintrag.gemeinde: z.B. Classic='40' / NorBit  = '040'
-// Im Mapbender mit fuehrenden Nullen eingeben: gazetteer_alkis.SRC
-// alkisnav.htm?..&gemeinde=040&..
-
-// +++Zerlegung Eingabe aus "Balken" von Buchauskunft "Lage": Numerisch: Gem-Str-Haus-lfd
-
-if ($str_schl != "") { // Wert kommt aus aus Link
+	$street="";
+}
+
+if ($str_schl != "") { // aus Link
 	$trans="Hausnummern zur Stra&szlig;e";
 	suchHausZurStr(true);
-// Wert aus Eingabe in Formular
-} elseif($street != "") { 
+} elseif($street != "") { // Eingabe in Formular
 	if (trim($street, "*,0..9, ") == "") { // Zahl, ggf. mit Wildcard
 		$trans="Suche Stra&szlig;enschl&uuml;ssel \"".$street."\"";
Index: trunk/mapbender/http/nav/alkisnav_grd.php
===================================================================
--- trunk/mapbender/http/nav/alkisnav_grd.php	(revision 376)
+++ trunk/mapbender/http/nav/alkisnav_grd.php	(revision 399)
@@ -1,20 +1,65 @@
 <?php
-/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil Grundbuch-Suche 
-	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
-
+/*	Navigation mit ALKIS-Daten im Mapbender 2 - Teil Grundbuch-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
+	2018-02-15 Strikte Input-Validation der Parameter
 */
 
-// Variable initialisieren
-$ag="";
-$gbkennz="";
-$buchunggml="";
-$blattgml="";
-
 $cntget = extract($_GET);
-$gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); // temporÃ€r ..
+
+// 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! Formularfeld hidden
+
+if(isset($epsg)) { // SRS, Formularfeld hidden
+	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, Formularfeld hidden
+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;
+}
+
+// Optionale Parameter. Links aus der Baumstruktur. Wenn nicht gesetzt, dann die Variable initialisieren.
+if (isset($ag) and $ag != "" ) { // Amtsgericht-Nummer
+	if (!preg_match('#^[0-9]{4}$#', $ag)) {die("Eingabefehler Amtsgericht");}
+} else {
+	$ag="";
+}
+if (isset($buchunggml) and $buchunggml != "" ) {
+	if (!preg_match('#^[0-9a-zA-Z]{16}$#', $buchunggml)) {die("Eingabefehler GML-ID Buchung");}
+} else {
+	$buchunggml="";
+}
+if (isset($blattgml) and $blattgml != "" ) {
+	if (!preg_match('#^[0-9a-zA-Z]{16}$#', $blattgml)) {die("Eingabefehler GML-ID Blatt");}
+} else {
+	$blattgml="";
+}
+if (isset($gbbeznam) and $gbbeznam != "" ) {
+	if (!preg_match('#^[a-zA-ZÃ€ÃŒÃ¶ÃÃÃÃ12 -]{3,40}$#', $gbbeznam)) {die("Eingabefehler Grundbuch-Bezirks-Name '".$gbbeznam."'");}
+} else {
+	$gbbeznam="";
+}
+
 include("../../conf/alkisnav_conf.php"); // Konfigurations-Einstellungen
 include("alkisnav_fkt.php"); // Funktionen
@@ -59,7 +104,6 @@
 	$linelimit=40;
 
-	$sql ="SELECT stelle, bezeichnung AS ag FROM ax_dienststelle 
-	WHERE stelle IN (".$liste_ag.") AND stellenart = 1000 AND endet IS NULL 
-	ORDER BY bezeichnung LIMIT $1 ;";
+	$sql="SELECT stelle, bezeichnung AS ag FROM ax_dienststelle "
+	."WHERE stelle IN (".$liste_ag.") AND stellenart = 1000 AND endet IS NULL ORDER BY bezeichnung LIMIT $1 ;";
 	$res = pg_prepare("", $sql);
 	$res = pg_execute("", array($linelimit));
@@ -99,9 +143,8 @@
 	// Body
 	// Die Subquery stellt sicher, dass nur Bezirke aufgelistet werden, die auch BlÃ€tter enthalten
-	$sql ="SELECT g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g 
-	JOIN ax_dienststelle a ON g.stelle=a.stelle 
-	WHERE a.stelle = $1 AND a.stellenart = 1000 AND a.endet IS NULL AND g.endet IS NULL 
-	AND NOT (SELECT gml_id FROM ax_buchungsblatt b WHERE b.land=g.land AND b.bezirk=g.bezirk AND b.endet IS NULL LIMIT 1) IS NULL 
-	ORDER BY g.bezeichnung LIMIT $2 ;";
+	$sql ="SELECT g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g JOIN ax_dienststelle a ON g.stelle=a.stelle "
+	."WHERE a.stelle = $1 AND a.stellenart = 1000 AND a.endet IS NULL AND g.endet IS NULL "
+	."AND NOT (SELECT gml_id FROM ax_buchungsblatt b WHERE b.land=g.land AND b.bezirk=g.bezirk AND b.endet IS NULL LIMIT 1) IS NULL "
+	."ORDER BY g.bezeichnung LIMIT $2 ;";
 
 	$v = array($agkey, $linelimit);
@@ -135,6 +178,6 @@
 	// Parameter = SchlÃŒssel des Bezirks
 	#global $debug;
-	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezeichnung FROM ax_buchungsblattbezirk g 
-	JOIN ax_dienststelle a ON g.stelle=a.stelle WHERE g.bezirk= $1 AND g.endet IS NULL AND a.endet IS NULL LIMIT 1;";
+	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezeichnung FROM ax_buchungsblattbezirk g "
+	."JOIN ax_dienststelle a ON g.stelle=a.stelle WHERE g.bezirk= $1 AND g.endet IS NULL AND a.endet IS NULL LIMIT 1;";
 	$v=array($gbbez);
 	$res=pg_prepare("", $sql);
@@ -166,8 +209,8 @@
 	$linelimit=80;
 
-	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g 
-	JOIN ax_dienststelle a ON g.stelle=a.stelle 
-	WHERE g.bezeichnung ILIKE $1 AND g.endet IS NULL AND a.endet IS NULL 
-	ORDER BY a.bezeichnung, g.bezeichnung LIMIT $2 ;";// "AND a.stellenart=1000 " Amtsgericht
+	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g "
+	."JOIN ax_dienststelle a ON g.stelle=a.stelle "
+	."WHERE g.bezeichnung ILIKE $1 AND g.endet IS NULL AND a.endet IS NULL "
+	."ORDER BY a.bezeichnung, g.bezeichnung LIMIT $2 ;"; // "AND a.stellenart=1000 " Amtsgericht
 	if ( $gbkennz == "") {
 		$match = "%";
@@ -175,4 +218,5 @@
 		if(preg_match("/\*/",$gbkennz)){
 			$match = trim(preg_replace("/\*/i","%", strtoupper($gbkennz)));
+			if (substr($match, strlen($match), 1) != "%") {$match.="%";} // Wildcard am Ende obligatorisch
 		} else {
 			$match = trim($gbkennz)."%";
@@ -227,6 +271,6 @@
 	}
 	// Body
-	$sql ="SELECT b.gml_id, b.buchungsblattnummermitbuchstabenerweiterung AS blatt FROM ax_buchungsblatt b 
-	WHERE b.bezirk= $1 AND b.endet IS NULL ORDER BY b.buchungsblattnummermitbuchstabenerweiterung LIMIT $2 ;";
+	$sql ="SELECT b.gml_id, b.buchungsblattnummermitbuchstabenerweiterung AS blatt FROM ax_buchungsblatt b "
+	."WHERE b.bezirk= $1 AND b.endet IS NULL ORDER BY b.buchungsblattnummermitbuchstabenerweiterung LIMIT $2 ;";
 	$v=array($zgbbez, $linelimit);
 	$res=pg_prepare("", $sql);
@@ -251,5 +295,5 @@
 		echo "\n<p>Geben sie ein: '".$zgbbez."-999A'<br>wobei '999A' = gesuchtes GB-Blatt</p>";
 		// Vorbelegen des Eingabefeldes fÃŒr neue Suche
-		echo "<script type='text/javascript'>parent.GrdGazetteerFrame.gbkennz.value='".$zgbbez."-?';</script>";
+		echo "<script type='text/javascript'>parent.GrdGazetteerFrame.gbkennz.value='".$zgbbez."-';</script>";
 	} elseif ($cntbl > 1) {
 		echo "\n<p class='anz'>".$cntbl." Bl&auml;tter</p>"; // im Limit	
@@ -261,6 +305,6 @@
 	// Kennzeichen "Bezirk + Blatt" eingegeben. Dazu die gml_id des Blattes ermitteln.
 	global $debug, $zgbbez, $zblatt, $zblattn, $zblattz;
-	$sql ="SELECT b.gml_id, b.buchungsblattnummermitbuchstabenerweiterung AS blatt FROM ax_buchungsblatt b 
-	WHERE b.bezirk= $1 AND b.endet IS NULL AND b.buchungsblattnummermitbuchstabenerweiterung ";
+	$sql ="SELECT b.gml_id, b.buchungsblattnummermitbuchstabenerweiterung AS blatt FROM ax_buchungsblatt b "
+	."WHERE b.bezirk= $1 AND b.endet IS NULL AND b.buchungsblattnummermitbuchstabenerweiterung ";
 
 	if ($zblattz == "") { // Ohne Buchstabenerweiterung: Formate '123','000123 ','0000123'
@@ -310,7 +354,7 @@
 
 	// Blatt ->  B u c h u n g s s t e l l e
-	$sql ="SELECT s.gml_id FROM ax_buchungsstelle s 
-	JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id
-	WHERE b.bezirk= $1 AND s.endet IS NULL AND b.endet IS NULL AND b.buchungsblattnummermitbuchstabenerweiterung ";
+	$sql ="SELECT s.gml_id FROM ax_buchungsstelle s "
+	."JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id "
+	."WHERE b.bezirk= $1 AND s.endet IS NULL AND b.endet IS NULL AND b.buchungsblattnummermitbuchstabenerweiterung ";
 
 	if ($zblattz == "") { // Ohne Buchstabenerweiterung
@@ -425,16 +469,14 @@
 	// Recht "an" (dienende Buchungen und ihre Flurst.)
 
-$sql =$sqlanf.", sd.gml_id AS diengml, sd.laufendenummer AS dienlfd, 
-bd.gml_id AS dienbltgml, bd.buchungsblattnummermitbuchstabenerweiterung AS dienblatt, 
-gd.stelle, gd.gml_id AS dienbezgml, gd.bezirk, gd.bezeichnung AS diengbbez 
-FROM ax_buchungsstelle sh 
-JOIN ax_buchungsstelle sd ON sd.gml_id=ANY(sh.an) 
-JOIN ax_flurstueck f ON f.istgebucht=sd.gml_id 
-JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
-JOIN ax_buchungsblatt bd ON sd.istbestandteilvon=bd.gml_id 
-JOIN ax_buchungsblattbezirk gd ON bd.land=gd.land AND bd.bezirk=gd.bezirk 
-WHERE sh.gml_id = $1 AND sh.endet IS NULL AND sd.endet IS NULL AND f.endet IS NULL AND bd.endet IS NULL AND gd.endet IS NULL "
-
-.$sqlfilter."ORDER BY gd.bezeichnung, bd.buchungsblattnummermitbuchstabenerweiterung, cast(sd.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
+	$sql =$sqlanf.", sd.gml_id AS diengml, sd.laufendenummer AS dienlfd, bd.gml_id AS dienbltgml, bd.buchungsblattnummermitbuchstabenerweiterung AS dienblatt, "
+	."gd.stelle, gd.gml_id AS dienbezgml, gd.bezirk, gd.bezeichnung AS diengbbez "
+	."FROM ax_buchungsstelle sh JOIN ax_buchungsstelle sd ON sd.gml_id=ANY(sh.an) "
+	."JOIN ax_flurstueck f ON f.istgebucht=sd.gml_id "
+	."JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer "
+	."JOIN ax_buchungsblatt bd ON sd.istbestandteilvon=bd.gml_id "
+	."JOIN ax_buchungsblattbezirk gd ON bd.land=gd.land AND bd.bezirk=gd.bezirk "
+	."WHERE sh.gml_id = $1 AND sh.endet IS NULL AND sd.endet IS NULL AND f.endet IS NULL AND bd.endet IS NULL AND gd.endet IS NULL "
+
+	.$sqlfilter."ORDER BY gd.bezeichnung, bd.buchungsblattnummermitbuchstabenerweiterung, cast(sd.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
 
 	$v=array($buchunggml);
@@ -496,18 +538,15 @@
 // Start hier!
 // ===========
-if(isset($epsg)) {
-	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+
+// Validation: Eingabefeld aus Formular.
+// Suchbegriff (Bezirksname) oder Grundbuch-Kennzeichen gggg-999999z-BVNR (17).
+// Hier formatierte Meldung und html-Foot.
+if (isset($gbkennz) and $gbkennz != "" ) { 
+	if (!preg_match('#^[0-9a-zA-ZÃ€Ã¶ÃŒÃÃÃÃ* -]{1,25}$#', $gbkennz)) {
+		echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
+		$gbkennz="";
+	}
 } else {
-	$epsg=$gui_epsg; // aus Conf
-}
-
-// Filter aus Conf-Datei
-if ($gemeinde == "") {
-	$gfilter = 0; // ungefiltert
-} elseif(strpos($gemeinde, ",") === false) {
-	$gfilter = 1; // Einzelwert
-} else {
-	$gfilter = 2; // Liste
-//	$gemeinde = "'".str_replace(",", "','", $gemeinde)."'"; // Jedes Element in ''
+	$gbkennz="";
 }
 
Index: trunk/mapbender/http/nav/alkisnav_fkt.php
===================================================================
--- trunk/mapbender/http/nav/alkisnav_fkt.php	(revision 376)
+++ trunk/mapbender/http/nav/alkisnav_fkt.php	(revision 399)
@@ -1,10 +1,10 @@
 <?php
-/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil "Funktionen"
+/*	Navigation mit ALKIS-Daten im Mapbender 2 - Teil "Funktionen"
 	(Wird nicht direkt aufgerufen sonden in den anderen Modulen eingebunden).
-	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
-
+	Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
 Version vom 
 	2016-02-11 Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
 	2016-11-28 Gemeinsam genutzte Datenbanken ermÃ¶glichen
+	2018-02-15 Ãberarbeitung des Code
 */
 
@@ -94,9 +94,9 @@
 	}
 	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
-	echo "\n<div class='ga".$cls."' title='Amtsgericht'>";
-		echo "\n\t\t<img class='nwlink' src='ico/Gericht.png' width='16' height='16' alt='AG' title='Amtsgericht'> ";
-		echo "AG <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;ag=".$anr."'>";		
-		echo $agd."</a> (".$anr.")";
-	echo "\n</div>";
+	echo "\n<div class='ga".$cls."' title='Amtsgericht'>"
+		."\n\t\t<img class='nwlink' src='ico/Gericht.png' width='16' height='16' alt='AG' title='Amtsgericht'> "
+		."AG <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;ag=".$anr."'>"	
+		.$agd."</a> (".$anr.")"
+	."\n</div>";
 	return;
 }
@@ -108,15 +108,15 @@
 	$gnamd=htmlentities($gnam, ENT_QUOTES, "UTF-8");
 	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
-	echo "\n<div class='gk".$cls."' title='GB-Bezirk'>";
-	echo "\n\t\t<img class='nwlink' src='ico/GB-Bezirk.png' width='16' height='16' alt='Bez.' title='GB-Bezirk'> ";
-	echo "<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;gbkennz=".$zgbbez;
-	echo "&amp;gbbeznam=".urlencode($gnam);
-	if ($person != "") { // EigentÃŒmer-Suche
-		echo "&amp;person=".$person."'>";
-		echo "Bezirk ".$gnamd."</a> (".$zgbbez.")";		
-	} else {  // Grundbuch-Suche
-		echo "'>";
-		echo "Bezirk ".$gnamd."</a> (".suchfeld($zgbbez).")";		
-	}
+	echo "\n<div class='gk".$cls."' title='GB-Bezirk'>"
+		."\n\t\t<img class='nwlink' src='ico/GB-Bezirk.png' width='16' height='16' alt='Bez.' title='GB-Bezirk'> "
+		."<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;gbkennz=".$zgbbez
+		."&amp;gbbeznam=".urlencode($gnam);
+		if ($person != "") { // EigentÃŒmer-Suche
+			echo "&amp;person=".$person."'>"
+			."Bezirk ".$gnamd."</a> (".$zgbbez.")";		
+		} else {  // Grundbuch-Suche
+			echo "'>"
+			."Bezirk ".$gnamd."</a> (".suchfeld($zgbbez).")";		
+		}
 	echo "\n</div>";
 	return;
@@ -142,12 +142,12 @@
 		echo "\n\t<img class='nwlink' src='ico/GBBlatt.png' width='16' height='16' alt='Blatt' title='".$dientxt."GB-Blatt'>";
 	} else {
-		echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$blattgml."\")'>";
-			echo "\n\t\t<img class='nwlink' src='ico/GBBlatt_link.png' width='16' height='16' alt='Blatt' title='Nachweis'>";
-		echo "\n\t</a> ";
+		echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$blattgml."\")'>"
+			."\n\t\t<img class='nwlink' src='ico/GBBlatt_link.png' width='16' height='16' alt='Blatt' title='Nachweis'>"
+		."\n\t</a> ";
 	}
 
 	// Text, Self-Link
-	echo $nam." <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg;
-	echo "&amp;blattgml=".$blattgml."&amp;gbkennz=".$bezirk."-".$blattlnk;
+	echo $nam." <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg
+	."&amp;blattgml=".$blattgml."&amp;gbkennz=".$bezirk."-".$blattlnk;
 
 	echo "&amp;gbbeznam=".urlencode($beznam);
@@ -176,12 +176,12 @@
 	}
 	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
-	echo "\n<div class='gs".$cls."' title='".$ti."Grundst&uuml;ck'>";
-	echo "\n\t<img class='nwlink' src='ico/Grundstueck.png' width='16' height='16' alt='GS'  title='".$ti."Grundst&uuml;ck'> ".$re;
+	echo "\n<div class='gs".$cls."' title='".$ti."Grundst&uuml;ck'>"
+	."\n\t<img class='nwlink' src='ico/Grundstueck.png' width='16' height='16' alt='GS'  title='".$ti."Grundst&uuml;ck'> ".$re;
 	if ($blattkennz == "") { // ohne Link
 		echo "Buchung ".$bvnra;
 	} else {
 		$gbkennlnk=urlencode($blattkennz."-".$bvnr); // Trailing Blanks!
-		echo "<a href='".$_SERVER['SCRIPT_NAME']. "?gkz=". $gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;buchunggml=".$buchunggml;
-		echo "&amp;gbkennz=".$gbkennlnk."'>Buchung ".$bvnra."</a>";
+		echo "<a href='".$_SERVER['SCRIPT_NAME']. "?gkz=". $gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;buchunggml=".$buchunggml
+		."&amp;gbkennz=".$gbkennlnk."'>Buchung ".$bvnra."</a>";
 	}
 	echo "\n</div>";
@@ -195,9 +195,9 @@
 	$bez=urlencode($gmdname);
 	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
-	echo "\n<div class='gm".$cls."' title='Gemeinde'>";
-		echo "\n\t\t<img class='nwlink' src='ico/Gemeinde.png' width='16' height='16' alt='Stadt'>";
-		echo " Gem. <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;gm=".$gmdnr."&amp;bez=".$bez."'>";		
-		echo  " ".$stadt."</a> (".substr($gmdnr, 5).")";
-	echo "\n</div>";
+	echo "\n<div class='gm".$cls."' title='Gemeinde'>"
+		."\n\t\t<img class='nwlink' src='ico/Gemeinde.png' width='16' height='16' alt='Stadt'>"
+		." Gem. <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;gm=".$gmdnr."&amp;bez=".$bez."'>"
+		." ".$stadt."</a> (".substr($gmdnr, 5).")"
+	."\n</div>";
 	return;
 }
@@ -221,9 +221,9 @@
 	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
 
-	echo "\n<div class='gk".$cls."' title='Gemarkung'>";
-	echo "\n\t\t<img class='nwlink' src='ico/Gemarkung.png' width='16' height='16' alt='GKG' title='Gemarkung'>";
-	echo " OT <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$gkgnr."'>";		
-	echo  " ".$gnam."</a> (".substr($gkgnr, 2).")";
-	echo "\n</div>";
+	echo "\n<div class='gk".$cls."' title='Gemarkung'>"
+		."\n\t\t<img class='nwlink' src='ico/Gemarkung.png' width='16' height='16' alt='GKG' title='Gemarkung'>"
+		." OT <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$gkgnr."'>"	
+		." ".$gnam."</a> (".substr($gkgnr, 2).")"
+	."\n</div>";
 	return;
 }
@@ -234,16 +234,15 @@
 
 	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
-	echo "\n<div class='fs".$cls."'>";
-	echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$fs_gml."\")'>";
-		echo "\n\t\t<img class='nwlink' src='ico/Flurstueck_Link.png' width='16' height='16' alt='FS' title='Nachweis'>";
-	echo "\n\t</a>\n\t";			
-
-	echo "&nbsp;<a title='Flurst&uuml;ck positionieren 1:".$scalefs."' href='";
-	echo "javascript:";
-		echo "transtitle(\"auf Flurst&uuml;ck positioniert\"); ";
-		echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalefs."); ";
-		echo "parent.parent.showHighlight(".$x.",".$y.");' ";
-	echo "onmouseover='parent.parent.showHighlight(".$x.",".$y.")' ";
-	echo "onmouseout='parent.parent.hideHighlight()'>";
+	echo "\n<div class='fs".$cls."'>"
+	."\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$fs_gml."\")'>"
+		."\n\t\t<img class='nwlink' src='ico/Flurstueck_Link.png' width='16' height='16' alt='FS' title='Nachweis'>"
+	."\n\t</a>\n\t";		
+
+	echo "&nbsp;<a title='Flurst&uuml;ck positionieren 1:".$scalefs."' href='"
+	."javascript:transtitle(\"auf Flurst&uuml;ck positioniert\"); "
+		."parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalefs."); "
+		."parent.parent.showHighlight(".$x.",".$y.");' "
+	."onmouseover='parent.parent.showHighlight(".$x.",".$y.")' "
+	."onmouseout='parent.parent.hideHighlight()'>";
 
 	if ($gmkg == "" ) {
@@ -262,14 +261,13 @@
 
 	$nnam=htmlentities($nachname, ENT_QUOTES, "UTF-8");
-	$namlnk=urlencode($nachname);
+	$namlnk=urlencode(substr($nachname,0,50));
 	$vnam=htmlentities($vorname, ENT_QUOTES, "UTF-8");
-	// Link zur Auskunft Person ++ Icon differenzieren nach Eigentuemerart?
-
-echo "<div class='pe'>
-	<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisnamstruk.php?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;gmlid=".$persongml."\")'>
-		<img class='nwlink' src='ico/Eigentuemer.png' width='16' height='16' alt='EIG' title='Nachweis'>
-	</a> 		
-	<a title='Person' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$persongml."&amp;name=".$namlnk."'>".$nnam.", ".$vnam."</a>
-</div>";
+	// Link zur Auskunft Person, Icon differenzieren nach Eigentuemerart?
+	echo "<div class='pe'>"
+		."\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisnamstruk.php?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;gmlid=".$persongml."\")'>"
+			."\n\t\t<img class='nwlink' src='ico/Eigentuemer.png' width='16' height='16' alt='EIG' title='Nachweis'>"
+		."\n\t</a>" 		
+		."\n\t<a title='Person' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$persongml."&amp;name=".$namlnk."'>".$nnam.", ".$vnam."</a>"
+	."</div>";
 return;
 }
@@ -279,15 +277,14 @@
 	// Die Kopfzeile ÃŒber den Hausnummern hat einen zusÃ€tzlichen Koordinaten-Map-Link, das ist in der Liste zu aufwÃ€ndig?
 	global $gkz, $gemeinde, $epsg, $auskpath, $gfilter, $debug;
-	//if ($debug > 1) {echo "<p class='dbg'>function zeile_strasse()<p>";} // Ablauf-Verfolgung
 
 	echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
 
 	// Icon -> Buchnachweis
-	echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
-		echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.png' width='16' height='16' alt='STR' title='Auskunft Stra&szlig;e'>";
-	echo "\n\t</a>";
+	echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>"
+		."\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.png' width='16' height='16' alt='STR' title='Auskunft Stra&szlig;e'>"
+	."\n\t</a>";
 	// Zeile -> Suche HsNr
-	echo " <a class='st' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."' title='in ".$gemname."'>".$sname;
-	echo "</a> (".$skey.")";
+	echo " <a class='st' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."' title='in ".$gemname."'>".$sname
+	."</a> (".$skey.")";
 
 	// Die Gemeinde dahinter falls mehrere mÃ¶glich
@@ -311,9 +308,8 @@
 	$sql1 ="SELECT s1.laufendenummer AS lfd, s1.gml_id AS bsgml, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.gemeinde, ";
 	if($epsg == "25832") { // Transform nicht notwendig
-		$sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, ";
-		$sql1.="st_y(st_centroid(f.wkb_geometry)) AS y, ";
+		$sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, st_y(st_centroid(f.wkb_geometry)) AS y, ";
 	} else {  
-		$sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
-		$sql1.="st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y, ";			
+		$sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, "
+			."st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y, ";			
 	}
 	$sql1.="g.bezeichnung FROM ax_buchungsstelle s1 "; 
@@ -323,10 +319,10 @@
 
 	// zwischen, Variante 2. Nur an oder "an" und "zu"?
-	$sqlz2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) 
-	JOIN ax_flurstueck f ON f.istgebucht=s2.gml_id ";
+	$sqlz2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) "
+		."JOIN ax_flurstueck f ON f.istgebucht=s2.gml_id ";
 
 	// hinten gleich
-	$sql2="JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
-	WHERE s1.istbestandteilvon = $1 AND f.endet IS NULL AND s1.endet IS NULL ";
+	$sql2="JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer "
+		."WHERE s1.istbestandteilvon = $1 AND f.endet IS NULL AND s1.endet IS NULL ";
 
 	switch ($gfilter) {
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>";
-
 ?>
 
