Offen PRG implementieren

x42

Aktives Mitglied
19. Oktober 2013
5
0
Guten Abend,

auf Dauer mach ich mich hier sicher unbeliebt, aber das nehm ich jetzt in Kauf.
PRG: Post/Redirect/Get - Wikipedia, the free encyclopedia

Wie an anderer Stelle bereits erwähnt, schreibe ich gerade ein Template. Beginnend mit leeren Dateien.
Das mach ich nicht aus Langeweile, sondern weil ich als CCO selbst festlegen möchte, wie die Besucher der Websites meiner Auftraggeber mit dieser interagieren sollen.

Ziele des Templates:
Es muss ohne Javascript die wesentlichsten Funktionen bereitstellen. Javascript ist nur ein Wrapper, der dem User, der es aktiviert hat bzw überhaupt nutzen kann (vgl. Screenreader, Braille), die Usability vereinfacht. Ich kann also nicht einfach alle Formulare auf XHR formulieren. Zudem will ich die PHP-Dateien soweit wie es geht nicht anfassen oder injecten; ich würde wahrscheinlich den Shop neu schreiben weil mich das hier aufregt... 240ms Ladezeit sind entschieden zu lang.

Aus diesem Weglassen des XHR ergibt sich ein Problem, dass mit dem Script-Ablauf der Original-Files zu tun hat.

Templateseitiges PRG würde theoretisch gehen. Ich hab zumindest erfolgreich eine Seite (mein Konto -> Rechnungsadresse ändern) so umbiegen können, dass der User aus der POST-Schleife herauskommt.
In der functions.php ist der PRG; um sicherzuestellen, dass ich nicht zu früh sterben lass, trigger ich das vom Template aus.

Prinzip:
PHP:
    function prg()
    {
        if(FALSE === $this->isPrg())
            return;
        
        !ob_get_length() ?: ob_end_clean();
        clearstatcache();
        
        ignore_user_abort(true);
        
        header('Cache-Control: no-store, no-cache', true);
        header('Pragma: no-store, no-cache', true);
        header('Content-Length: 0', true);
        header('Content-Type: text/plain', true);
        header('location: '.$_SERVER['REQUEST_URI'], true, 0x012D);
    }
    
    function isPrg()
    {
        return $_SERVER['REQUEST_METHOD'] === 'POST';
    }
PHP:
{strip}
{if $x42.core->isPrg() === true}
    {$x42.core->prg()}
{else}
    ... mach das, was du sonst tust
{/if}
{strip}

Ich war eben dabei das mal in die Artikel-Seite einzubauen. Die Artikel-Seite ist jedoch Context-Sensitive. Und hier kommen wir auch zu dem "falschen" Script-Ablauf:
Das Template wird bereits ignoriert, z.B. wenn ich den Lagerbestand überziehen will. Den Redirekt macht ihr wiederum, um eine Nachricht an den User via GET zu triggern, statt das in der Session zu speichern, mit dem Ergebnis, dass ich auch die SEO-Url verlass (selbst wenn ich als action im Formular definiert ist).

Würde ich das jetzt als Plugin umsetzen, hätte ich hier imho auch schon ein Hook-Problem: entweder mach ich den Redirect zu früh (bevor ihr das Script abgearbeitet habt) oder zu spät (smarty wird bereits getriggert).

Auswahl:


  1. Der Script-Ablauf (ein Pattern habt ihr ja nicht), müsste zumindest dahingehend abgeändert werden, dass alle Header erst collected und Bedarf versandt werden.
  2. Eine Nachricht an den User ist nicht mittels GET zu triggern. Ich kann 10 Artikel im Warenkorb haben und mir trotzdem "Ihr Warenkorb ist leer" anzeigen lassen. Anderes Beispiel:
    http://example.com/index.php?a=1327&n=1&r=1
    http://example.com/index.php?a=1327&n=1&r=2
    http://example.com/index.php?a=1327&n=1&r=3
    http://example.com/index.php?a=1327&n=1&r=4
    http://example.com/index.php?a=1327&n=1&r=5
    http://example.com/index.php?a=1327&n=1&r=6
    http://example.com/index.php?a=1327&n=1&r=7
    http://example.com/index.php?a=1327&n=1&r=8

    Angenommen ein Kunde legt etwas in den Warenkorb und triggert einen Fehler, z. B. Verfügbarkeit:
    Es ist nicht unwahrscheinlich, dass er sich jetzt ein Bookmark zieht. Solang er über das Lesezeichen einsteigt, wird also immer die Nachricht "Nicht Verfügbar" sehen.

    Nachrichten wie diese gehören normalerweise tokenized in die Session (sterben also mit dem nächsten Request).
  3. Der ganze Thread wäre nicht notwendig, würde der Shop PRG bereits von Haus aus unterstützen. Die Änderungen im Core sind nicht mit Aufwand verbunden (siehe oben) - allerdings nur, wenn man weiß, an welcher Stelle. Das wiederum kann nur JTL selbst.
  4. Formular-Targets: Die artikel_inc überschreibt mit ihrem Location mein Target. Unabhängig davon, was ich dem User vorsetzen will, sollte es wenigstens so formuliert sein, dass er anschließend wieder auf die SEO-Url kommt. Er hat schließlich nur etwas in den Warenkorb legen wollen.
  5. Es fehlt eine Möglichkeit Custom Ajax-Formulare abzusenden: RFC ist UTF-8. Der Shop ist aber so geschrieben, dass er nur das encoded, von dem er annimmt, dass es UTF-8 sein könnte. Hier fehlt im Core ein Mapping, dass dann getriggert wird, wenn der Browser den XHR-Request-Header mitschickt.

Die PHP-Scripte sind aus PHP4-Zeiten und teilen dem Leser mit, dass die Autoren wenig bis gar keine keine Ahnung von der PHP-Engine haben, weil sie C, C++ oder C# gewohnt sind. Das würde einen nicht so interessieren, hättet ihr nicht vor wenigen Tagen diesen artkel published: JTL-Software zählt zu den 50 am schnellsten wachsenden Technologieunternehmen Deutschlands


OT: Das Triggern der Message-Boxen kann man schon fast als vulnarabilty einstufen, denn das ist ne Quasi-Einladung für Script-Kiddies zu ner Port-Scan-Party. Ich habe Zweifel, dass jeder eurer Lizenznehmer nen Admin im Keller gefesselt hat oder regelmäßig Log-Files liest.
Als Nicht-Lizenznehmer (ich arbeite nur im Auftrag mit eurem Shop und kann nicht mal Tickets erstellen ohne schief angeguggt zu werden) hätte ich gern eine Adresse, an die man Exploits melden kann. Sowas gehört nicht ins Forum. Und manche Threads hier sollten nur für Shop-Betreiber zu sehen und nicht öffentlich einsehbar sein.

Ich danke für Ihre Zeit.
 

alibaba-nr1

Aktives Mitglied
16. August 2011
75
5
AW: PRG implementieren

Als Nicht-Lizenznehmer (ich arbeite nur im Auftrag mit eurem Shop und kann nicht mal Tickets erstellen ohne schief angeguggt zu werden) hätte ich gern eine Adresse, an die man Exploits melden kann. Sowas gehört nicht ins Forum.

Solltest du der Meinung sein einen Exploit gefunden zu haben kannst du eine Nachricht an info@jtl-software.de senden. Hier wird dann sicherlich geprüft ob der von dir genannte Exploit nachvollziehbar ist und anschließend (falls erforderlich) eine vernünftige Lösung erarbeitet. Das solche Sachen nicht öffentlich ins Forum gepostet werden sollten sehe ich genauso.
 

x42

Aktives Mitglied
19. Oktober 2013
5
0
AW: PRG implementieren

In diesem Forenbereich sind wir (imho) nicht ganz "privat". Mir gehts darum: Ich bin zwar registriert aber kein Shopbetreiber (ich habe stellvertretend zwar ein berechtigtes Interesse aber keine JTL-Lizenz). Ich ziele daher auf Internas ab: Hier werden teilweise sicherheitsrelevante Themen besprochen. Jemand, der keinen JTL- Shop betreibt (eben kein berechtigtes Interesse um das Wissen hat), hat es einen S***** zu interessieren, wie man ein Admin-Passwort resetet oder durch einen FALSCHEN aber funktionieren Ratschlag einen Pseudo-DDOS erzielt*: mit einem Request alle 5 Minuten. Das ist wie dieser Brasilien-Thread. JTL ist z. B. so freundlich den Sessionname nach dem Unternehmen zu bennenen (eventuell wird das mit der Branding-Free-Version abgestellt, dazu kann ich nix sagen). Der interessierte User wird also früher oder später in diesem Forum landen.

Gleiches gilt für OT-Zeug: Ihr seid Shopbetreiber/SP whatever (Unternehmer!) und alles (oder das meiste), was ihr hier schreibt (Strategien, Verfahrensweisen, Probleme aber eben auch die Lösungen), kann jeder eurer Kunden/Auftraggeber mitlesen. Jedes Problem, dass ihr mit eurem Shop habt und ihr hier, auf der Suche nach Rat, niedergeschrieben habt. Es gibt vereinzelt Fälle (Fragen und Antworten gleichermaßen betreffend), da würde ich mir als Verbraucher schon überlegen, ob ich dort jemals einkaufen gehen will. Oder ob ich diesem Shop vertrauen kann/will. Und da meine ich so Sachen wie Login-Formulare auf HTTP-Seiten; Betreiber, die auf HTML5 mappen, aber iframes nicht sandboxen** und noch ganz andere Sachen***, die man findet, wenn man nur genauer hinsieht. Ich hab Verständnis für Startupper ohne Budget und Respekt vor Autodidakten, die sich von Null beginnend mit gleich allen Thematiken des Shopbetriebs befassen. Irgendwie muss man ja anfangen. Aber bitte lasst die Finger von Sachen, die euren Kunden und damit letzlich auch euch Schaden.

* In irgeneinem Thread wurde beschrieben, wie man den Export über URL executen kann (verbunden mit Cron, ich find den Thread nicht); jemand der die URL öffentlich zugänglich (unzulängliche Implementation) lässt, lädt alle Wissenden dazu ein, genau diese Url mal aufzurufen und zu guggen, was passiert (Server-Auslastung). Nach intext:"powered by JTL" -site:*.jtl-software.de Shop-Betreibern Filter und die dann bissl nerven. Das macht dann ein Sheduled Task über nen Tor Node... Da fallen mir noch ganz andere Sachen ein, die ich hier jetzt lieber nicht hinschreib... Das offenbart dann aber auch gleich das Problem mit dem JTL-Signatur-Zwang und Suchmaschinen (bindet das wenigstens als GFX ein oder über CSS BG bzw Content-String).

** Erlaubter Zugriff auf DOM (DOM = html, js) und damit Zugriff auf alles.
Wenn ihr euch mit Dingen befasst, die neu für euch sind, solltet ihr euch beratschlagen lassen, von Leuten, die wissen was sie tun. Ansonsten lauft ihr Gefahr, dass ihr zur Spamschleuder werdet. Einfaches Cookie-Stealing ist da wohl noch das geringste Problem. Bei Session-Stealing/-Spoofing wirds dann interessanter.

*** Ich hatte mir letztens ein Plugin angesehen um zu guggn, wohin es sein Ergebnis schreibt (Frontend). Die Plugins sind verschlüsselt. Irgendwie nachvollziehbar. Aber irgendwie auch nicht. Meine Frage dazu: prüft jemand aus dem Haus JTL was die machen? Oder muss man beim Betrieb einfach hoffen, dass das Plugin keinen entschlüsstelten DB-Dump zur Venus schickt? Der Shopbetreiber steht gegenüber seinen Kunden in der Haftung. Wer haftet, wenn so ein Plugin Unfug macht (vielleicht nicht mal beabsichtigt, sondern exploitable)? Selbst wenn der Shop-Betreiber rechtlich nicht haftet, ist sein Ruf im Eimer.

OT/Nachtrag (zu meinem vorherigen Post und weil ich durch das Überfliegen des Forums etwas weiß, was ich lieber nicht wüsste):
Ich vertete die Interessen meiner Auftraggeber (aber hardcore: das ist mein Leben). Die steigen nicht mit nem 50k-Budget ein. Mein Job ist es, aus wenig das bestmögliche zu machen. Wenn deren Shop nicht funzt wie er soll, landet das auf meinem Schreibtisch; dann denke ich mir was dazu aus, dass die Interessen des Auftraggebers vertritt. Umgekehrt kann ich meinem Kunden aber keine optimalen Lösungen anbieten/vorschlagen, weil die Software das nicht unterstützt bzw kann ich den Shop nicht Qualitativ pushen, damit er sein 400-Euro-Core-Einmkaufs-Erlebnis endlich mal verliert (zum Beispiel Fehlermeldungen gezielt Filtern). Oder man hat 95% der Todo-Liste abgearbeitet und steht dann vor so einem Redirect-Problem. Vielleicht bin ich auch nur langsam etwas frustriert über eben diese Tatsache, dass der Shop nur den Anforderungen der Wawi aber nicht denen entspricht, die eine Usability im Jahr 2014 verlangt.
 

casim

Sehr aktives Mitglied
26. Juni 2012
5.934
9
AW: PRG implementieren

Also wenn ich mir deine 5 Beiträge durchlese, dann frag ich mich, wann du deinem Auftraggeber empfohlen hast, sich ein anderes Shop-System zu suchen ... war das zwischen Beitrag 3+4 oder doch erst 4+5?