Nutzung des csrfToken - Anleitung?

Begonnen von ManuZz, 28 Februar 2017, 10:03:17

Vorheriges Thema - Nächstes Thema

CoolTux

Zitat von: ManuZz am 28 Februar 2017, 12:38:58
Ich habe eine kleine Webseite auf meinen raspberry laufen (dort läuft auch fhem) und dort sind die die aufrufe eingepflegt.

Danke schonmal für die Hilfe!

Kannst Du mir sagen in welcher Sprache Du die Seite gemacht hast? php oder statisches HTML? Wüsstest Du wie man mittels JavaScript zum Beispiel Seiteninhalt abruft und nach Inhalten durchsucht?
Wenn nicht, mach es einfach so. Erstelle eine WEBINSTANZ die Du nur für Deine Aufrufe über die Webseite verwendest. Schaue Dir hierfür mal etwas genauer das allow Modul an. Hier kannst Du zugriffe auf Befehlsebene oder gar Deviceebene machen. Gibt glaube auch(vorsicht geraten) ein allowFrom wo Du die IP der Geräte die darauf zugreifen dürfen eintragen kannst.


Grüße
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

rudolfkoenig

ZitatEs geht auch nicht, wenn ich an die obige url den aktuellen Token in der Art &fwcsrf=fhem_3450307859263.46 anhänge.

Das geht sehr wohl, das Token aendert sich aber (wenn nicht explizit via csrfToken gesetzt) nach jedem FHEM-Start. Wenn man sich nicht die Muehe mit dem Parsen von HTTP-Header oder body-Tag antun will, dann kann man auch ein festes csrfToken setzen. Oder man definiert eine "API" FHEMWEB-Instanz, mit gesetzten allowfrom, und csrfToken none.

CoolTux

Zitat von: rudolfkoenig am 28 Februar 2017, 13:29:25
Das geht sehr wohl, das Token aendert sich aber (wenn nicht explizit via csrfToken gesetzt) nach jedem FHEM-Start. Wenn man sich nicht die Muehe mit dem Parsen von HTTP-Header oder body-Tag antun will, dann kann man auch ein festes csrfToken setzen. Oder man definiert eine "API" FHEMWEB-Instanz, mit gesetzten allowfrom, und csrfToken none.

Und ich denke mal das ist genau das was wir dem User ManuZz ans Herz legen sollten. So wie von mir geschrieben. Ist das einfachste. Mache ich genau so.
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

Otto123

#18
Zitat von: CoolTux am 28 Februar 2017, 13:06:15
Parsen ist Im Grunde einfach nur das auslesen nötiger Daten. Das kann man in Deinem Fall zum Beispiel mit mit grep machen und das Ergebnis als Variable zur Verfügung stellen.

Die Seite ist weiß aber der Quelltext sollte schon zu mindest den Header enthalten
Also meine Seite ist weiß und die Seite mit dem Quelltext auch  :-[

Was parsen als  Wort bedeutet war mir schon klar  :P ich wollte gerne eine Zeile Code  ;)

@Rudi Ja ok, mit curl geht es - habe ich jetzt herausgefunden. Das sich der Token jedesmal ändert war mir schon klar  ;)
Aber nicht einfach mit anhängen, sondern mit --datacurl --data 'fwcsrf=fhem_53905226430937.4' http://raspib:8083/fhem?cmd=set%20Aktor1%20off
Nur damit hier mal ein Beispiel für die Unwissenden steht  ;D

Die Sache mit dem "API WEB" ist sicher auch grundlegend ein guter und einfacher Gedanke. Ich werde dann mal etwas dazu ins Wiki stellen.

Jetzt muss ich nur noch parsen ...  8)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

Versuche mal ohne das ?XHR=1 damit geht es auf jeden Fall. Hast dann dummer Weise natürlich auch mehr Inhalt. Vielelicht hat Rudi da noch eine Idee.

Das mit dem bash Script kann ich mir ja mal anschauen. Sollte nicht schwer sein, aber ich bräuchte dafür etwas mehr Ruhe. Wird also bisschen dauern.
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

rudolfkoenig

Muss man hier alles selber machen? :)

curl "http://localhost:8083/fhem?cmd=set%20Office%20on&XHR=1&fwcsrf="`curl -s -D - 'http://localhost:8083/fhem&XHR=1' | awk '/X-FHEM-csrfToken/{print $2}'`

War jetzt wirklich nicht so schwer. Getestet mit fhem.cfg.demo.

ZitatAber nicht einfach mit anhängen, sondern mit --data
FHEMWEB unterscheidet nicht zwischen POST (--data) und GET (URL) Parameter, man kann sogar mischen.

ZitatVersuche mal ohne das ?XHR=1 damit geht es auf jeden Fall.
Mit &XHR=1 geht es auch, s.o. In diesem fall muss man den Token aus dem HTTP-Header rausfischen, ohne XHR=1 steht es auch im body. Wie ich das oben schon geschrieben habe.

CoolTux

Zitat von: rudolfkoenig am 28 Februar 2017, 15:35:48
Muss man hier alles selber machen? :)

curl "http://localhost:8083/fhem?cmd=set%20Office%20on&XHR=1&fwcsrf="`curl -s -D - 'http://localhost:8083/fhem&XHR=1' | awk '/X-FHEM-csrfToken/{print $2}'`

War jetzt wirklich nicht so schwer. Getestet mit fhem.cfg.demo.
FHEMWEB unterscheidet nicht zwischen POST (--data) und GET (URL) Parameter, man kann sogar mischen.
Mit &XHR=1 geht es auch, s.o. In diesem fall muss man den Token aus dem HTTP-Header rausfischen, ohne XHR=1 steht es auch im body. Wie ich das oben schon geschrieben habe.

Oh man ich Honk. Stimmt ja, http Header steht ja nicht im File sondern ist Teil des Transportprotokolls. Danke Rudi für den Schups


Grüße
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

Otto123

Ok, kaum fragt man die richtigen Leute - funktioniert es auch :)

also der Trick beim curl ist einfach: man braucht die "" um die URL. Liegt scheinbar am & - wusste ich nicht. Also so geht es:
curl "http://$host:8083/fhem?cmd=set%20$name%20$event&fwcsrf=fhem_3450307859263.46"

Und der Einzeiler um den Token zu lesen ist natürlich Spitze - danke. Wäre ich nie drauf gekommen.  :-[

Bei dem kompletten Einzeiler sagt er mir noch: curl: (3) Illegal characters found in URL
Das wird wohl an den `` liegen, kenne ich irgendwie. Da suche ich noch.

Danke und Grüße
Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wuehler

Hallo,

ich habe dazu einigermaßen passend zwei Themen:
1. für die, die ebenfalls perl-Scripte per cron aufrufen und daraus per http://myfhem/fhem?cmd... Werte in fhem setzen ein Stück Perl-Code zur Extraktion eines csrf-Tokens.
2. An die Cracks eine Frage:
In meinem Script rufe ich den Schul-Vertretungsplan meiner Tochter ab (inkl. Login und Navigation auf der Seite). Per cron wird das script 3x am Tag aufgerufen (alternativ über die UI) . Zu Beginn hatte ich den Code in meiner myUtils. Wenn ich andere Forum-Threads richtig verstanden habe muss man dabei darauf achten, das es keine blocking-HTTP-Requests gibt, da fhem sonst "steht". Ist mein Ansatz so i.O. oder würdet ihr das anders lösen?



use strict;
use warnings;
use POSIX;
use Modern::Perl;
use HTML::TableExtract;
use WWW::Mechanize;
use LWP::Simple;
use URI::Escape;

my %data=parseVertretungsplanURL();

sub getCSRFToken{
  my $token="";
  my $content=get("http://myfhem/fhem");
  die "Couldn't get it!" unless defined $content;
  my $index1=index($content,"fwcsrf=")+8;
  my $index2=index($content,"'",$index1);
  $token=substr($content,$index1,$index2-$index1);
  #print "\ncontent: ".substr($content,$index1-12,$index2-($index1)+5)."\n";
  #print "\ntoken: ".$token."\n";
  return $token;
}

sub parseVertretungsplanURL{

  my $token=getCSRFToken;
  get("http://myfhem/fhem?cmd.dummy_Vertretungsplan=set%20dummy_Vertretungsplan%20doUpdate%20inProgress&fwcsrf=".$token);
  my ($mech) = WWW::Mechanize->new();

  $mech->get('https://infoseite.de/login/');
 
  .....
  # durch Seiten durchnavigieren und Daten auslesen
  .....
 
  #Daten in FHEM aktualisieren:
  get("http://myfhem/fhem?cmd.dummy_Vertretungsplan=set%20dummy_Vertretungsplan%20b_Info%20".uri_escape($infost)."&fwcsrf=".$token);
  ... 
  get("http://myfhem/fhem?cmd.dummy_Vertretungsplan=set%20dummy_Vertretungsplan%20doUpdate%20done"."&fwcsrf=".$token);
  return %AllData;
}

ManuZz

@CoolTux
ZitatKannst Du mir sagen in welcher Sprache Du die Seite gemacht hast? php oder statisches HTML? Wüsstest Du wie man mittels JavaScript zum Beispiel Seiteninhalt abruft und nach Inhalten durchsucht?
Wenn nicht, mach es einfach so. Erstelle eine WEBINSTANZ die Du nur für Deine Aufrufe über die Webseite verwendest. Schaue Dir hierfür mal etwas genauer das allow Modul an. Hier kannst Du zugriffe auf Befehlsebene oder gar Deviceebene machen. Gibt glaube auch(vorsicht geraten) ein allowFrom wo Du die IP der Geräte die darauf zugreifen dürfen eintragen kannst.

Ich hab ne html Seite - zu mehr bin ich nicht in der Lage. Hab heute probiert es auszulesen und einzusetzen aber ich bin nicht annähernd zum Erfolg gekommen. Ich nehme einfach die Fallback Möglichkeit auf Version 5.7. Hat gut funktioniert. Danke für die Mühe!

CoolTux

Zitat von: ManuZz am 03 März 2017, 18:26:18
@CoolTux
Ich hab ne html Seite - zu mehr bin ich nicht in der Lage. Hab heute probiert es auszulesen und einzusetzen aber ich bin nicht annähernd zum Erfolg gekommen. Ich nehme einfach die Fallback Möglichkeit auf Version 5.7. Hat gut funktioniert. Danke für die Mühe!

Bitte mach es Dir nicht zu einfach. Den Token gibt es nicht ohne Grund.
Dann erstelle Dir lieber eine extra Webinstanz. Sichere sie mit https und Passwort und schaue Dir an was Du mit dem Device allow passend zur Webinstanz alles einstellen kannst.



Grüße
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

rudolfkoenig

Oder csrfToken auf einen festen Wert setzen, und an dem FHEM Befehl &fwcsrf=festerWert ranhaengen.

CoolTux

Richtig. Ganz vergessen. Gibt auch einen festen Token. Danke Rudi.
So langsam schwirrt einen der Kopf von den ganzen Tokenkram   ;D
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

ManuZz

ich hab die fhem Installation nun endgültig zerlegt - ich muss nun das raspberry erstmal neu aufsetzen da nichts mehr geht und ich die Reste nicht losbekomme. ich werde dan version 5.7 nehmen - da ich nicht weiß wie man ein festen token wert setzt - und das die Sicherheit auch nicht hebt. ich finde es schade das solche features eingeführt werden ohne eine doku dazu. aber es erleichtert mich das ich nicht der einzige bin der hier am raten ist.
ich update dann halt erst wenn es hier neues gibt das so einfach ist das ich es auch umsetzen kann - schade ist das die einfache Abschaltung nicht funktioniert.
Und ich war dumm das ich das changelog nicht gelesen habe - aber es ist kein zustand das mein licht nicht funktioniert, es war schön etwas gebastelt zu haben das gute 3 jahre funktionierte.
Aber nun habe ich wieder 2 Tage lang etwas zu tun.

Wuppi68

Zitat von: ManuZz am 03 März 2017, 20:17:58
ich hab die fhem Installation nun endgültig zerlegt - ich muss nun das raspberry erstmal neu aufsetzen da nichts mehr geht und ich die Reste nicht losbekomme. ich werde dan version 5.7 nehmen - da ich nicht weiß wie man ein festen token wert setzt - und das die Sicherheit auch nicht hebt. ich finde es schade das solche features eingeführt werden ohne eine doku dazu. aber es erleichtert mich das ich nicht der einzige bin der hier am raten ist.
ich update dann halt erst wenn es hier neues gibt das so einfach ist das ich es auch umsetzen kann - schade ist das die einfache Abschaltung nicht funktioniert.
Und ich war dumm das ich das changelog nicht gelesen habe - aber es ist kein zustand das mein licht nicht funktioniert, es war schön etwas gebastelt zu haben das gute 3 jahre funktionierte.
Aber nun habe ich wieder 2 Tage lang etwas zu tun.

gerade wenn Du sowieso alle Neu machen willst, dann würde ich auf jeden Fall auf die aktuelle "Technik" umsteigen, also neuestes Linux, neuestes FHEM ... sonst wirst Du die Probleme nur in die Zukunft verschieben und die Erfahrung zeigt es uns immer wieder - es kommt immer mehr dazu :-)

Aktuell ist es alles noch überschaubar - und wenn Du das CFSR in den Griff bekommen hast, wirst Du bestimmt die nächsten Dinge deutlich leichter angehen können

Bedenke: Wissen bringt mehr Wissen
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen