HTTP-Requests keine funktion mehr nach Update

Begonnen von jailbreaker07, 02 Februar 2017, 21:38:13

Vorheriges Thema - Nächstes Thema

jailbreaker07

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

breezybadger

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

Schlimbo


marvin78

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).

CoolTux

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>
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

Schlimbo

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

CoolTux

Im Grunde hast Du Recht. Solange ich dafür einen eigenen Webhook verwende sollte es kein Problem darstellen.
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

justme1968

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?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

CoolTux

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
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

justme1968

das steht auch ohne update in der commandref :)
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Schlimbo

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

Master_Nick

#14
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.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)