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";
