Robert21: PHP Warnungen von Zend

Hi!

Ich hab eine Website in PHP geschrieben und zur Einbindung der Sprachdatei folgenden Code geschrieben:

if($_SESSION['lang'] && $_SESSION['lang']!="") $lang = $_SESSION['lang']; else $lang = 'en';  
include_once('include/lang/'.$lang.'.php');

Zend schreibt mir da aber folgende Wanrung:

Multiple annotations found at this line:  
 - include-var : Unsafe use of variable in call include()/require()  
 - Unresolved include 'include/lang/'r_variable;$lang'.php' for projects [name]

Wie kann ich das lösen?

danke
Robert

  1. Hellihello

    welchen Wert hat denn $lang an der Stelle? Wieso "Warnung von Zend?"

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
    1. $lang wird das erste mal definiert...

      Zend Studio for Eclipse zeigt dort beim debuggen eine Warnung an...

      lg
      Robert

      1. Hallo Robert,

        Zend Studio for Eclipse zeigt dort beim debuggen eine Warnung an...

        davon kann ich auch ein Lied singen.
        Nun, vieles ist sicher berechtigt und hilft auch bei der Fehlerfindung weiter.
        Ich hatte mir extra Zend Studio gekauft habe aber damit gerade wegen diesen extrem vielen Warnungen keine so gute Erfahrung gemacht.
        Ich hatte deswegen sogar ein paarmal mit dem ZEND Support gemailt, weil einfach viele Warnungen unlogisch waren. So bekommt ZEND z.b. nicht mit, wenn Variablen von anderen Seiten includiert werden.
        Zum Schluß wurde mir bestätigt das einiges nicht stimmt und sie bei der nächsten Version Änderungen vornehmen.
        Ich solle die Warnungen einfach ignorieren.

        viele Grüße
        hawk

        1. Guten Tag,

          Ich hatte deswegen sogar ein paarmal mit dem ZEND Support gemailt, weil
          einfach viele Warnungen unlogisch waren. So bekommt ZEND z.b. nicht mit,
          wenn Variablen von anderen Seiten includiert werden.

          Es wäre hilfreich, wenn du dir angewöhnst, Dinge korrekt zu benennen: Zend ist die Firma eines Unternehmens aus Israel, welches Software und Dienstleistungen rund um PHP anbietet. Das Zend Studio ist eine IDE, mit der man u.A. in PHP entwickeln kann.

          Je klarer du dich ausdrückst, umso leichter kann dir geholfen werden.

          Gruß
          Christoph Jeschke

          --
          Zend Certified Engineer
          Certified Urchin Admin
          1. Hallo,

            Je klarer du dich ausdrückst, umso leichter kann dir geholfen werden.

            ich frage mich schon manchmal warum man hier immer an jeder Schreibweise und an jedem bischen was rummäkeln muss.
            Nur zur Info:
            ich war nicht der Fragesteller, ich brauche deswegen keine Hilfe.
            Ich wollte lediglich diesen Hinweis loswerden.
            Und das ich ausversehen ZEND anstatt "ZEND Studio" geschrieben habe bitte ich tausendmal zu entschuldigen.

            viele Grüße
            hawk

            1. Hellihello

              Hallo,

              Je klarer du dich ausdrückst, umso leichter kann dir geholfen werden.

              ich frage mich schon manchmal warum man hier immer an jeder Schreibweise und an jedem bischen was rummäkeln muss.

              Es geht ja um die Präzision der Fehlerbeschreibung.

              Nur zur Info:
              ich war nicht der Fragesteller, ich brauche deswegen keine Hilfe.
              Ich wollte lediglich diesen Hinweis loswerden.
              Und das ich ausversehen ZEND anstatt "ZEND Studio" geschrieben habe bitte ich tausendmal zu entschuldigen.

              Andere lesen ja auch mit http://forum.de.selfhtml.org/archiv/2008/12/t180366/#m1191605

              Dank und Gruß,

              frankx

              --
              tryin to multitain  - Globus = Planet != Welt
  2. Mahlzeit,

    Wie kann ich das lösen?

    Vielleicht könntest du $lang auf erlaubte Inhalte prüfen. So kann dir jeder beliebigen Code unterjubeln, was bedeutet, du hast dir ein scheunentorgrosses Sicherheitsloch gebaut.

    1. $_SESSION['lang'] kann nur als 'de' oder 'en' definiert werden,
      weshalb das ganze KEIN Sicherheitsloch is ;)

      1. Mahlzeit,

        $_SESSION['lang'] kann nur als 'de' oder 'en' definiert werden,
        weshalb das ganze KEIN Sicherheitsloch is ;)

        In allen scripts, die unter dieser Domain laufen?
        Und alle Scripts sind so sicher, dass dir niemand Fremdcode unterjubeln kann um damit seine Session zu manipulieren?
        Dann muss ich sagen, Respekt. 100% sichere Scripte zu schreiben schafft kaum jemand ...

        1. Hellihello

          Und alle Scripts sind so sicher, dass dir niemand Fremdcode unterjubeln kann um damit seine Session zu manipulieren?
          Dann muss ich sagen, Respekt. 100% sichere Scripte zu schreiben schafft kaum jemand ...

          Na, eine Prüfung mit in_array($_SESSION["lang"], array("en","de")); oder ein switch dürfte doch aber reichen, oder?

          Dank und Gruß,

          frankx

          --
          tryin to multitain  - Globus = Planet != Welt
          1. Mahlzeit,

            Na, eine Prüfung mit in_array($_SESSION["lang"], array("en","de")); oder ein switch dürfte doch aber reichen, oder?

            Sicher würde das in diesem Fall ausreichen. Aber nur dann, wenn der OP es so prüft, was ich nicht weiss.

            Allerdings ist die Abfrage dann konzeptmässig nicht der Brüller, weil der Code geändert werden muss, und somit der Wartungsaufwand steigt.

            Also entweder das Array in einer Config ablegen oder die Prüfung anders durchführen. Hier würde ja schon reichen, die möglichen Werte auf 2 Zeichen zu begrenzen, denn kein Schadcode kommt mit 2 Zeichen aus ;)

            1. Irgendwo muss ich ja sowieso speichern welche Sprachen ich anbiete, das is bei mir ein array in der config.php

              Und dann lass ich einfach prüfen ob der vom benutzer übergebene Code einem der Sprachen entspricht, is ned soo schwer ;)

              lg
              Robert

  3. echo $begrüßung;

    if($_SESSION['lang'] && $_SESSION['lang']!="") $lang = $_SESSION['lang']; else $lang = 'en';

    PHP ist nicht Javascript. Man prüft das Vorhandensein einer Variablen mit isset(). Der Grund, warum deine Version nicht richtig ist, wird dir bei einem auf E_ALL gestellten error_reporting angezeigt. Wenn man (auch noch) auf "leer" testen möchte, kann man (stattdessen gleich) empty() nehmen.

    Statt einer zweiten Variablen $lang hätte ich den Defaultwert 'en' bei Nicht-Vorhandensein der Session-Variablen gleich in ihr notiert und sie im weiteren Verlauf verwendet.

    include_once('include/lang/'.$lang.'.php');

    Zend schreibt mir da aber folgende Wanrung:
    Multiple annotations found at this line:

    • include-var : Unsafe use of variable in call include()/require()

    Prinzipiell kann das Verwenden einer Variablen zum Bilden des Namens einer zu inkludierenden Datei eine Sicherheitslücke sein. Das muss aber nicht. Eine Prüfroutine kann nicht in jedem Fall fehlerfrei entscheiden, ob das der Fall ist oder ob nicht. Den Hinweis auf die Gefahr wegzulassen wäre auch nicht richtig. In dem Fall wirst du die Nachricht ignorieren können. Du solltest aber prüfen, ob $_SESSION['lang'] nicht an anderer Stelle ungewollt gesetzt werden kann. Das könnte durchaus auch in anderen Scripten passieren, denn eine Session ist ja übergreifend.

    • Unresolved include 'include/lang/'r_variable;$lang'.php' for projects [name]

    Ich vermute, dass hier die Prüfroutine nicht zweifelsfrei eine Initialisierung der Variablen $lang erkennen kann.

    Wie kann ich das lösen?

    Vermutlich durch Deaktivieren oder Ignorieren der beiden Hinweise. Eine kurze Google-Suche ergab keine zielführende Antwort, was du sicher schon selbst festgestellt hast. Ich vermag auch keine zu geben, weil ich die Situation mit meinem "Zend" [*] nicht nachstellen kann.

    [*] Die Firma Zend hat mehrere Produkte entwickelt. In meinem Fall ist es konkret das Zend Studio 5.5.0

    echo "$verabschiedung $name";