Otto Wyss: Mediawiki LocalSettings.php: Auslagern von DB-Namen, User, -Pass

Ich habe versucht ein Wiki einzurichten, möchte jedoch der DB-Namen, User, -Passwort, etc aus dem LocalSettings.php entfernen. Jetzt habe irgendwo gelesen, dass man die via include in eine Datei ausserhalb des HTML-Bereichs auslagern kann. Was immer ich jedoch mache, die Wiki-Seite wird leer angezeigt und das trotzt vorangestelltem "error_reporting (E_ALL)". Gibt es irgendwo eine Anleitung, wie man das genau macht?

  1. Hi!

    Ich habe versucht ein Wiki einzurichten, möchte jedoch der DB-Namen, User, -Passwort, etc aus dem LocalSettings.php entfernen. Jetzt habe irgendwo gelesen, dass man die via include in eine Datei ausserhalb des HTML-Bereichs auslagern kann. Was immer ich jedoch mache, die Wiki-Seite wird leer angezeigt und das trotzt vorangestelltem "error_reporting (E_ALL)".

    Wenn es einen Syntaxfehler gibt, kommt PHP gar nicht dazu, die Anweisung error_reporting(E_ALL) auszuführen. Wenn dann noch in der globalen php.ini display_error und/oder display_startup_errors ausgeschaltet sowie das error_reporting fehlermeldungsunterdückend konfiguriert ist, siehst du nichts. Prüfen kannst du das mit einer phpinfo()-Ausgabe.

    Gibt es irgendwo eine Anleitung, wie man das genau macht?

    Anleitungen, wie man PHP-Syntax schreibt und include verwendet, gibt es im Handbuch. Wenn du genauere Auskunft haben möchtest, was die Ursachen bei dir sein könnten, musst du mal einige/einen deiner Versuche zeigen, inklusive der Angabe, wie die beteiligten Verzeichnisse im Dateisystem angeordnet sind.

    Lo!

    1. Wenn es einen Syntaxfehler gibt, kommt PHP gar nicht dazu, die Anweisung error_reporting(E_ALL) auszuführen. Wenn dann noch in der globalen php.ini display_error und/oder display_startup_errors ausgeschaltet sowie das error_reporting fehlermeldungsunterdückend konfiguriert ist, siehst du nichts. Prüfen kannst du das mit einer phpinfo()-Ausgabe.

      display_error = off
      display_startup_errors = off
      error_reporting = 6143

      Das sollte doch richtig so sein, oder?

      1. Moin!

        error_reporting = 6143

        Das sollte doch richtig so sein, oder?

        Wenn uns statt der Zahl eine Konstante wie E_ALL anbieten würdest, dann hätten wir (Pardon: ich) Lust das zu beurteilen. So müssten wir das Handbuch quälen und dann nachrechnen was Deine Zahl denn repäsentiert. $errorMsg="Fatal: Keine Lust in __FILE__ : __LINE__."

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

      2. Hi!

        display_error = off
        display_startup_errors = off
        error_reporting = 6143
        Das sollte doch richtig so sein, oder?

        Ja, wenn du nichts sehen willst. Möchtest du stattdessen Fehlermeldungen sehen, dann stell die beiden displays auf on. Das error_reporting entspricht E_ALL (für PHP 5.2) und ist in Ordnung.

        Lo!

  2. Moin!

    Gibt es irgendwo eine Anleitung, wie man das genau macht?

    Aber ja doch.

    Bisher sag Deine LocalSettings.php in etwa so aus:
    ------------------------------------------------------------------

    <?php  
    /*  
        other settings  
    */  
      
    $config['foo']               = 1;  
      
    /*  
       Settings 4 database & connection  
    */  
    $config['db_typ']           =''; # e.g. mysql, postgres, mssql, oracle)  
    $config['db_server']        =''; # hostname (e.g. localhost, ip)  
    $config['db_server_port']   =''; # Mysql: 3306  
    $config['db_user']          ='';  
    $config['db_pass']          ='';  
    $config['db_database']      ='';  
    $config['tbl_preset']       ='';  # none or string e.g. wiki_1_  
      
    /*  
        other settings  
    */  
      
    $config['bar']              ='';
    

    ?>
    ------------------------------------------------------------------

    Du willst LocalSettings.php:

    ------------------------------------------------------------------

    <?php  
    /*  
        other settings  
    */  
      
    $config['foo']         = 1;  
      
    /*  
       Settings 4 database & connection  
    */  
      
    $file='../../datadir/dbsettings.php';  
    if (! is_file($file))     {  
         die ("Fatal in __FILE__ : __LINE__ : Die Datei $file gibt es nicht!" );  
    }  
    if (! is_readable($file)) {  
         die ("Fatal in __FILE__ : __LINE__ : Die Datei $file ist nicht lesbar!" );  
    }  
    require_once ; # stirbt und meckert sehr laut (siehe unten) , wenn es nicht klappt  
      
    /*  
        other settings  
    */
    

    ------------------------------------------------------------------

    und in ../../datadir/dbsettings.php:

    ------------------------------------------------------------------

    <?php  
    $config['db_typ']           =''; # e.g. mysql, postgres, mssql, oracle  
    $config['db_server']        =''; # hostname (e.g. localhost, ip)  
    $config['db_server_port']   =''; # mysql: 3306  
    $config['db_user']          ='';  
    $config['db_pass']          ='';  
    $config['db_database']      ='';  
    $config['tbl_preset']       ='';  # nothing or string e.g. wiki_1_
    

    ------------------------------------------------------------------

    Wenn die Pfade und Rechte  (lesen!) stimmen, dann sollte das gehen.

    Andere Frage:

    Warum trägst Du in der .htaccess nicht ein:

    ------------------------------------------------------------------

    php_flag display_errors on  
    php_flag html_errors on  
    php_value error_reporting -1  
      
    <Files LocalSettings.php>  
    deny from all  
    </Files>
    

    ------------------------------------------------------------------

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Vielen Dank

      Bisher sag Deine LocalSettings.php in etwa so aus:

      ...

      Wenn die Pfade und Rechte  (lesen!) stimmen, dann sollte das gehen.

      Ich habe jetzt mal folgendes eingetragen:
      ------------------------------------------------------------------
      $file = $_SERVER['DOCUMENT_ROOT'] . "/../configuration/settings.php";
      if (!is_file ($file)) {die ("Die Datei $file gibt es nicht!");}
      if (!is_readable ($file)) {die ("Die Datei $file ist nicht lesbar!");}
      require_once ($file); # stirbt und meckert sehr laut (siehe unten)
      ------------------------------------------------------------------

      Die Datei ist vorhanden (1.Test okay)
      Die Datei ist lesbar (2.Test okay)
      Trotzdem kommt nur eine leere Seite. Kommentiere ich das require_once aus, so mekert es wgen den fehlenden DB-Angaben.

      Warum trägst Du in der .htaccess nicht ein:


      php_flag display_errors on

      php_flag html_errors on
      php_value error_reporting -1

      <Files LocalSettings.php>
      deny from all
      </Files>

      
      > ------------------------------------------------------------------  
      >   
      
      Weil ich dann nur schon bei "php\_flag display\_errors on" einen 500 Internal Server Error erhalte. Ich verwende PHP 5.2.9 und habe keine Ahnung wieso dieser Fehler kommt.
      
      1. Moin!

        Weil ich dann nur schon bei "php_flag display_errors on" einen 500 Internal Server Error erhalte. Ich verwende PHP 5.2.9 und habe keine Ahnung wieso dieser Fehler kommt.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        Dann kümmerr Dich darum, was Du in der .htaccess darfst. Was steht in der Konfiguration

        • des Apache Webservers überhaupt
        • des virtuellen Servers

        hinsichtlich AllowOverride?

        fastix

      2. Hi!

        Warum trägst Du in der .htaccess nicht ein:
        php_flag html_errors on
        php_value error_reporting -1
        Weil ich dann nur schon bei "php_flag display_errors on" einen 500 Internal Server Error erhalte. Ich verwende PHP 5.2.9 und habe keine Ahnung wieso dieser Fehler kommt.

        Diese Anweisungen sind nur dann im Apachen und seinen Konfigurationsdateien möglich, wenn PHP als Modul eingebunden ist. Bei Providern ist hingegen oftmals CGI-Einbindung anzutreffen. Eine genauere Auskunft zu dem 500er gibt übrigens das error_log des Apachen.

        <Files LocalSettings.php>
        deny from all
        </Files>[/code]

        Das ist überflüssig. Mediawiki schützt Dateien, die nicht direkt aufgerufen werden dürfen (von denen es noch mehr als nur die LocalSettings.php gibt), mit etwas Code am Anfang gegen weiteres Ausführen.

        Lo!

        1. Moin!

          Das ist überflüssig. Mediawiki schützt Dateien, die nicht direkt aufgerufen werden dürfen (von denen es noch mehr als nur die LocalSettings.php gibt), mit etwas Code am Anfang gegen weiteres Ausführen.

          Doch nicht etwa mit sowas:

          if ( __FILE__ == $_SERVER['SCRIPT_NAME'] ) {
               header ("Error: 404 Forbidden");
               exit;
          }

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

          1. Hi!

            Das ist überflüssig. Mediawiki schützt Dateien, die nicht direkt aufgerufen werden dürfen (von denen es noch mehr als nur die LocalSettings.php gibt), mit etwas Code am Anfang gegen weiteres Ausführen.

            Also zumindest hilft es, wenn wegen zum Beispiel eines Konfigurationsfehlers PHP nicht ausgeführt wird und stattdessen der PHP-Code als Plaintext ausgegeben wird. Es muss jedoch immer noch die .htaccess geparst werden können.

            Doch nicht etwa mit sowas:

            if ( __FILE__ == $_SERVER['SCRIPT_NAME'] ) {
                 header ("Error: 404 Forbidden");
                 exit;
            }

            Nein, eher sowas

            if( !defined( 'MEDIAWIKI' ) )
                die( -1 );

            Allerdings war meine Erinnerung falsch, ich fand das jetzt nicht in der LocalSettings.php sondern vor allem in den Extensions. Die LocalSettings.php hat jedoch auch nicht die Aufgabe, irgendetwas auszugeben oder etwas wichtiges zu verändern. Sie initialisiert eigentlich nur Variablen. Es werden zwar auch noch Extensions inkludiert, die haben jedoch per Konvention den Selbstschutz eingebaut. Die erste Extension führt also üblicherweise schon zum Abbruch. Es ist somit lediglich der Plaintext-Fehlerfall zu beachten, wenn man Grund zur Annahme hat, dass man sich weswegen auch immer sein PHP konfigurationsmäßig aus dem Apache ausschließt.

            Andere Dateien, die nur eine Klasse definieren, benötigen den Selbst-Schutz nicht, weil ebenfalls nichts ausgeführt wird. Zudem ist der Code ja sowieso öffentlich, braucht also auch keinen Sichtschutz, wenn PHP ausfällt.

            Lo!

        2. ... Bei Providern ist hingegen oftmals CGI-Einbindung anzutreffen.

          php_flag display_errors on
          php_flag html_errors on
          php_value error_reporting -1

          Ist bei mir tatsächlich CGI-Einbindung und der Provider dürfte das ziemlich sicher nicht so einfach ändern. Gibt es entsprechende Befehle dafür in .htaccess oder muss ich dafür ein php.ini bemühen?

          1. Hi!

            Ist bei mir tatsächlich CGI-Einbindung und der Provider dürfte das ziemlich sicher nicht so einfach ändern.

            Mit Sicherheit nicht, denn das ist eben auch ein Sicherheitsthema, alle Kundenscripte unter einer einzigen Apache-Kennung ausführen zu lassen oder mit einem Wrapper die Scripte mit der kundenindividuellen Kennung abzuarbeiten.

            Gibt es entsprechende Befehle dafür in .htaccess oder muss ich dafür ein php.ini bemühen?

            Ein Apache kennt keinerlei Konfigurationenswerte von CGI-Programmen. Wenn man sie in seinen Konfigurationsdateinen notiert führt das nur zu einem Syntaxfehler. Es ist also nur möglich, die dem CGI-Programm eigenen Konfigurationswege zu gehen. Dir bleibt also nur die php.ini oder seit PHP 5.3 auch die .user.ini

            Lo!

      3. Moin!

        Trotzdem kommt nur eine leere Seite. Kommentiere ich das require_once aus, so mekert es wgen den fehlenden DB-Angaben.

        Was sagt denn ein Blick auf die header (mit wget -d [URI] oder halt Firebug?) Statuscode?

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix