Linuchs: Probleme grundsätzlicher Wissensvermittlung, z.B. PHP

Moin,

ich habe etwas auf dem Herzen, dies ist der dritte Anlauf. Keine konkrete Detail-Frage, sondern die Sinnfrage nach Wissensvermittlung.

Nach meiner Sommerpause im Garten bin ich mit mentalem Abstand wieder an meine Web-Projekte gegangen mit zahlreichen Einzelfragen und Diskussionen hier.

Das Kalender-Projekt bedarf der Bereinigung. Mehrere Programme machen dasselbe. Die Registrierung als Mitglied erfolgt im Programm A, die Bearbeitung durch Admins im Programm B und die Änderung des Kontos für das Mitglied im Programm C.

In Wirklichkeit werden dieselben Daten bearbeitet. Nicht jeder sieht alle Felder.

Ich kann mir vorstellen, dass auch andere „Solisten“ wie ich so vor sich hinmuckeln und ungewarnt in jede Sackgasse laufen, die sich anbietet.

Erst gestern fiel es mir wie Schuppen von den Augen, dass PHP auf Verzeichnisse zugreifen kann, die dem Web-Zugriff verborgen sind. Und was habe ich mich bemüht, mein include-Verzeichnis wegen der Passworte für die Datenbanken im Web abzusichern.

Vorgestern die automatisierte Übernahme von Formulardaten in die DB-Tabellen. Nach Eingangskontrolle habe ich bisher im SQL-Kommando jedes einzelne Feld benannt. Änderung des SQL-Kommandos, wenn Felder dazugekommen sind. Als Test nun die Feldnamen per SQL aus der Tabelle geholt und wenn die Keys (Spaltennamen) als $_POST vorliegen, die Daten aus dem geprüften Eingangs-Array übernommen.

Aus Schule und Studium kennen wir die Methode, dass ein Lehrer / Professor Themen lehrt, die dem Schüler fremd sind und sehr nützlich sein können.

Wie könnte man so eine Lehre im Web umsetzen? Heute wollte ich wissen, wie man DOCUMEMT_ROOT abruft. Wurde auf diese selfhtml Seite geschickt, die nur das Wort erklärt, aber nicht die Anwendung.

Gruß, Linuchs

  1. Hallo Linuchs,

    der Wiki-Artikel zum Document-Root ist ziemlich dürr, ja, aber das liegt auch daran, dass es ein Glossar-Artikel ist.

    Wo gehört das Thema hin? Der Begriff an sich ist universell, er gilt auch für statische Websites, aber wirklich relevant wird er bei einer aktiven Site mit SSI, PHP oder anderer serverseitiger Logik.

    Eigentlich sollte man dazu mehr im Bereich PHP oder Webserver finden. Es muss nur jemand schreiben... Sowas wie: Dateiorganisation in einem Web-Projekt mit PHP. Nur ist der PHP Teil im Wiki sehr dünn, da fehlt einfach Manpower. Bzw. men mit genug power (und Zeit) für den Job. Es ist auch was ganz anderes, hier im Forum Fragen zu beantworten, als einen Wiki-Artikel zu schreiben, das habe ich schon oft genug festgestellt.

    Rolf

    --
    sumpsi - posui - obstruxi
  2. Tach!

    Ich kann mir vorstellen, dass auch andere „Solisten“ wie ich so vor sich hinmuckeln und ungewarnt in jede Sackgasse laufen, die sich anbietet.

    Das kann durchaus passieren, wenn man nur in seinem eigenen Saft kocht. Man kann das umgehen, indem man sich mit anderen auszutauscht, oder sich die Probleme anderer Leute anschaut, und durch den Versuch einer Lösungsfindung auch den eigenen Horizont erweitert.

    Erst gestern fiel es mir wie Schuppen von den Augen, dass PHP auf Verzeichnisse zugreifen kann, die dem Web-Zugriff verborgen sind. Und was habe ich mich bemüht, mein include-Verzeichnis wegen der Passworte für die Datenbanken im Web abzusichern.

    Dass es Verzeicnisse abseits des DocumentRoot gibt und man diese für solche unzugänglichen Ablagen verwenden kann, war schon des öfteren Thema hier im Forum.

    Vorgestern die automatisierte Übernahme von Formulardaten in die DB-Tabellen. Nach Eingangskontrolle habe ich bisher im SQL-Kommando jedes einzelne Feld benannt. Änderung des SQL-Kommandos, wenn Felder dazugekommen sind. Als Test nun die Feldnamen per SQL aus der Tabelle geholt und wenn die Keys (Spaltennamen) als $_POST vorliegen, die Daten aus dem geprüften Eingangs-Array übernommen.

    Und nun musst du dir dazu auch noch überlegen, wie man diese Lösung missbrauchen kann. Was passiert, wenn man andere Keys als vorgesehen übergibt? Kann man Keys übergeben, die eigentlich nicht geschrieben werden sollen?

    ORMs können dabei helfen, dass man sch weniger um die niederen Tätigkeiten beim Umgang mit dem DBMS kümmern muss.

    Aus Schule und Studium kennen wir die Methode, dass ein Lehrer / Professor Themen lehrt, die dem Schüler fremd sind und sehr nützlich sein können.

    Wie könnte man so eine Lehre im Web umsetzen?

    Informationen gibt es im Web genug. Aber du bist kein Schüler einer Pflichtveranstaltung mehr und musst dich selbst darum bemühen, an Wissen zu kommen.

    Heute wollte ich wissen, wie man DOCUMEMT_ROOT abruft.

    Generell steht alles in $_SERVER, was man vom Webserver über den Request erzählt bekomme.

    dedlfix.

    1. Man kann das umgehen, indem man sich mit anderen auszutauscht, oder sich die Probleme anderer Leute anschaut, und durch den Versuch einer Lösungsfindung auch den eigenen Horizont erweitert.

      Dedlfix hat recht: So lange Du Dich nur um Inselprobleme kümmerst lernst Du nicht wirklich.

      Ich bin ja vor allem ein Autodidakt: Ich hab den größten Teil meines Wissens gerade dadurch erworben, dass ich die „Probleme anderer Leute“ nicht für „unsichtbar“ gehalten sondern mich an der Lösungsfindung beteiligt habe…

    2. Moin dedlfix,

      Man kann das umgehen, indem man sich mit anderen auszutauscht

      Zu Detail-Problemen ist das hier ja erfreulich und möglich. Aber ich habe noch nicht ein einziges Mal ein komplettes, fremdes PHP-Programm gesehen. Wie denn auch? Irgendwie strukturiere ich das wie früher mit Cobol (Compiler) gelernt und mit Basic (Interpreter) wieder eingeschränkt.

      Auch das Zusammenbauen (Bausteine) von HTML-Passagen noch nie gesehen, nur das fertige Ergebnis. Meine HTML-Bausteine bringen ihren <style> selber mit. Das wird vom Validator gerügt, weil es in den HTML-head gehört. Aber zumindest der FF berücksicht es trotzdem. Natürlich achte ich drauf, dass der <style> am Anfang des Bausteins steht.

      Was passiert, wenn man andere Keys als vorgesehen übergibt?

      Was soll schon passieren, die werden ignoriert. Würden ja nur einen SQL-Fehler verursachen.

      Aber du bist kein Schüler einer Pflichtveranstaltung mehr und musst dich selbst darum bemühen, an Wissen zu kommen.

      So mache ich es ja (notgedrungen) auch. Aber stelle dir vor, du möchtest eine Fremdsprache lernen und bekommst nur Hilfe, wenn du gezielte Fragen stellst.

      Die Volkshochschulen sind nicht so hoch, wie ihr Name verspricht. Gesucht, aber zu meiner Fremdsprache PHP nichts gefunden.

      wenn man nur in seinem eigenen Saft kocht.

      Gerne würde ich anderen Köchen mal über die Schulter gucken, das war der Anlass dieses Fadens. Ich vermute, dass in meinen Projekten Genialität und törichte Umständlichkeiten Tür an Tür wohnen. Aber ich kann sie mangels Vergleich nicht erkennen.

      Gruß, Linuchs

      Edit: Es ist ja nicht die Sprache allein. Ein Projekt ist sowas wie ein Roman. Sprache un viele Ideen dahinter. Ich kann natürlich die Oberfläche anderer Romane in Form fertiger Webseiten betrachten, aber eben nicht, wie andere dieses Handwerk betreiben.

      Und ja - ich lebe allein und durch Corona sind mir auch meine Chor-Aktivitäten abhanden gekommen. Da kann man schon mal einen Knast-Koller bekommen. Danke, dass ich hier immerhin noch schriftlich kommunizieren kann.

      1. Lieber Linuchs,

        Aber ich habe noch nicht ein einziges Mal ein komplettes, fremdes PHP-Programm gesehen. Wie denn auch?

        echt jetzt? Du hast noch nie ein PHP-Script heruntergeladen und dann in die Scriptdateien geschaut? Auch nicht auf GitHub oder GitLab irgendwo?

        Was passiert, wenn man andere Keys als vorgesehen übergibt?

        Was soll schon passieren, die werden ignoriert. Würden ja nur einen SQL-Fehler verursachen.

        Soso. Eine gefährlichere Grundhaltung kann ich mir an dieser Stelle nicht vorstellen. SQL-Injections welcome... WTF?!

        Ich kann natürlich die Oberfläche anderer Romane in Form fertiger Webseiten betrachten, aber eben nicht, wie andere dieses Handwerk betreiben.

        Falsch. Free Open Source Software gibt es auch für Webapplikationen, die in PHP geschrieben sind. Unsere Wiki-Software ist nur ein Beispiel unter vielen.

        Und ja - ich lebe allein und durch Corona sind mir auch meine Chor-Aktivitäten abhanden gekommen. Da kann man schon mal einen Knast-Koller bekommen.

        Da hast Du mein uneingeschränktes Mitgefühl. Als Musiker weiß ich darum, dass Singen mit Seelenhygiene zu tun hat.

        Liebe Grüße

        Felix Riesterer

        1. Hallo Felix,

          Was soll schon passieren, die werden ignoriert. Würden ja nur einen SQL-Fehler verursachen.

          Soso. Eine gefährlichere Grundhaltung kann ich mir an dieser Stelle nicht vorstellen. SQL-Injections welcome... WTF?!

          Hier hätten wir mal ein Beispiel von Grundverständnis. Ich denke bisher, dass Daten nur in Form von $_GET, $_POST, $_REQEST und $_COOKIES an meine Tür klopfen. Bald ist Halloween und du malst ein Gespenst, nicht wirklich greifbar. Bange machen gilt nicht, welches Problem siehst du konkret?

          Zu Beginn eines Programms hole ich immer schon die möglichen Werte in ein Quarantäne-Array. Ja ich weiß, viele hier halten das Kopieren für überflüssig. Aber diese Werte prüfe ich dann auf Plausibilität, ergänze sie ggf. Nur mit diesen Daten wird weitergearbeitet.

          Hast du mal einen Link, wie andere eine solche Eingangskontrolle machen?

          Zwecks Speicherung hole ich mir seit Kurzem die Spalten-Namen per SQL. Für jeden Namen schaue ich, ob isset( $_POST.. ) vorliegt und das Feld in meinem Quarantäne-Array ist. Wenn ja, hole ich mir den Wert von dort. Mag sein, dass SQL-Injection versucht wird, habe ich schon erlebt. Doch die Werte gehen mit addslashes in die Datenbank. Siehst du hier eine Lücke?

          Vielleicht sollte ich jeden ankommenden Wert noch auf Länge prüfen, das dürfte Angriffsversuche zusätzlich vereiteln. Mal sehen, ob SQL mir auch die Feldlänge verrät. Wahrscheinlich in Klammern wie bei int(11) und varchar(50).

          So vermeide ich, dass fehlende Werte (weil sie in der <form> nicht vorkommen) vorhandene Daten mit NULL oder Blank überschreiben.

          Sehr änderungsfreundlich. Möchte ich ein Input-Feld ergänzen oder abwählen, muss ich in PHP nur mein Quarantäne-Array ergänzen / verringern, die Plausi-Prüfung mit Fehlermeldung hinzufügen / wegnehmen, aber sonst gar nichts am Code.

          Gruß, Linuchs

          1. Hallo Linuchs,

            Für jeden Namen schaue ich, ob isset( $_POST.. ) vorliegt und das Feld in meinem Quarantäne-Array ist.

            Okay. Damit stellst Du sicher, dass nur valide Namen ankommen und Dir niemand einen Spaltennamen unterjubelt, der das Statement kapert.

            Doch die Werte gehen mit addslashes in die Datenbank

            addslashes ist dafür nicht vorgesehen, das PHP Handbuch rät davon ab. Die Begründung wird nicht genannt, aber ich würde annehmen, dass es je nach Datenbank noch weitere Zeichen gibt, die maskiert werden müssen, und addslashes dann nicht reicht. Halte Dich an das Handbuch: Nimm mysqli_real_escape_string. Bzw. die escape_string Methode auf dem mysqli-Objekt. Bzw. die quote Methode auf dem PDO Objekt.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Tach!

              Doch die Werte gehen mit addslashes in die Datenbank

              addslashes ist dafür nicht vorgesehen, das PHP Handbuch rät davon ab. Die Begründung wird nicht genannt, aber ich würde annehmen, dass es je nach Datenbank noch weitere Zeichen gibt, die maskiert werden müssen, und addslashes dann nicht reicht.

              Im Falle von MySQL mit ISO-8859 oder UTF-8 ist addslashes() ausreichend.

              addslashes() ist eine PHP-Funktion und müsste unter der Haube nichts anderes als Stringersetzung sein.

              Die mysql(i)-Escape-Funktionen sind Funktionen der MySQL-API. Das alte mysql_escape_string() (ohne i und real) arbeitete vermutlich ähnlich wie addslashes(). Die real-Variante hingegen brachte mit, dass die Zeichenkodierung auf der Verbindung berücksichtigt wurde, wenn sie mit den dafür vorgesehenen API-Funktionen und nicht mit SET NAMES gesetzt wurde.

              Bei ISO-8859 und Abkömmlingen sowie UTF-8 sind die zu maskierenden Zeichen und deren Codes eindeutig, sodass keine falschen Bytes erwischt werden können, wenn man die Kodierung nicht berücksichtigt. Das "real" spielt also in unseren Breiten keine Rolle. Bleiben noch die unterschiedlichen Zeichen.

              Characters encoded are \, ', ", NUL (ASCII 0), \n, \r, and Control+Z. Strictly speaking, MySQL requires only that backslash and the quote character used to quote the string in the query be escaped. mysql_real_escape_string() quotes the other characters to make them easier to read in log files.

              Backslash und die Quote-Zeichen werden auch von addslashes() behandelt. Damit ergibt sich kein funktional wichtiger Unterschied. Das soll nun aber nicht heißen, dass ich addslashes() empfehle.

              dedlfix.

              1. Im Falle von MySQL mit ISO-8859 oder UTF-8 ist addslashes() ausreichend.

                Mit einer anderen Zeichencodierung könnte ein Angreifer diese Abwehr ausser Kraft setzen?

                1. Hallo Linuchs,

                  der Angreifer schickt einen Bytestrom. Mit welcher Zeichencodierung der interpretiert wird, legst Du als Seitenbetreiber fest. Also, nein, der Angreifer kann das nicht.

                  Es sei denn, er ist schon auf deinem Server und kann PHP umkonfigurieren 😉

                  Rolf

                  --
                  sumpsi - posui - obstruxi
                2. Tach!

                  Im Falle von MySQL mit ISO-8859 oder UTF-8 ist addslashes() ausreichend.

                  Mit einer anderen Zeichencodierung könnte ein Angreifer diese Abwehr ausser Kraft setzen?

                  Du bist es, der dem DBMS zum Verbindungsaufbau sagt, welche Zeichenkodierung es zu erwarten hat. Wenn jemand Daten in einer anderen Kodierung oder beliebigen anderen Datenmüll sendet, werden die Bytes vom DBMS trotzdem als das ausgewertet, was du da angegeben hast. In den ankommenden Daten bleiben nach der Maskierungs-Stringersetzung aus Sicht der angegebenen Kodierung keine ungewünschten Sequenzen übrig. Ich sehe da kein sicherheitstechnisches Risiko, solange der Rest vom Statement syntaktisch passt.

                  dedlfix.

      2. Hallo Linuchs,

        okay, dieses Problem verstehe ich. Meine Visiten bei "fremden PHP Programmen" sind beschränkt auf einen Turniermanager, an dem ich einige Jahre gebastelt habe (bis die Spielplattform, für die er gemacht war, abgeschaltet wurde) und einige Codestudien von PHPBB2. Der Turniermananger war aber auch das Erstlingswerk des Autors, und das sah man ihm an. Dort habe ich etliche Meinungen entwickelt, was man nicht tun sollte. Ob meine Meinung dann die bessere war? Keine Ahnung.

        Ich vermute, dass in meinen Projekten Genialität und törichte Umständlichkeiten Tür an Tür wohnen.

        100% Ack. Für meine Arbeit natürlich - deine kenne ich ja nicht von innen. Und was Du für Genialität hältst, wird jemand anderes wohl als wilden Codeknäuel betrachten. Und umgekehrt. So ist das in der Kunst nun mal.

        Aber das ist wohl bei den meisten so, dass sie bei PHP im eigenen Saft kochen. Keine Ahnung, wer hier professionell, in einem Team, PHP entwickelt.

        Die Frage ist also, wie man von der Kunst zum Handwerk kommt. Nicht nur in PHP, auch in HTML, CSS und ggf. JS und SQL. Das ist selbstredend nicht einfach.

        Du kannst bei github nach PHP Projekten suchen und Dir anschauen, wie es andere machen. Natürlich hast Du dann keine Bewertung, ob Du da etwas Nachahmenswertes siehst. Und meistens sind github-Projekte so groß, dass man keinen schnellen Einstieg findet.

        Und mal angenommen, es wäre kein Corona, Peter H. Plappermaul wäre dein Nachbar und machte mit Dir eine Woche lang einen Review deiner Programme. Wer sagt Dir, dass Peter die Weisheit mit Löffeln gefressen hat? (Das sagt Dir bei uns hier übrigens auch keiner.) Wir können gerne über grundsätzliche Patterns in der PHP Entwicklung diskutieren, und du wirst dann diverse Meinungen zu hören bekommen. Daraus kannst Du Dir dann deine eigene Meinung bilden.

        Styles in den body zu setzen ist übrigens kein gültiges HTML. Das war mal geplant, aber es ist nicht in den Standard gekommen. Wenn Du mit Styles modularisieren willst, dann kommst Du vermutlich an BEM nicht vorbei, wobei es auch da Stimmen gibt, die das für Mist halten.

        PS: Wenn Du eine Form der Modularisierung gebaut hast, bei der jedes UI Widget eigenes CSS braucht, dann könnte man das so gestalten, dass diese Widgets Objekte sind. Und jedes Objekt hat eine get_styles() Methode, die das CSS zum Widget liefert. Irgendeine Managerinstanz muss dann wissen, welche Widgets auf der Seite sind und beim Aufbau des <head> der Reihe nach alle get_styles Methoden aufrufen.

        Aber ist das nötig? Du betreibst eine Einmannshow. Es kann viel effizienter sein, alles CSS deines Projekts in eine .css Datei zu bündeln und die bei jeder Seite mit auszuliefern. Dann kann es der Browser cachen, und gut ist.

        Rolf

        --
        sumpsi - posui - obstruxi
      3. Tach!

        Man kann das umgehen, indem man sich mit anderen auszutauscht

        Zu Detail-Problemen ist das hier ja erfreulich und möglich. Aber ich habe noch nicht ein einziges Mal ein komplettes, fremdes PHP-Programm gesehen. Wie denn auch?

        Aus vielen Details wird ein fertiges Programm. Fertige Anwendungen gibt es im Open-Source-Bereich genügend. Und es gibt auch Frameworks, die dir ein Gerüst für dein Programm geben können. Und damit dann auch eine Idee, wie man sein Problem strukturieren kann.

        Auch das Zusammenbauen (Bausteine) von HTML-Passagen noch nie gesehen, nur das fertige Ergebnis. Meine HTML-Bausteine bringen ihren <style> selber mit. Das wird vom Validator gerügt, weil es in den HTML-head gehört. Aber zumindest der FF berücksicht es trotzdem. Natürlich achte ich drauf, dass der <style> am Anfang des Bausteins steht.

        Wenn der Style-Bereich im Body steht, ist es auch irrelevant, ob er vor oder nach der HTML kommt, für das er Regeln enthält.

        Aber abgesehen davon, wenn erst später Dinge anfallen, die in den Header gehören, kann man das Zusammensetzen nach weiter hinten verlagern. Die einzelnen Programmteile dürfen dann nicht direkt ausgeben, sondern geben in verschiedene Puffer aus, einen für Styleangaben, einen für Body-HTML. Am Ende fügt man die Teile so zusammen, wie es eigentlich sein soll. Mal so als einfache Idee in den Raum geworfen.

        Was passiert, wenn man andere Keys als vorgesehen übergibt?

        Was soll schon passieren, die werden ignoriert. Würden ja nur einen SQL-Fehler verursachen.

        Dazu darf es gar nicht erst kommen. Wenn fehlerhaftes SQL erzeugt werden kann, kann man vielleicht auch gültiges aber ungewolltes SQL erzeugen.

        Aber du bist kein Schüler einer Pflichtveranstaltung mehr und musst dich selbst darum bemühen, an Wissen zu kommen.

        So mache ich es ja (notgedrungen) auch. Aber stelle dir vor, du möchtest eine Fremdsprache lernen und bekommst nur Hilfe, wenn du gezielte Fragen stellst.

        So ist es aber nicht. Es gibt sowohl Sprachkurse als auch Tutorials für Anwendungsdesign im Netz.

        Die Volkshochschulen sind nicht so hoch, wie ihr Name verspricht. Gesucht, aber zu meiner Fremdsprache PHP nichts gefunden.

        Dafür ist das Publikum der VHS wohl zu allgemein. Wenn du Präsenzveranstaltungen suchst, gibt es sicher auch die eine oder andere von Gruppierungen, die sich mit PHP beschäftigen.

        wenn man nur in seinem eigenen Saft kocht.

        Gerne würde ich anderen Köchen mal über die Schulter gucken, das war der Anlass dieses Fadens. Ich vermute, dass in meinen Projekten Genialität und törichte Umständlichkeiten Tür an Tür wohnen. Aber ich kann sie mangels Vergleich nicht erkennen.

        Such nach Tutorials für PHP-Frameworks. Die gibt es in ausreichender Anzahl für den kleinen und großen Bedarf. Und es gibt Webseiten, die die Frameworks kurz vorstellen und miteinander vergleichen.

        Edit: Es ist ja nicht die Sprache allein. Ein Projekt ist sowas wie ein Roman. Sprache un viele Ideen dahinter. Ich kann natürlich die Oberfläche anderer Romane in Form fertiger Webseiten betrachten, aber eben nicht, wie andere dieses Handwerk betreiben.

        Romane werden meist noch allein im stillen Kämmerlein geschrieben. Aber Software ist kein Roman. Gerade im Open-Source-Bereich findet die Entwicklung auch öffentlich statt, wenngleich fast nur auf Englisch.

        dedlfix.

        1. Hallo dedlfix,

          Aber abgesehen davon, wenn erst später Dinge anfallen, die in den Header gehören, kann man das Zusammensetzen nach weiter hinten verlagern. Die einzelnen Programmteile dürfen dann nicht direkt ausgeben, sondern geben in verschiedene Puffer aus, einen für Styleangaben, einen für Body-HTML. Am Ende fügt man die Teile so zusammen, wie es eigentlich sein soll. Mal so als einfache Idee in den Raum geworfen.

          Gute Anregung. Für HTML (mit style) mache ich das schon seit Beginn meiner PHP-Karriere, denn oft möchte ich ein Endergebnis (z.B. eine Summe) oben auf der Seite verkünden.

          Das alte EVA-Prinzip (Eingabe, Verarbeitung, Ausgabe) kann ich wohl auch für style-snippets sofort umsetzen.

          Linuchs