Ignore:
Timestamp:
02/15/18 17:46:51 (6 years ago)
Author:
frank.jaeger
Message:

ALKIS-Navigation für Mapbender 2: Input Validation für alle Parameter. Kleine Korrekturen.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/mapbender/http/nav/alkisnav_adr.php

    r376 r399  
    11<?php 
    2 /*      Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil Adressen-Suche  
    3         Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer. 
    4  
     2/*      Navigation mit ALKIS-Daten im Mapbender 2 - Teil Adressen-Suche  
     3        Datenbank-Struktur aus dem norGIS-ALKIS-Importer. 
    54Version vom  
    65        2016-02-11 Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet. 
    76        2016-03-02 $gemeinde auf feste LÀnge korrigieren 
    87        2016-11-28 Gemeinsam genutzte Datenbanken ermöglichen 
    9  
    10         ToDo: 
     8        2018-02-15 Strikte Input-Validation der Parameter 
     9ToDo: 
    1110        -       Gruppierung (mit Zeile) der Straßenliste nach Gemeinde 
    1211        -       Eingabe aus "Balken" von Buchauskunft "Lage" zulassen: Numerisch: Gem-Str-Haus-lfd 
     
    1716*/ 
    1817 
    19 // Variable Initialisieren 
    20 $str_schl=""; 
    21 $skey=""; 
    22  
    2318$cntget = extract($_GET); 
    24 $gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); // temporÀr 
     19 
     20// Input-Validation 
     21// Parameter aus Konfiguration oder Links sollten keine "Eingabefehler" enthalten. 
     22// Entweder falsche Konfiguration oder Hack. Programm sofort abbrechen. 
     23if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} // Mandant, muss! 
     24 
     25if(isset($epsg)) { // SRS, kann. Wenn als Parameter ... 
     26        if (preg_match('#^EPSG:[0-9]{4,5}$#', $epsg)) { // Prefix aus MB-Mapframe 
     27                $epsg = str_replace("EPSG:", "" , $epsg); 
     28        } elseif (!preg_match('#^[0-9]{4,5}$#', $epsg)) { // nur die Nummer 
     29                die("Eingabefehler epsg"); 
     30        } 
     31} else { // Nichts ÃŒbergeben 
     32        $epsg=$gui_epsg; // dann default aus Conf 
     33} 
     34 
     35// Filter-Parameter fÃŒr Gemeindenummer in Kreis-Datenbank aus der Mapbender GUI-Konfiguration 
     36if (isset($gemeinde) AND trim($gemeinde, '0') != "") { 
     37        if (!preg_match('#^[0-9]{1,3}$#', $gemeinde)) {die("Eingabefehler Gemeinde");} 
     38        $gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); 
     39        if(strpos($gemeinde, ",") === false) { 
     40                $gfilter = 1; // Einzelwert 
     41        } else { 
     42                $gfilter = 2; // Liste 
     43        } 
     44} else { // Kein Filter 
     45        $gemeinde = ""; 
     46        $gfilter = 0; 
     47} 
     48// // http://skrzmaptest01.asp.krzwan.de/mapbender/nav/alkisnav_adr.php?gkz=210&gemeinde=004&epsg=25832&str_schl=0575800401798 
     49if (isset($str_schl) ) { 
     50        if (!preg_match('#^[0-9]{4,13}$#', $str_schl)) {die("Eingabefehler Stra&zlig;enschl&uuml;ssel");} 
     51} else { 
     52        $str_schl=""; 
     53} 
     54 
    2555include("../../conf/alkisnav_conf.php"); 
    2656include("alkisnav_fkt.php"); // Funktionen 
     
    75105        } 
    76106 
    77         $sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage  
    78         FROM ax_lagebezeichnungkatalogeintrag k  
    79         JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde  
    80         WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL "; 
     107        $sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage " 
     108        ."FROM ax_lagebezeichnungkatalogeintrag k " 
     109        ."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde " 
     110        ."WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL "; 
    81111 
    82112        switch ($gfilter) { 
     
    143173                $match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten  
    144174        } 
    145         $sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage  
    146         FROM ax_lagebezeichnungkatalogeintrag as k  
    147         JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde  
    148         WHERE k.lage LIKE $1 AND k.endet IS NULL AND g.endet IS NULL "; 
     175        $sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage " 
     176        ."FROM ax_lagebezeichnungkatalogeintrag as k " 
     177        ."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde " 
     178        ."WHERE k.lage LIKE $1 AND k.endet IS NULL AND g.endet IS NULL "; 
    149179        switch ($gfilter) { 
    150180                case 1: // Einzelwert 
     
    192222        // Head 
    193223        // Strasse zum Strassenschluessel 
    194         $sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage  
    195         FROM ax_lagebezeichnungkatalogeintrag as k  
    196         JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde  
    197         WHERE k.schluesselgesamt = $1 AND k.endet IS NULL AND g.endet IS NULL LIMIT 1";  
     224        $sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage " 
     225        ."FROM ax_lagebezeichnungkatalogeintrag as k " 
     226        ."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde " 
     227        ."WHERE k.schluesselgesamt = $1 AND k.endet IS NULL AND g.endet IS NULL LIMIT 1";  
    198228 
    199229        $v=array($str_schl);    // Schluessel-Gesamt .. 
     
    220250                        $sqlko ="SELECT "; 
    221251                        if($epsg == "25832") { // Transform nicht notwendig 
    222                                 $sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, "; 
    223                                 $sqlko.="st_y(st_Centroid(f.wkb_geometry)) AS y "; 
     252                                $sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, st_y(st_Centroid(f.wkb_geometry)) AS y "; 
    224253                        } else { 
    225                                 $sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, "; 
    226                                 $sqlko.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y "; 
     254                                $sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, " 
     255                                ."st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y "; 
    227256                        } 
    228                         $sqlko.="FROM ax_lagebezeichnungohnehausnummer o "; 
    229                         $sqlko.="JOIN ax_flurstueck f ON o.gml_id=ANY(f.zeigtauf) "; 
    230                         $sqlko.="WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 ";        
    231                         $sqlko.="LIMIT 1;"; // die erstbeste Koordinate 
     257                        $sqlko.="FROM ax_lagebezeichnungohnehausnummer o JOIN ax_flurstueck f ON o.gml_id=ANY(f.zeigtauf) " 
     258                        ."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 
    232259 
    233260                        $v=array($land,$regb,$kreis,$gemnd,$nr); 
     
    249276 
    250277                        if ($x > 0) { // Koord. bekommen? 
    251                                 echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:"; // mit Link 
    252                                                 echo "transtitle(\"auf Stra&szlig;e positioniert\"); "; 
    253                                                 echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); "; 
    254                                                 echo "parent.parent.showHighlight(".$x.",".$y."); "; 
    255                                         //      echo "document.location.href=\"".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$str_schl."\""; 
    256                                         echo "' "; // end href 
    257                                         echo "\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' "; 
    258                                         echo "\n\t\tonmouseout='parent.parent.hideHighlight()'"; 
    259                                 echo ">\n\t\t".$sname." (".$nr.")\n\t</a>"; 
     278                                echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:" // mit Link 
     279                                                ."transtitle(\"auf Stra&szlig;e positioniert\"); " 
     280                                                ."parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); " 
     281                                                ."parent.parent.showHighlight(".$x.",".$y."); " 
     282                                                ."' " // end href 
     283                                        ."\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' " 
     284                                        ."\n\t\tonmouseout='parent.parent.hideHighlight()'" 
     285                                .">\n\t\t".$sname." (".$nr.")\n\t</a>"; 
    260286                        } else { // keine Koord. gefunden 
    261287                                echo $sname." (".$nr.")"; // nur Anzeige, ohne Link 
     
    276302                $sql="SELECT min(replace(h.hausnummer,' ','')) AS hsnr, "; 
    277303                if($epsg == "25832") { // Transform nicht notwendig 
    278                         $sql.="avg (st_x(p.wkb_geometry)) AS x, "; 
    279                         $sql.="avg (st_y(p.wkb_geometry)) AS y ";                
     304                        $sql.="avg (st_x(p.wkb_geometry)) AS x, avg (st_y(p.wkb_geometry)) AS y ";               
    280305                } else {   
    281                         $sql.="avg (st_x(st_transform(p.wkb_geometry,".$epsg."))) AS x, "; 
    282                         $sql.="avg (st_y(st_transform(p.wkb_geometry,".$epsg."))) AS y ";                
    283                 } 
    284                 $sql.="FROM ap_pto p JOIN ax_lagebezeichnungmithausnummer h ON h.gml_id=ANY(p.dientzurdarstellungvon)  
    285                 WHERE p.art='HNR' AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5  
    286                 AND p.endet IS NULL AND h.endet IS NULL 
    287                 GROUP BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2)  
    288                 ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);"; 
     306                        $sql.="avg (st_x(st_transform(p.wkb_geometry,".$epsg."))) AS x, " 
     307                        ."avg (st_y(st_transform(p.wkb_geometry,".$epsg."))) AS y ";             
     308                } 
     309                $sql.="FROM ap_pto p JOIN ax_lagebezeichnungmithausnummer h ON h.gml_id=ANY(p.dientzurdarstellungvon) " 
     310                ."WHERE p.art='HNR' AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 " 
     311                ."AND p.endet IS NULL AND h.endet IS NULL " 
     312                ."GROUP BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2) " 
     313                ."ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);"; 
    289314                // Problem: In der Datenbank gibt es mehrere hausnummern-Koordinaten fÃŒr verschiedene  
    290315                // MaßstÀbe der Kartendarstellung 
     
    312337                        $x=$rowh["x"]; 
    313338                        $y=$rowh["y"]; 
    314                         echo "\n\t<td class='hsnr'>"; 
    315                                 echo "<a href='"; 
    316                                         echo "javascript:"; 
    317                                         echo "transtitle(\"auf Haus ".$hsnr." positioniert\"); "; 
    318                                         echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalehs."); "; 
    319                                         echo "parent.parent.showHighlight(".$x.",".$y.");' "; 
    320                                 echo "onmouseover='parent.parent.showHighlight(".$x.",".$y.")' "; 
    321                                 echo "onmouseout='parent.parent.hideHighlight()"; 
    322                                 echo "'>".$hsnr."</a>"; 
    323                         echo "</td>"; 
     339                        echo "\n\t<td class='hsnr'>" 
     340                                ."<a href='javascript:transtitle(\"auf Haus ".$hsnr." positioniert\"); " 
     341                                        ."parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalehs."); " 
     342                                        ."parent.parent.showHighlight(".$x.",".$y.");' " 
     343                                        ."onmouseover='parent.parent.showHighlight(".$x.",".$y.")' " 
     344                                        ."onmouseout='parent.parent.hideHighlight()" 
     345                                ."'>".$hsnr."</a>" 
     346                        ."</td>"; 
    324347                        $cnt++; 
    325348                        $count++; 
     
    342365// Start hier! 
    343366// =========== 
    344 if(isset($epsg)) { 
    345         $epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);    
     367 
     368// Validation: Eingabefeld aus Formular. 
     369// Suchbegriff (Straßenname) oder StraßenschlÃŒssel. 
     370// Hier formatierte Meldung und html-Foot. 
     371if (isset($street) and $street != "" ) { 
     372        if (!preg_match('#^[0-9a-zA-ZÀöÌÄÖÜß* -.]{1,25}$#', $street)) { 
     373                echo "<p class='err'>Eingabe unzul&auml;ssig!</p>"; 
     374                $street=""; 
     375        } 
    346376} else { 
    347         $epsg=$gui_epsg; // aus Conf 
    348 } 
    349  
    350 // Filter auf Zustaendigkeit z.B. ein Stadtgebiet 
    351 if ($gemeinde == "") { 
    352         $gfilter = 0; // ungefiltert 
    353 } elseif(strpos($gemeinde, ",") === false) { 
    354         $gfilter = 1; // Einzelwert 
    355 } else { 
    356         $gfilter = 2; // Liste 
    357 } 
    358 // ax_lagebezeichnungkatalogeintrag.gemeinde: z.B. Classic='40' / NorBit  = '040' 
    359 // Im Mapbender mit fuehrenden Nullen eingeben: gazetteer_alkis.SRC 
    360 // alkisnav.htm?..&gemeinde=040&.. 
    361  
    362 // +++Zerlegung Eingabe aus "Balken" von Buchauskunft "Lage": Numerisch: Gem-Str-Haus-lfd 
    363  
    364 if ($str_schl != "") { // Wert kommt aus aus Link 
     377        $street=""; 
     378} 
     379 
     380if ($str_schl != "") { // aus Link 
    365381        $trans="Hausnummern zur Stra&szlig;e"; 
    366382        suchHausZurStr(true); 
    367 // Wert aus Eingabe in Formular 
    368 } elseif($street != "") {  
     383} elseif($street != "") { // Eingabe in Formular 
    369384        if (trim($street, "*,0..9, ") == "") { // Zahl, ggf. mit Wildcard 
    370385                $trans="Suche Stra&szlig;enschl&uuml;ssel \"".$street."\""; 
Note: See TracChangeset for help on using the changeset viewer.