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_eig.php

    r376 r399  
    11<?php 
    2 /*      Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil EigentÃŒmer-Suche  
    3         Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer. 
    4  
    5  Version vom 
     2/*      Navigation mit ALKIS-Daten im Mapbender 2 - Teil EigentÃŒmer-Suche  
     3        Datenbank-Struktur aus dem norGIS-ALKIS-Importer. 
     4Version 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-07-18 Personendaten: Zeilen getauscht. Wie Brief-Anschrift. 
    98        2016-11-28 Gemeinsam genutzte Datenbanken ermöglichen 
     9        2018-02-15 Strikte Input-Validation der Parameter 
    1010*/ 
    1111 
    12 // Variable initialisieren 
    13 $gbkennz=""; 
    14 $blattgml=""; 
    15 $person =""; 
    16  
    1712$cntget = extract($_GET); 
    18 $gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); // temporÀr .. 
     13 
     14// Input-Validation 
     15// Parameter aus Konfiguration oder Links sollten keine "Eingabefehler" enthalten. 
     16// Entweder falsche Konfiguration oder Hack. Programm sofort abbrechen. 
     17if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} // Mandant, muss! 
     18 
     19if(isset($epsg)) { // SRS, kann. Wenn als Parameter ... 
     20        if (preg_match('#^EPSG:[0-9]{4,5}$#', $epsg)) { // Prefix aus MB-Mapframe 
     21                $epsg = str_replace("EPSG:", "" , $epsg); 
     22        } elseif (!preg_match('#^[0-9]{4,5}$#', $epsg)) { // nur die Nummer 
     23                die("Eingabefehler epsg"); 
     24        } 
     25} else { // Nichts ÃŒbergeben 
     26        $epsg=$gui_epsg; // dann default aus Conf 
     27} 
     28 
     29// Filter-Parameter fÃŒr Gemeindenummer in Kreis-Datenbank aus der Mapbender GUI-Konfiguration 
     30if (isset($gemeinde) AND trim($gemeinde, '0') != "") { 
     31        if (!preg_match('#^[0-9]{1,3}$#', $gemeinde)) {die("Eingabefehler Gemeinde");} 
     32        $gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); 
     33        if(strpos($gemeinde, ",") === false) { 
     34                $gfilter = 1; // Einzelwert 
     35        } else { 
     36                $gfilter = 2; // Liste 
     37        } 
     38} else { // Kein Filter 
     39        $gemeinde = ""; 
     40        $gfilter = 0; 
     41} 
     42if (isset($blattgml) and $blattgml != "" ) { 
     43        if (!preg_match('#^[0-9a-zA-Z]{16}$#', $blattgml)) {die("Eingabefehler GML-ID Blatt");} 
     44} else { 
     45        $blattgml=""; 
     46} 
     47if (isset($person) and $person != "" ) { 
     48        if (!preg_match('#^[0-9a-zA-Z]{16}$#', $person)) {die("Eingabefehler GML-ID Person");} 
     49} else { 
     50        $person=""; 
     51} 
     52if (isset($gbkennz) and $gbkennz != "" ) { // gggg-bbbbbbA-0001 
     53        if (!preg_match('#^[0-9A-E -]{4,17}$#', $gbkennz)) {die("Eingabefehler Grundbuch-Kennzeichen");} 
     54} else { 
     55        $gbkennz=""; 
     56} 
     57 
    1958include("../../conf/alkisnav_conf.php"); // Konfigurations-Einstellungen 
    2059include("alkisnav_fkt.php"); // Funktionen 
     
    5392function familiensuche() { 
    5493        // Einen Link generieren, um nach anderen Personen mit gleichem Familiennamen (Nachnamen) zu suchen. 
    55         // Bei versehendlich falschem Vornamen muss nicht von vorn begonnen werden. 
     94        // Bei versehendlich falschem Vornamen muss somit nicht von vorn begonnen werden. 
     95 
    5696        global $gkz, $gemeinde, $epsg, $name; 
    57         if(isset($name)) { // Familiensuche 
    58                 echo "\n<div class='back' title='Andere Personen mit diesem Nachnamen'>"; 
    59                         echo "\n\t\t<img class='nwlink' src='ico/Eigentuemer_2.png' width='16' height='16' alt='FAM' title='Andere Personen mit diesem Nachnamen'> "; 
    60                         echo "\n<a class='back' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;name=".$name."'>\"".$name."\"</a>"; 
    61                 echo "\n</div>\n<br>";   
     97        $lnknam=urlencode(substr($name,0,50)); 
     98        $dspnam=htmlentities($name, ENT_QUOTES, "UTF-8"); 
     99        if(isset($name)) { 
     100                echo "\n<div class='back' title='Andere Personen mit diesem Nachnamen'>" 
     101                        ."\n\t\t<img class='nwlink' src='ico/Eigentuemer_2.png' width='16' height='16' alt='FAM' title='Andere Personen mit diesem Nachnamen'> " 
     102                        ."\n<a class='back' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;name=".$lnknam."'>\"".$dspnam."\"</a>" 
     103                ."\n</div>\n<br>";       
    62104        } 
    63105        return; 
     
    68110        global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $auskpath; // $debug 
    69111 
    70         $sql ="SELECT p.nachnameoderfirma, p.vorname, p.geburtsdatum, p.namensbestandteil,  
    71         a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer  
    72         FROM ax_person p LEFT JOIN ax_anschrift a ON a.gml_id=ANY(p.hat)  
    73         WHERE p.gml_id= $1 AND p.endet IS NULL AND a.endet IS NULL LIMIT 1;";    
     112        $sql ="SELECT p.nachnameoderfirma, p.vorname, p.geburtsdatum, p.namensbestandteil, " 
     113        ."a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer " 
     114        ."FROM ax_person p LEFT JOIN ax_anschrift a ON a.gml_id=ANY(p.hat) " 
     115        ."WHERE p.gml_id= $1 AND p.endet IS NULL AND a.endet IS NULL LIMIT 1;";  
    74116        // Es wird nur EINE Zeile ausgewertet 
    75117 
     
    160202 
    161203        if($match1 != '%'){ 
    162                 $sql.="nachnameoderfirma ILIKE $1 AND p.vorname ILIKE $2 ";              
    163                 $sql.="ORDER BY p.nachnameoderfirma, p.vorname LIMIT $3 ;"; 
     204                $sql.="nachnameoderfirma ILIKE $1 AND p.vorname ILIKE $2 " 
     205                ."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $3 ;"; 
    164206                $v=array($match, $match1, $linelimit); 
    165207        }else{ 
    166                 $sql.="nachnameoderfirma ILIKE $1 ";             
    167                 $sql.="ORDER BY p.nachnameoderfirma, p.vorname LIMIT $2 ;"; 
     208                $sql.="nachnameoderfirma ILIKE $1 " 
     209                ."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $2 ;"; 
    168210                $v=array($match, $linelimit); 
    169211        }  
     
    189231        } elseif($cnt == 1){ // Eindeutig! 
    190232                $person = $persongml; 
     233                $name = $nachname; // familiensuche() verwendet sonst den Suchbegriff 
    191234        } else { 
    192235                echo "\n<p class='anz'>".$cnt." Eigent&uuml;mer mit '".$name."'</p>";   // im Limit 
     
    213256        // Body 
    214257        // Suche nach GrundbÃŒchern der Person 
    215         $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam  
    216         FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id  
    217         JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk  
    218         WHERE n.bennennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL;"; 
     258        $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam " 
     259        ."FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id " 
     260        ."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk " 
     261        ."WHERE n.bennennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL;"; 
    219262 
    220263        // Parameter $gbkennz, z.B. nach Klick auf Zeile "Bezirk" 
     
    275318                $nxtbltblatt=urlencode($blatt); 
    276319                $nxtbltseite=$bltseite + 1; 
    277                 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."' "; 
    278                 echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt."'>weitere</a>"; 
    279                 echo "</p>"; 
     320                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."' " 
     321                ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt."'>weitere</a>" 
     322                ."</p>"; 
    280323        } elseif($cnt == 1) { // Eindeutig! 
    281324                $blattgml=$gml; // dann Stufe 3 gleich nachschieben 
     
    305348 
    306349                // Grundbuch-Daten ermitteln 
    307                 $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "; 
    308                 $sql.="FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "; 
    309                 $sql.="WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;"; 
     350                $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam " 
     351                ."FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk " 
     352                ."WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;"; 
    310353                $v=array($blattgml); 
    311354                $res=pg_prepare("", $sql); 
     
    353396 
    354397        // Baustein 1: SQL-Anfang fuer beide Varianten 
    355         $sql1 ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam,  
    356         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, "; 
     398        $sql1 ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam, " 
     399        ."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, "; 
    357400        if($epsg == "25832") { // Transform nicht notwendig 
    358                 $sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, "; 
    359                 $sql1.="st_y(st_centroid(f.wkb_geometry)) AS y "; 
     401                $sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, st_y(st_centroid(f.wkb_geometry)) AS y "; 
    360402        } else {   
    361                 $sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, "; 
    362                 $sql1.="st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y ";                       
     403                $sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, " 
     404                        ."st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y ";                     
    363405        } 
    364406 
    365407        // NamenNummer >istbestandteilvon> buchungsblatt <istbestandteilvon< buchungsstelle-1 
    366         $sql1.="FROM ax_namensnummer nn  
    367         JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon  
    368         JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk 
    369         JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon "; 
     408        $sql1.="FROM ax_namensnummer nn " 
     409        ."JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon " 
     410        ."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk " 
     411        ."JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon "; 
    370412 
    371413        // Baustein A: Auswahl 1 oder 2 
     
    374416 
    375417        // buchungsStelle1 (herr.) >an> buchungsStelle2 (dien.) <istGebucht< FS 
    376         $sqla2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) "; 
    377         $sqla2.="JOIN ax_flurstueck f ON s2.gml_id=f.istgebucht "; 
     418        $sqla2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) " 
     419                ."JOIN ax_flurstueck f ON s2.gml_id=f.istgebucht "; 
    378420 
    379421        // Baustein 2: SQL-Ende fuer beide Varianten 
    380         $sql2 ="JOIN gema_shl ot ON f.land || f.gemarkungsnummer = ot.gemashl  "; // Ortsteil 
    381         $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 "; 
     422        $sql2 ="JOIN gema_shl ot ON f.land || f.gemarkungsnummer = ot.gemashl " // Ortsteil 
     423                ."WHERE nn.benennt = $1 AND nn.endet IS NULL AND gb.endet IS NULL AND s1.endet IS NULL AND f.endet IS NULL "; 
    382424        $sqlw2="AND s2.endet IS NULL "; 
    383425 
     
    407449                $bltwhere =""; 
    408450        } else { // BlÀttern, Fortsetzen bei ... 
    409                 $bltwhere ="AND ((b.bezeichnung > '".$bltbez."') "; 
    410                 $bltwhere.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."') "; 
    411                 $bltwhere.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung = '".$bltblatt."' AND cast(s1.laufendenummer AS integer) >= ".$bltbvnr." )) "; 
     451                $bltwhere ="AND ((b.bezeichnung > '".$bltbez."') " 
     452                        ."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."') " 
     453                        ."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung = '".$bltblatt."' AND cast(s1.laufendenummer AS integer) >= ".$bltbvnr." )) "; 
    412454        } // FlurstÃŒcke in der angeblÀtterten BVNR werden ggf. wiederholt 
    413455 
     
    489531                        $nxtbltblatt=urlencode($blatt); 
    490532                        $nxtbltseite=$bltseite + 1; 
    491                         echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person; 
    492                         echo "&amp;gbkennz=".$zgbbez; // Filter Bezirk 
    493                         echo "&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=ohne' "; 
    494                         echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"; 
    495                         echo "</p>"; 
     533                        echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person 
     534                        ."&amp;gbkennz=".$zgbbez // Filter Bezirk 
     535                        ."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=ohne' " 
     536                        ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>" 
     537                        ."</p>"; 
    496538                } elseif($zfs1 > 1) { // Meldung (Plural) ab 2, im Limit 
    497539                        echo "\n<p class='anz'>"; 
     
    567609                        $nxtbltblatt=urlencode($blatt); 
    568610                        $nxtbltseite=$bltseite + 1; 
    569                         echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person; 
    570                         echo "&amp;gbkennz=".$zgbbez; // Filter Bezirk 
    571                         echo "&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=nur' "; 
    572                         echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"; 
    573                         echo "</p>"; 
     611                        echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person 
     612                        ."&amp;gbkennz=".$zgbbez // Filter Bezirk 
     613                        ."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=nur' " 
     614                        ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>" 
     615                        ."</p>"; 
    574616                } elseif($zfs2 > 1) { // ab 2 
    575617                        echo "\n<p class='anz'>"; 
     
    589631// 3. gb     = gml_id des Grundbuches -> Suche nach FlurstÃŒcken 
    590632 
    591 if(isset($epsg)) { 
    592         $epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);    
     633// Validation: Eingabefeld aus Formular. Wird aber auch an Link angehÀngt (LÀnge!) 
     634// Suchbegriff (EigentÃŒmer) 
     635// Hier formatierte Meldung und html-Foot. 
     636if (isset($name) and $name != "" ) {  
     637        if (!preg_match('#^[a-zA-Z0-9ÀöÌÄÖÜß*,. \-&/]{1,50}$#', $name)) { 
     638                echo "<p class='err'>Eingabe unzul&auml;ssig!</p>"; 
     639        //      if ($debug > 1) {echo "<p class='err'>Name='".$name."' LÀnge='".strlen($name)."</p>";} 
     640                $name=""; 
     641        } 
    593642} else { 
    594         $epsg=$gui_epsg; // aus Conf 
    595 } 
    596 if ($gemeinde == "") { 
    597         $gfilter = 0; // Gemeinde ungefiltert 
    598 } elseif(strpos($gemeinde, ",") === false) { 
    599         $gfilter = 1; // Gemeinde Einzelwert 
    600 } else { 
    601         $gfilter = 2; // Gemeinde Filter-Liste 
    602 } 
    603  
    604 $kennztyp=ZerlegungGBKennz($gbkennz); // Grundbuch-Kennzeichen aus Parameter zerlegen: $z__  
     643        $name=""; 
     644} 
     645 
     646$kennztyp=ZerlegungGBKennz($gbkennz); // Grundbuch-Kennzeichen aus Parameter zerlegen 
    605647// 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR 
    606648 
     
    633675                if ($kennztyp > 1) { 
    634676                        $trans="Grdb. und Flst. von .. in .."; // Filter GB-Bez, 
    635                         // darunter sind dann Name und Bezirk farblich markiert 
    636677                } else { 
    637                         $trans="Grundb. und Flurst. von .."; // der EigentÃŒmer steht darunter 
     678                        $trans="Grundb. und Flurst. von .."; // Name steht darunter 
    638679                } 
    639680                getGBuFSbyPerson(); // Schritte 2+3 gleichzeitig, dabei Gemeinde-Filter auf Stufe 3 
     
    645686        getEigByName(); // Suchen nach Namensanfang 
    646687 
    647         if($person != "") { // genau EIN Treffer zum Namen 
     688        if($person != "") { // genau EIN Treffer zum gesuchten Namen 
    648689                if ($gfilter == 0) { 
    649690                        $trans="Grundb&uuml;cher zum Namen"; 
Note: See TracChangeset for help on using the changeset viewer.