FHEMWEB WEB CSRF error

Begonnen von HCS, 18 Februar 2017, 20:45:44

Vorheriges Thema - Nächstes Thema

Skram

Woher kommt denn das Token in Großbuchstaben?


define WEB FHEMWEB 8083 global
attr WEB confirmDelete 0
attr WEB csrfToken none
attr WEB endPlotNow 1

list .* CSRFTOKEN
WEB csrf_311697085119951

list .* csrfToken
WEB none



2017.03.04 13:49:30 1: UPD FHEM/01_FHEMWEB.pm
...
2017.03.04 18:55:38 0: Featurelevel: 5.8
2017.03.04 18:55:38 0: Server started with 281 defined entities (fhem.pl:13593/2017-03-04 perl:5.020002 os:linux user:fhem pid:6406)
2017.03.04 19:23:21 3: FHEMWEB WEB CSRF error:  ne csrf_311697085119951. For detals see the csrfToken FHEMWEB attribute


Eine zweite Serverinstanz gibt es nicht:
root@fhem:~# ps -ax | grep -i fhem
6406 ?        S      0:06 /usr/bin/perl fhem.pl fhem.cfg
6641 pts/0    S+     0:00 grep -i fhem

Benni

Zitat von: Skram am 04 März 2017, 19:39:03
Woher kommt denn das Token in Großbuchstaben?

Das ist ein Internal von FHEMWEB.

Skram

Was mache ich dann falsch? Das eine habe ich auf none gesetzt, das andere ist ein Internal und ich kann es nicht beeinflussen.
Der Aufruf von
http://fhem:8083/fhem?cmd=jsonlist2&XHR=1
meldet aber o.a. Fehler im Log und liefert eine leere Seite.   :(

CoolTux

Zitat von: Skram am 04 März 2017, 22:26:37
Was mache ich dann falsch? Das eine habe ich auf none gesetzt, das andere ist ein Internal und ich kann es nicht beeinflussen.
Der Aufruf von
http://fhem:8083/fhem?cmd=jsonlist2&XHR=1
meldet aber o.a. Fehler im Log und liefert eine leere Seite.   :(

Wenn Du das Attribut schon auf none gesetzt hast, dann mach mal ein neustart.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Benni

Mach mal ein save und dann ein shutdown restart

Edit: Leon war etwas schneller  ;D

Skram

#35
Danke für Eure Antworten! :D
Das wollte ich mit dem o.a. Log-Ausschnitt anzeigen. Einen Neustart habe ich durchgeführt, es hilft aber leider nichts.


2017.03.04 22:39:49 0: Featurelevel: 5.8
2017.03.04 22:39:49 0: Server started with 281 defined entities (fhem.pl:13593/2017-03-04 perl:5.020002 os:linux user:root pid:7639)
...
2017.03.04 22:43:37 3: FHEMWEB WEB CSRF error:  ne csrf_341766229578767. For detals see the csrfToken FHEMWEB attribute


EDIT:
Wenn ich bei Server-Start "csrfToken none" gesetzt habe, bekomme ich o.a. Fehler.
Wenn ich im laufenden Betrieb in der Weboberfäche das Attribut auf "1" setze und danach wieder auf "none", dann geht's.

rudolfkoenig

ZitatWenn ich bei Server-Start "csrfToken none" gesetzt habe, bekomme ich o.a. Fehler.
Ich habe das versucht nachzustellen, ohne Erfolg. Da ich gestern noch etliches gefixt habe: kannst du bitte das Ganze nach einem update erneut testen?

Skram

2017.03.05 11:31:59 1 : UPD FHEM/01_FHEMWEB.pm

Im ersten Anlauf sieht's jetzt gut aus. Nach einem Neustart ist "CSRFTOKEN" nicht gesetzt und
http://fhem:8083/fhem?cmd=jsonlist2&XHR=1 funktioniert.

Vielen lieben Dank!  :D

fhemler



Zitat von: Schlimbo am 20 Februar 2017, 21:36:46
Hallo zusammen,
Ich hatte auch das Problem, dass meine Steuerung über die Android App Tasker nicht mehr funktioniert hatte.
Nach ein wenig Recherche im Internet und ein wenig try&error bin ich dann dahinter genommen wie es funktioniert.

Werte von FHEM las ich über HTTP GET aus:
http://<fhemIP>:8083/fhem?cmd=xmllist%20<device>%20&XHR=1
Meine Steuer Befehle setzte ich über HTTP POST ab:
http://<fhemIP>:8083/fhem?cmd=set%20<device>%20<befehl>&XHR=1

Um den CSRF Token zu bekommen führe ich jetzt eine HTTP GET aus.
Aus der Antwort suche ich mir im Header die Zeile X-FHEM-csrfToken: fhem_xxxxxxxxxxx heraus und Speicher den Token in eine Variable.
GET muss dann wie folgt erweitert werden:
http://<fhemIP>:8083/fhem?cmd=xmllist%20<device>%20&XHR=1&fwcsrf=<token>
Und bei HTTP POST:
http://<fhemIP>:8083/fhem?cmd=set%20<device>%20<befehl>&XHR=1&fwcsrf=<token>

Dank Tasker ist das zum Glück kein Problem, eine kleine Routine einzubauen, die den Token aus dem Header extrahiert, so dass er für weiter POST und GET Befehle genutzt werden kann.

[...]

Gruß Schlimbo


Hallo,

danke schon mal für deinen post. Aber leider funktioniert es bei mir nicht.
Ich habe den Token in der Variable %csrftoken abgespeichert. Aber der weitere Aufruf über HTTP POST (oder auch GET) funktioniert nicht. Immer die bekannte Fehlermeldung im Log.

Hier mal mein HTTP POST:
Server: http://fhem.fritz.box:8083
Path: fhem
Data/File: cmd=%par1&XHR=1&fwcsrf=%csrftoken

%par1 ist der an den Task übergebene Parameter (z.B. set <device> toggle)
Ich habe auch schon die Leerzeichen in %par1 durch %20 ersetzt, das Ergebnis bleibt aber gleich.
Ohne Token hatte es auch vor Version 5.8 schon funktioniert.

Hat noch jemand eine Idee?

Gruß
fhemler



rudolfkoenig

Ob und was gesendet wird, solltest du im FHEM-Log sehen.
Wenn das Extrahieren des tokens schwierigkeiten bereitet kann man auch mit einem festen Token versuchen: das ist nicht wesentlich unsicherer als ein zufaelliger, ist nur nicht praktikabel fuer die Distribution.

fhemler

Zitat von: rudolfkoenig am 30 März 2017, 09:45:57
Ob und was gesendet wird, solltest du im FHEM-Log sehen.
Wenn das Extrahieren des tokens schwierigkeiten bereitet kann man auch mit einem festen Token versuchen: das ist nicht wesentlich unsicherer als ein zufaelliger, ist nur nicht praktikabel fuer die Distribution.
Vielen Dank für den Hinweis aufs Log. Da hatte ich zwar schon rein geschaut, aber dein Hinweis hat mich auf die Idee gebracht das verbose Level mal höher zu setzen.
Und irgendwie sah der Aufruf tatsächlich ein bisschen komisch aus.
Nach etwas studieren der Tasker Hilfe habe ich dann herausgefunden, dass man bei HTTP GET mehrere Attribute durch einen Zeilenumbruch trennen muss und nicht per & aneinander hängt (das macht Tasker dann beim Aufruf).
Bei HTTP POST ist es dasselbe, nur halt im Feld 'Data / File'.

Also vielen Dank nochmal! Jetzt kann ich meine Geräte endlich wieder per widget steuern.

inter79

#41
Hallo,

versuche mich gerade am ESP8266 nach dem vorhandenen Tutorial zu integrieren. Leider komm ich mit dem Fehler überhaupt nicht klar:

FHEMWEB WEB CSRF error: csrf_858961678588965 ne csrf_246023380465126 for client WEB_192.168.1.201_63794 / command shutdown restart. For details see the csrfToken FHEMWEB attribute.


In der Datei fhem_bh1750.lua ist folgende Zeile:
conn:send('GET /fhem?cmd=setreading%20esp8266temp%20state%20' ..luxi.. '&XHR=1\r\n HTTP/1.1\r\nHost: www.local.lan\r\n".."Connection: keep-alive\r\nAccept: */*\r\n\r\n"')



Muss nun die Zeile in der Lua abgeändert werden? Oder muss ich auch in der Fhem etwas anderes Konfigurieren?
Den CSRFToken habe  ich in der WEB gefunden.


rudolfkoenig

csrfToken dient dazu, um gegen CSRF Atacken sich zu wehren.
Sie wird nach jedem FHEM-Start automatisch generiert, es sei denn, man setzt sie explizit.
Wenn man FHEM via HTTP fernsteuern moechte, dan empfiehlt sich das explizite Setzen.

D3ltorohd

So, ich hänge mich hier mal mit an.

Ich weiß nicht, habe ich die Fehlermeldung schon länger ::

2019.10.24 12:08:13 3: FHEMWEB WEB CSRF error: csrf_104345683644172 ne csrf_148832911104462 for client WEB_192.168.178.20_54197 / command shutdown restart. For details see the csrfToken FHEMWEB attribute.

Oder erst seitdem, seit ich vorher OpenHab2 deinstalliert habe und den Rest mit Autoremove entfernt habe. Vllt wurden hier Pakete die FHEM mit nutzt auch entfernt. Vorher ist mir der Eintrag in der Log nicht aufgefallen, jetzt steht er ja schon recht häufig drin.

Ich nutze FHEM nur lokal, über PC und Tablet. Ich möchte es später nicht von aussen steuerbar machen. ? Brauche ich dann dieses Token ? Oder kann ich es abschalten ? Oder was muss ich genau tun um es an zu lassen und diese Fehlermeldung weg zu bekommen ?

Hab mir mal die Wiki durchgelesen, aber steig da nicht wirklich durch.
Base : Intel NUC Debian 9, FHEM aktuell || Zigbee (Coordinator FW Z-Stack 1.2 default Koenkk) || MaxCUL (culfw V 1.67 nanoCUL868) || SIGNALduino 433MHz (V 3.3.2.1-rc8 ) || Shelly s1

rudolfkoenig

ZitatBrauche ich dann dieses Token ?
Wenn du sicherstellen kannst, dass mit keinem Browser, mit dem man auf FHEMWEB zugreift, im Internet unterwegs ist, dann nicht.

Bei fehlendem csrfToken kann beim Besuch einer schlechtgelaunten Internetseite dein FHEM-Server zu einem Bot umgebaut werden, und das wird irgendwannmal mir angelastet. Dass die Internetseite auch deine FHEM-Geraete einschalten/loeschen/etc kann, das ist mir dabei weniger wichtig :)