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