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