Fehlermeldung Backen getLastOrders etc.

Liebes Forum :slight_smile: :slight_smile:

ich bekomme im Backend oft folgende Fehlermeldung:

exception ‚Enlight_Controller_Exception‘ with message ‚Unauthorized‘ in /var/www/vhosts/meinshop.de/httpdocs/engine/Shopware/Plugins/Default/Backend/Auth/Bootstrap.php:202
Stack trace:
#0 /var/www/vhosts/meinshop.de/httpdocs/engine/Library/Enlight/Event/Handler/Plugin.php(149): Shopware_Plugins_Backend_Auth_Bootstrap->onPreDispatchBackend(Object(Enlight_Controller_ActionEventArgs))
#1 /var/www/vhosts/meinshop.de/httpdocs/engine/Library/Enlight/Event/EventManager.php(214): Enlight_Event_Handler_Plugin->execute(Object(Enlight_Controller_ActionEventArgs))
#2 /var/www/vhosts/meinshop.de/httpdocs/engine/Library/Enlight/Controller/Action.php(138): Enlight_Event_EventManager->notify(‚Enlight_Control…‘, Object(Enlight_Controller_ActionEventArgs))
#3 /var/www/vhosts/meinshop.de/httpdocs/engine/Library/Enlight/Controller/Dispatcher/Default.php(523): Enlight_Controller_Action->dispatch(‚getLastOrdersAc…‘)
#4 /var/www/vhosts/meinshop.de/httpdocs/engine/Library/Enlight/Controller/Front.php(223): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))
#5 /var/www/vhosts/meinshop.de/httpdocs/engine/Shopware/Kernel.php(177): Enlight_Controller_Front->dispatch()
#6 /var/www/vhosts/meinshop.de/httpdocs/vendor/symfony/http-kernel/HttpCache/HttpCache.php(487): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#7 /var/www/vhosts/meinshop.de/httpdocs/engine/Shopware/Components/HttpCache/AppCache.php(255): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)
#8 /var/www/vhosts/meinshop.de/httpdocs/vendor/symfony/http-kernel/HttpCache/HttpCache.php(258): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)
#9 /var/www/vhosts/meinshop.de/httpdocs/engine/Shopware/Components/HttpCache/AppCache.php(103): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true)
#10 /var/www/vhosts/meinshop.de/httpdocs/shopware.php(113): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request))
#11 {main}
2017-04-28T12:41:56.926278+0200
core
{
    „uri“: „/backend/widgets/getLastOrders?_dc=1493376116500&page=1&start=0&limit=25“,
    „method“: „GET“,
    „query“: {
        „_dc“: „1493376116500“,
        „page“: „1“,
        „start“: „0“,
        „limit“: „25“,
        „module“: „backend“,
        „controller“: „widgets“,
        „action“: „getLastOrders“
    },
    „post“:
}
No shop data available
No session data available
 

Also wenn ich die letzten Bestellungen betrachte. Ganz ähnliche Fehlermeldungen bekomme ich bei getVisitors und getTurnOverVisitors und wahrscheinlich auch noch bei weiteren. Es ist immer die gleiche php-Programmzeile.

Die Fehlermeldung erhalte ich nur als Email, bei der Bedienung im Backend bin merke ich davon nichts.

Woran könnte das denn liegen ?

 

Liebe Grüße

Kerstin

Hallo Kerstin,

Ich würde behaupten dass der entsprechende Controller die ACLs prüft, also die Zugriffsrechte.

Was nutzt du denn für einen User?

Welche Rolle und welche Rechte hat diese Rolle, bzw. hat sie einige Rechte NICHT?

Thomas

Danke für die Antwort. Das „Unauthorized“ deutet natürlich darauf hin.

Es ist der Hauptbenutzer, der bei der Installation erstellt wird (Admin). Der müsste ja alle Zugriffsrechte haben.

Ausserdem wird ja alles angezeigt, es scheinen also keine Rechte zu fehlen.

 

Hier noch die betreffenden Zeilen aus der erwähnten Bootstrap.php:

    public function onPreDispatchBackend(Enlight_Event_EventArgs $args)
    {
        $this->action = $args->getSubject();
        $this->request = $this->action->Request();
        $this->aclResource = strtolower($this->request->getControllerName());

        if ($this->request->getModuleName() != ‚backend‘
          || in_array($this->aclResource, array(‚error‘))) {
            return;
        }

        if ($this->shouldAuth()) {
            if ($this->checkAuth() === null) {
                if ($this->request->isXmlHttpRequest()) {
                    throw new Enlight_Controller_Exception(‚Unauthorized‘, 401);  //

                } else {
                    $this->action->redirect(‚backend/‘);
                }
            }
        } else {
            $this->initLocale();
        }
    }

scheint aber wirklich was mit Rechten zu tun zu haben. Wo kann man das denn einstellen ?

Was du suchst sind Rollen und Benutzer!

Ich habe zwei Benutzer, die die Rolle local_admins haben. Und bei der Rolle local_admins sind alle Recourcen/Privilegien aktiv.

 

Ich muss mir das am Dienstag nochmal genau ansehen. Der ‘schuldige’ Programmcode ist ja die checkauth()-methode des jeweiligen controllers. 

Hast du noch mehr Hintergrundinfos für mich? Version? Testshop oder Echtsystem? Seit wann die Probleme? Deine Schuhgröße?

Alles kann helfen :wink:

 

Thomas

Es handelt sich um ein Produktivsystem, Version 5.2.9. Die Probleme gibt es bestimmt schon recht lange. 39.

Mehr wüsste ich nicht.

Liebe Grüße

Kerstin

 

Sind mehrere User im backend unterwegs? Eventuell hat davon einer keine Rechte um Bestellungen einzusehen - hat aber das „letzte Bestellungen“ Widget aktiviert. So könnte ich mir die Fehlermeldungen erklären.

viele Grüße 

Ich hatte das so verstanden dass die Fehlermeldung nur bei Kerstin im Backend auftaucht. Kannst dus denn absichtlich herbeiführen, Kerstin?

 

Dann würd ichs mir evtl. mal per Teamviewer ansehen wollen…

Wir hatten gestern einen ähnlichen Fehler und zu der Zeit war niemand im Backend unterwegs.
Ich kann mit solchen Fehlermeldungen ehrlich gesagt (noch) nicht sehr viel anfangen und in unserem Backend wird nur mit einem User (Admin) mit allen Zugriffsrechten gearbeitet.

Enlight_Controller_Exception: Unauthorized in /engine/Shopware/Plugins/Default/Backend/Auth/Bootstrap.php:209 Stack trace:
#0 /engine/Library/Enlight/Event/Handler/Plugin.php(149): Shopware_Plugins_Backend_Auth_Bootstrap->onPreDispatchBackend(Object(Enlight_Controller_ActionEventArgs))
#1 /engine/Library/Enlight/Event/EventManager.php(214): Enlight_Event_Handler_Plugin->execute(Object(Enlight_Controller_ActionEventArgs))
#2 /engine/Library/Enlight/Controller/Action.php(136): Enlight_Event_EventManager->notify(‘Enlight_Control…’, Object(Enlight_Controller_ActionEventArgs))
#3 /engine/Library/Enlight/Controller/Dispatcher/Default.php(523): Enlight_Controller_Action->dispatch(‘getVisitorsActi…’)
#4 /engine/Library/Enlight/Controller/Front.php(223): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))
#5 /engine/Shopware/Kernel.php(182): Enlight_Controller_Front->dispatch()
#6 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(491): Shopware\Kernel->handle(Object(Enlight_Controller_Request_RequestHttp), 1, true)
#7 /engine/Shopware/Components/HttpCache/AppCache.php(266): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)
#8 /vendor/symfony/http-kernel/HttpCache/HttpCache.php(258): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)
#9 /engine/Shopware/Components/HttpCache/AppCache.php(103): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true)
#10 /www/htdocs/w00f7e6a/shop.pepari.de/shopware.php(117): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request))
#11 {main}
@Kerstin83‍ - Fehlermeldung nur als Email? Aber im Log steht sie doch sicher auch!?

Ich denke die Meldung kommt (imho) daher dass jemand unangemeldet (ein Bot der das automatisch macht) die Bestellungen zu sehen. Soweit nichts was man verhindern kann. @Kerstin83‍ ist das bei dir vielleicht genauso?

@ThomasChr schrieb:

…Soweit nichts was man verhindern kann…

Das vermute ich auch…
Nur tun wir uns etwas schwer mit der Analyse/Bewertung solcher Fehler, ob Handeln angesagt ist oder nicht.

So, ich konnte den „Fehler“ nachstellen.

Kurz zur Erklärung: Shopware nutzt (wie viele andere Websiten heutzutage) sogenannte XML-Requests um Daten asynchron nachzuladen. Wenn du also im Backend bist wird einmal das Backend geladen, und dann fliegen noch ein paar weitere asynchrone Abfragen los die Daten nachladen. Zum Beispiel die letzten Bestellungen und die aktuelle Anzahl an Besuchern die online sind. Diese asynchronen Abfragen sind vollkommen unabhängig und um sicherzustellen dass diese Abfragen zu dir gehören bekommen sie drei Dinge mit:

  1. Deine aktuelle PHP-Session ID, und

  2. Einen geheimen Schlüssel (X-CSRF-Token), sowie

  3. Einen Hinweis dass sie ein XML-Request sind und nicht ein Aufruf über einen Browser

Wenn der Wert 3 nicht gesetzt ist denkt Shopware du wärst ein Mensch, wirft keine Fehlermeldung und leitet dich stattdessen aufs Backend zum einloggen um, das kannst du in dem von dir geposteten Programmcode der Datei ‚/engine/Shopware/Plugins/Default/Backend/Auth/Bootstrap.php‘ sehen:

if ($this->request->isXmlHttpRequest()) {
    throw new Enlight_Controller_Exception('Unauthorized', 401);
} else {
    $this->action->redirect('backend/');
}

Sowohl 1 als auch 2 sind quasi zufällige Zeichenfolgen die ein andere Mensch nicht kennen kann, auch ausprobieren ist ziemlich schwierig weil sie ja zusammenpassen müssen. (Wobei er 1 eventuell aus dem Cookie auf deinem Computer auslesen kann, deshalb gibt es den Wert 2 noch…)

ABER: Das hindert niemanden daran es nicht trotzdem zu versuchen.

Wenn du es ausprobieren willst, hier ist ein Stückchen Python-Programmcode (benötigt das requests-Modul) damit du selber von irgendeinem komplett anderen Computer mal deine letzten Bestellungen sehen kannst. Du musst nur den richtigen Cookie und richtigen CSRF-Token einfügen:

#!/usr/bin/python3
import requests

headers = {'Cookie': 'SHOPWAREBACKEND=6pbn3xxxx6imhvgcl98iep34i0'}
headers['X-CSRF-Token'] = 'wOHCg26ZhVOZxxxxBUIewclEsTsWjN'
headers['X-Requested-With'] = 'XMLHttpRequest'
r = requests.get('https://www.example.de/backend/widgets/getLastOrders?page=1&start=0&limit=25', headers = headers)
print(r.text)

Die Domain musst du natürlich auch anpassen. (Die Daten kriegst du in der Developer-Konsole deines Browser, Network Tab, denn da siehst du jeden Request, auch den nach getLastOrders - jedesmall wenn du im LastOrders Widget auf aktualisieren drückst!)

Und wie finden wir nun heraus wo der Request herkam?

Ganz einfach: Der Apache speichert alle Zugriffe. Die Abfrage sieht z.B. so aus im access.log:

92.227.0.XXX - - [29/Apr/2017:12:31:16 +0200] "GET /backend/widgets/getLastOrders?page=1&start=0&limit=25 HTTP/1.1" 200 3681 "-" "python-requests/2.9.1"

Dir sollte erstmal auffallen dass die IP nicht deine ist. Wenn du genauer forscht kannst du auch rausfinden wo die IP in etwa herkommt. Kommt sie aus China warst es eher nicht du :slight_smile:

Der letzte Teil „python-requests/2.9.1“ ist der sog. User-Agent, der ist wahrscheinlich ein anderer als bei dir. Kann aber frei gesetzt werden, muss also nicht stimmen. Wahrscheinlich steht hier eher nicht „BruteforceHackingBot“ drin…

Ist damit das Rätsel gelöst?

Lg,

Thomas

PS: @Kerstin83: Wenn du jetzt natürlich sagst du kriegst diese Meldung im Backend direkt und nicht per Mail oder aus dem Log, dann fangen wir hier wieder von vorne an :slight_smile:

Vielen Dank. Hat dich meine Schuhgröße darauf gebracht ?

PS: @Kerstin83: Wenn du jetzt natürlich sagst du kriegst diese Meldung im Backend direkt und nicht per Mail oder aus dem Log, dann fangen wir hier wieder von vorne an :slight_smile:

Ne, im Backend bekomme ich keine Meldung.

Und ich habe mir mal die IP-Adresse angeschaut. Es könnte sein, dass es nicht meine ist. Eigentlich speichere ich meine eigene IP-Adresse immer automatisch, um eben in diversen Fällen herauszubekommen, ob ich etwas war. Und diese IP ist nicht dabei. Ganz sicher ist das allerdings nicht. Etwas merkwürdig ist, dass die IP ganz aus der Nähe stammt. Ausserdem war ich zu dem Zeitpunkt auch im Backend… Kann natürlich Zufall sein. Deswegen muss ich das mal weiter beobachten.

Wie kommt denn jemand da überhaupt hin ? Muss man sich für Visitor-Anfragen etc. nicht eingeloggt haben ? Oder deutet das sogar darauf hin, dass der account gehackt ist ?

LG

Kerstin

Die Abfragen kann jeder machen der deine Shopadresse kennt. Und ja, ohne die Schuhgröße hätte ichs nicht gefunden :slight_smile:

Meld dich einfach wenn du noch Fragen hast oder Hilfe brauchst!

Lg,

Thomas