sebastian1992: XML per .htaccess sperren

Servus,

vorneweg, hat SELFHTML nen neuen Anstrich (oder eher abstrich) bekommen, sieht auf einmal bei mir so weiß aus.

Zum Thema, ich möchte in nem kleinen Projekt mal mit XML arbeiten, nur habe ich jetzt das Problem, dass ich nicht möchte, dass jeder die XML Dateien so aufrufen kann, sondenr nur meine Scripte.

Keine Sorge, ich habe nicht vor, irgendwelche Passwörter darin zu speichern, einfahc nur weil ich es so nicht gerade prikelnd finde, wenn jeder sich meine Informationsquellen ansehen kann.

Ich hatte jetzt die Idee, über eine Kleine Klausel in der .htaccess Datei einen Aufruf einer XML Datei immer weiterzuleiten, also zum Beispiel wenn ein .xml in der Adresse vorkommt immer zu error weiterleiten.

Bin mir sehr sicher, das es geht, aber bin im Apache Bereich ein Noob und fühle mich auch nicht im Stande, das alles zu verstehen.

Bitte also um Hilfe ;-)

Gruß Sebastian

ps: wo wir direkt bei Apache sind, noch ne Frage am Rande, weiß einer, wie ich immer auf http://www. umleiten kann, aber nur, wenn keine Subdomain eingegeben wurde, weil immer http://www. ist ja SEO technisch besser, aber bei ner Subdomain geht das nicht.

  1. vorneweg, hat SELFHTML nen neuen Anstrich (oder eher abstrich) bekommen, sieht auf einmal bei mir so weiß aus.

    Zum Thema, ich möchte in nem kleinen Projekt mal mit XML arbeiten, nur habe ich jetzt das Problem, dass ich nicht möchte, dass jeder die XML Dateien so aufrufen kann, sondenr nur meine Scripte.

    Lege Dateien, die nicht via http erreichbar sein sollen, ausserhalb von docroot an.

    Alternativ:
    lege sie in ein Verzeichnis /xml und schütze das verzeichnis mit:

    htaccess:

    <FilesMatch ".xml$">
    Order allow,deny
    deny from all
    </FilesMatch>

    Keine Sorge, ich habe nicht vor, irgendwelche Passwörter darin zu speichern, einfahc nur weil ich es so nicht gerade prikelnd finde, wenn jeder sich meine Informationsquellen ansehen kann.

    Du kannst Passwörter und andere Daten sinnvoll in xml Deteien speichern.
    Allerdings speichert man nicht die Passworte selbst, sondern die mit sha1 oder md5 erzeugten Checksummen.

    Ich hatte jetzt die Idee, über eine Kleine Klausel in der .htaccess Datei einen Aufruf einer XML Datei immer weiterzuleiten, also zum Beispiel wenn ein .xml in der Adresse vorkommt immer zu error weiterleiten.

    deny gibt die richtige Antwort in dem Fall: 403 Access denied.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>       ><o(((°>
       <°)))o><                      ><o(((°>o
    1. htaccess:

      <FilesMatch ".xml$">
      Order allow,deny
      deny from all
      </FilesMatch>

      optimal, das war das, was ich gesucht hab.

      Dankeschön ;-)

      1. echo $begrüßung;

        htaccess: [...]
        optimal, das war das, was ich gesucht hab.

        Nein, das Optimum wäre eine Ablage außerhalb des DocumentRoots. Das ist nur ein Kompromiss wegen KeineLustDasRichtigZuMachen oder Gegebenheiten beim nicht optimalen Provider.

        echo "$verabschiedung $name";

        1. Nein, das Optimum wäre eine Ablage außerhalb des DocumentRoots. Das ist nur ein Kompromiss wegen KeineLustDasRichtigZuMachen oder Gegebenheiten beim nicht optimalen Provider.

          Ich verstehe jetzt nicht ganz, was an einer Lagerung außerhalb des Document roots besser wäre, bzw. die Vorteile.

          Denke scchon, das das auch möglich sein sollte.

          der Root wäre bei mir public-html, darunter ist noch ein verzeichnis, denke, das du das meinst.

          das muss ich doch dann irgendwie über den direkten Pfad machen, stimts?? Aber wie genau der aussieht ist ja glaube ich von Provider zu Provider anderst.

          1. echo $begrüßung;

            Ich verstehe jetzt nicht ganz, was an einer Lagerung außerhalb des Document roots besser wäre, bzw. die Vorteile.

            Du brauchst kein Extra-Verbot auszusprechen, diese Dateien auszuliefern. Es kann dir dann auch nicht aus Versehen passieren, dass du das Verbot löschst. Du hast damit eine Fehlerquelle weniger. Es bleiben nur noch die Fehler in deinem Auslieferungsscript übrig.

            Denke scchon, das das auch möglich sein sollte.
            der Root wäre bei mir public-html, darunter ist noch ein verzeichnis, denke, das du das meinst.

            Ja. Beispiel:
            /pfad/zum/kundenverzeichnis/
            /pfad/zum/kundenverzeichnis/document_root_domain_a/
            /pfad/zum/kundenverzeichnis/document_root_domain_b/
            /pfad/zum/kundenverzeichnis/platz_für_nicht_öffentliches/

            Wobei auch einzelne Dateien im Kundenverzeichnis direkt abgelegt werden können.

            das muss ich doch dann irgendwie über den direkten Pfad machen, stimts??

            Relativ vom aktuellen Arbeitsverzeichnis aus kann man es auch notieren. Wenn man es nicht geändert hat ist das das Verzeichnis in dem die aufgerufene PHP-Datei liegt.

            Für Dateien mit PHP-Code, Funktionsbibliotheken beispielsweise, kann man den include_path anpassen.

            Aber wie genau der aussieht ist ja glaube ich von Provider zu Provider anderst.

            Gestalte es konfigurabel, so dass es jeder selbst einstellen kann. Du kannst ja eine DAU- und DAP[1]-sichere Default-Konfiguration mit Zugriffsverbot vorsehen und in der readme schreiben, wie man es besser aufsetzen kann.

            [1] P wie Provider

            echo "$verabschiedung $name";

            1. So, habe jetzt meinen DocRoot.

              Aber wie genau sieht jetzt der Pfad dazu aus, bzw. wie rufe ich den jetzt auf??

              Über ne absolute URL??

              ich verstehe nur Bahnhof. Kann man die URL zum Docroot nicht über Server Variablen zusammensetzten, sodas du mir das dann nur gibst und ich es mir selbst ausgeben lasse dann?

              Gruß Sebastian

              1. echo $begrüßung;

                So, habe jetzt meinen DocRoot. Aber wie genau sieht jetzt der Pfad dazu aus, bzw. wie rufe ich den jetzt auf?? Über ne absolute URL??

                URLs sind hier uninteressant, du bewegst dich doch grad im Dateisystem des Servers. Und außerdem wollen wir ja gerade, dass man _nicht_ über eine URL auf die fraglichen Dateien zugreifen kann.

                Kann man die URL zum Docroot nicht über Server Variablen zusammensetzten, sodas du mir das dann nur gibst und ich es mir selbst ausgeben lasse dann?

                Das DocumentRoot ist über $_SERVER['DOCUMENT_ROOT'] erreichbar, so der Server so freundlich ist, es PHP mitzuteilen. Der Apache ist es im Allgemeinen, der IIS jedoch nicht. Erforlderlich ist das DocumentRoot nicht unbedingt, man kann auch relativ verlinken.

                Ausgehend von:

                /pfad/zum/kundenverzeichnis/
                /pfad/zum/kundenverzeichnis/document_root_domain_a/
                /pfad/zum/kundenverzeichnis/document_root_domain_a/script_a.php
                /pfad/zum/kundenverzeichnis/document_root_domain_a/verzeichnis/script_b.php
                /pfad/zum/kundenverzeichnis/platz_für_nicht_öffentliches/
                /pfad/zum/kundenverzeichnis/platz_für_nicht_öffentliches/datei_1.php
                /pfad/zum/kundenverzeichnis/datei_2.php

                kann man innerhalb von script_a.php notieren:

                ../platz_für_nicht_öffentliches/datei_1.php
                ../datei_2.php

                Von script_b.php aus muss noch ein ../ vorangestellt werden, da man ja noch ein Verzeichnis weiter nach oben klettern muss.

                Wenn allerdings script_a.php das verzeichnis/script_b.php inkludiert, befindet man sich weiterhin im Verzeichnis von script_a.php, darf also auch im Code von script_b.php nur gemäß _a verweisen. Unschön wird es, wenn noch weitere Verzeichnislevel eine Rolle beim Starten von Scripts spielen und alle script_b.php inkludieren wollen. Dann empfiehlt es sich, absolute Pfadangaben zu verwenden.

                echo "$verabschiedung $name";

                1. nehmen wir mal an, der Doc Root wäre /, ich will diesen Pfad dahin mal weglassen. Der Ordner für den Domain-Inhalt ist eigentlich public-html.

                  In / habe ich jetzt noch einen Ordner xml erstellt und dort die Datei global.xml. In public-html ist nun die Datei xml.php. Rufe ich die auf, gibt file_exists() false zurück.

                  Die Strucktur sieht dann so aus:

                  /
                  /public-html/
                  /public-html/xml.php
                  /xml/
                  /xml/gloabl.xml

                  Der Inhalt der PHP Datei ist:

                  <?php  
                  $file = "../xml/global.xml";  
                    
                  if (file_exists($file)) {  
                      $xml = simplexml_load_file($file);  
                    
                      echo $xml->domain;  
                  } else {  
                      exit('Failed to open '.$file);  
                  }  
                  ?>
                  

                  Gruß Sebastian

                  1. echo $begrüßung;

                    nehmen wir mal an, der Doc Root wäre /, ich will diesen Pfad dahin mal weglassen. Der Ordner für den Domain-Inhalt ist eigentlich public-html.

                    Falsche Voraussetzung. Das DocumentRoot ist immer das Verzeichnis, das bei einer URL http://example.com/ (also ohne was dahinter) erreicht wird (wenn man von einer 1:1-Umsetzung von URL auf Dateien ausgeht). In deinem Fall wäre das DocumentRoot deiner Domain also das Verzeichnis .../public-html/ Das $_SERVER['DOCUMENT_ROOT'] zeigt genau darauf. Es zeigt aber im Allgemeinen nichts auf dein Kundenverzeichnis .../, in dem sich dein(e) DocumentRoot(s) befinden. Das DocRoot nützt dir also nicht viel weiter, wenn du auf Verzeichnisse außerhalb dessen verweisen möchtest.

                    In / habe ich jetzt noch einen Ordner xml erstellt und dort die Datei global.xml. In public-html ist nun die Datei xml.php.

                    Die Strucktur sieht dann so aus:

                    /
                    /public-html/
                    /public-html/xml.php
                    /xml/
                    /xml/gloabl.xml

                    Der Inhalt der PHP Datei ist:

                    $file = "../xml/global.xml";

                    So sieht das schon recht gut aus. Wenn du noch ein

                    define('XML_DIR', '../xml/');

                    notierst und

                    $file = XML_DIR . "global.xml";

                    dann wäre das noch besser.

                    Rufe ich die auf, gibt file_exists() false zurück.

                    Das ist allerdings schlecht. Keine Tippfehler? Der PHP-Prozess ist auch berechtigt, die Datei zu lesen? Gibt es weitere Meldungen seitens PHP mit einem auf E_ALL gestellten error_reporting (und display_errors = on)?

                    echo "$verabschiedung $name";

                    1. Also meine PHP Datei sieht jetzt so aus:

                        
                      <?php  
                      error_reporting(E_ALL);  
                      ini_set("display_errors", TRUE);  
                        
                      define('XML_DIR', '../xml/');  
                      $file = XML_DIR . "global.xml";  
                        
                      if (file_exists($file)) {  
                          $xml = simplexml_load_file($file);  
                        
                          echo $xml->domain;  
                      }  
                      else  
                      {  
                          exit('Failed to open '.$file);  
                      }  
                      ?>  
                      
                      

                      Ausgabe: Failed to open ../xml/global.xml

                      Also keine weiteren Ausgaben.

                      der Pfad ist wirklich ../xml/global.xml

                      Gruß Sebastian

                      1. echo $begrüßung;

                        Ausgabe: Failed to open ../xml/global.xml
                        Also keine weiteren Ausgaben.
                        der Pfad ist wirklich ../xml/global.xml

                        Hat man dir das open_basedir voreingestellt? Nee, dann käme eine Meldung, dass eine open_basedir-Verletzung vorliegt.
                        Tut mir leid, die Ursache kann ich von fern nicht sehen. Leg mal zur Abwechslung die global.xml in das gleiche Verzeichnis wie xml.php (XML_DIR auf '' setzen).

                        echo "$verabschiedung $name";

                        1. Leg mal zur Abwechslung die global.xml in das gleiche Verzeichnis wie xml.php (XML_DIR auf '' setzen).

                          Das geht

                          1. Leg mal zur Abwechslung die global.xml in das gleiche Verzeichnis wie xml.php (XML_DIR auf '' setzen).

                            Das geht

                            Hast du dir richtigen Dateirechte gesetzt?
                            Das Direktory, /xml muss für das script Lese und Ausführrechte erhalten.
                            Das bedeutet 705 oder 750 je nach dem...

                            mfg Beat

                            --
                            Woran ich arbeite:
                            X-Torah
                               <°)))o><                      ><o(((°>o
                            1. Hast du dir richtigen Dateirechte gesetzt?
                              Das Direktory, /xml muss für das script Lese und Ausführrechte erhalten.
                              Das bedeutet 705 oder 750 je nach dem...

                              sowohl mit 705 als auch 750 nicht.

          2. Hi,

            das muss ich doch dann irgendwie über den direkten Pfad machen, stimts?? Aber wie genau der aussieht ist ja glaube ich von Provider zu Provider anderst.

            aber z.B. eine php-Datei mit phpinfo() sagt Dir wie der Pfad zu DOCUMENT_ROOT lautet...

            Gruesse, Joachim

            --
            Am Ende wird alles gut.
  2. echo $begrüßung;

    Zum Thema, ich möchte in nem kleinen Projekt mal mit XML arbeiten, nur habe ich jetzt das Problem, dass ich nicht möchte, dass jeder die XML Dateien so aufrufen kann, sondenr nur meine Scripte.

    Dann leg doch deine XML-Dateien außerhalb des DocumentRoot ab. Scripte haben über das Dateisystem Zugriff darauf und der Webserver liefert sie nichts aus, was nicht im DocumentRoot liegt. Das bleibt auch so, wenn man versehentlich die Zugriffsbeschränkungskonfiguration für Dokumente innerhalb des DocumentRoot deaktiviert.

    Ich hatte jetzt die Idee, über eine Kleine Klausel in der .htaccess Datei einen Aufruf einer XML Datei immer weiterzuleiten, also zum Beispiel wenn ein .xml in der Adresse vorkommt immer zu error weiterleiten.

    Falls du doch die XML-Dateien innerhalb des DocumentRoot ablegen willst, dann sollte ein Zugriffsverbot mittels der Konfigurationsdirektiven <Files>, Order, Allow und Deny reichen.

    ps: wo wir direkt bei Apache sind, noch ne Frage am Rande, weiß einer, wie ich immer auf http://www. umleiten kann, aber nur, wenn keine Subdomain eingegeben wurde, weil immer http://www. ist ja SEO technisch besser, aber bei ner Subdomain geht das nicht.

    Die Kunden der Suchmaschinen sind Menschen. Optimiere für Menschen, nicht für die Suchmaschinen. Wenn du dich der Suchmaschine anbiederst statt deren Kunden glücklich zu machen, sehen die das nicht gerne.

    Um deine Frage zu beantworten: Im URL Rewriting Guide gibt es einen Abschnitt Canonical Hostnames (zweiter von oben, hat keinen direkten Anker).

    echo "$verabschiedung $name";