Hallo,
ein paar Sachen steuere ich in Fhem über externe Anwendungen per HTTP-Requests . Jetzt habe ich gestern in FHEM ein Update gemacht, leider musste ich heute festellen das keiner meiner eingerichteten HTTP-Requests mehr funktioniert. Wenn ich ein Sicherungsimage von FHEM auf die Karte flashe dann funktioniert das mit dem HTTP-Requests solange bis ich das FHEM Update durchführe...... hat einer von euch ein änliches Problem und evtl eine Lösung dafür? Ich habe schon ziemlich lange gebraucht um zu den Endschluss zu kommen das es an den Update liegt, nur für eine Lösung reicht meine "Anfängerwissen" nicht.
Über Logocontrol welches auch auf dem Raspi läuft sieht das mit dem HTTP Request wie folgt aus:
<method id="1" name="auf" url="http://localhost:8083/fhem?cmd=set Tuerschloss unlock" />
Vielen dank
Für eure Hilfe
Gruß
Thorsten
Hi,
habe seit dem Update Heute genau das gleiche Problem. Wenn hier jemand eine Lösung hat oder mir ein Tipps gibt wie ich dazu beitragen kann eine zu finden würde ich mich freuen.
Gruß
breezy
attr WEB csrfToken none
Das ist nicht die Lösung, sondern nur ein Workaround. Bitte die Änderungshinweise von Version 5.8 beachten (oben rechts in diesem Forum in fett rot).
Um den CSRF Token zu bekommen.
HTTP GET machen.
Aus der Antwort suche 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>
Das hast du zwar schön geschrieben, kommt mir auch irgendwie bekannt vor, ;)
aber gerade bei den meisten externen Anwendungen, die Befehle über HTTP an FHEM schicken ist mir keine einfache Möglichkeit bekannt, den Token (der sich nach jedem FHEM Neustart ändert) zu aktualisieren. Viele IoT Geräte bieten nur die Möglichkeit eine Statische URL Adresse einzutragen.
Wie genau das bei der LogoControl funktioniert weiß ich nicht genau, ich denke aber auch dass die URLs irgendwo fest in einer Konfigurationsdatei stehen. Wenn die LogoControl auf einem Raspberry läuft könnte ich mir noch ein shell Skript vorstellen, dass den Token dann in der Konfigurationsdatei anpasst, dann ist aber immer noch die Frage ,ob LogoControl eine Änderung der Konfig zur Laufzeit überhaupt mitbekommt.
Bei vielen Anwendungen sehe ich deshalb keine andere Möglichkeit als csrfToken zu deaktivieren.
So wie ich es verstanden habe besteht die Gefahr von Cross-Site-Request-Forgery nur wenn in einem Browser mehrere Tabs gleichzeitig geöffnet sind.
Da hier aber nicht durch einem Browser der HTTP Request erfolgt, sollte es ja dann auch kein Sicherheitsrisiko darstellen, wenn csrfToken deaktiviert wird.
Natürlich macht es dann Sinn für solche Anwendungen ein separates WEB Device, mit deaktivierten csrfToken anzulegen, dass nur für diesen Zweck genutzt wird und nicht über einen Browser genutzt werden sollte.
Bitte korrigiert mich, wenn ich hier falsch liege oder ihr eine andere Möglichkeit seht.
Gruß Schlimbo
Im Grunde hast Du Recht. Solange ich dafür einen eigenen Webhook verwende sollte es kein Problem darstellen.
ihr habt schon gesehen das das das token auch auf einen festen wert setzen kann den man dann in die urls für so ein extra web device einbauen kann?
Zitat von: justme1968 am 21 Februar 2017, 11:09:36
ihr habt schon gesehen das das das token auch auf einen festen wert setzen kann den man dann in die urls für so ein extra web device einbauen kann?
Noch nicht. Habe noch kein Update gemacht. Danke für den Tip
das steht auch ohne update in der commandref :)
Zitat von: CoolTux am 21 Februar 2017, 07:06:57
Um den CSRF Token zu bekommen.
HTTP GET machen.
Das geht auch einfacher. Das Token steht in der globalen Variablen $FW_CSRF
Gib mal in der FHEMWEB Befehlszeile folgendes ein:
{$FW_CSRF}
dann bekommst Du den kompletten String zurück, den Du einfach an einen HTTP-Request anhängen musst.
die direkte abfrage mit {$FW_CSRF} funktioniert nicht wenn man mehrere web devices verwendet da hier immer das token der zuletzt abgerufen seite eingetragen ist.
um das token einer bestimmten fhemweb instanz zu bekommen ist es besser das internal CSRFTOKEN abzufragen.
wenn man das token nicht per attribut fest vergibt ändert sich das token auch bei jedem fhem neu start.
ja, Du hast ja recht... ich wollte doch nur verdeutlichen, dass man das Token einfach aus FHEM selbst bekommen kann, ohne erst HTML Code parsen zu müssen.
my $csrf= ($FW_CSRF ? "fwcsrf='$defs{$FW_wname}{CSRFTOKEN}'" : "");
Ein Token fest vorzugeben macht für mich eigentlich keinen Sinn, dann kann man es auch gleich abschalten.
Zitat von: betateilchen am 21 Februar 2017, 11:32:16
Das geht auch einfacher. Das Token steht in der globalen Variablen $FW_CSRF
Gib mal in der FHEMWEB Befehlszeile folgendes ein:
{$FW_CSRF}
dann bekommst Du den kompletten String zurück, den Du einfach an einen HTTP-Request anhängen musst.
Das versteh ich noch nicht so ganz, ich benötige doch den Token auf dem entfernten System. Was bringt es mir dann, wenn es in FHEM dafür eine Variable gibt? Kann ich diese über HTTP irgendwie auslesen?
Gruß
Schlimbo
Ui jetzt wo ich das hier sehe, ich triggere ein Script über NFC-Tags (App Automate) im Android Handy und schalte per http get mein Qi-Ladegerät an.
Dann muss ich mich da auch mal mit außeinander setzen ob ich die token Antwort auffangen kann. Habe da allerdings nur die von Automate vorgegebenen Möglichkeiten.
Einfach aus Prinzip würde ich ungern das Token festsetzen. ;-)
Alternative wäre natürlich Telnet.
Du könntest dafür AMAD und Automagic einsetzen. Nur so als Tip.