Autor Thema: [hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Java und #  (Gelesen 788 mal)

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
Hallo,

ich möchte folgenden Code anpassen um dies mit der csrfToken Option "kompatible" zu gestalten wenn es User geben sollte, welche keine "none" Einstellung besitzen.

Laut Wiki - csrfToken-HowTo ist hierfür eine Anpassung des Links notwendig.
Wenn ich folgenden Code mit Link habe

$button_test = "<a href='http://localhost:8083/fhem?cmd=set%20Office%20on'>test</a>";
möchte ich diesen umstellen.

Die Variante
$button_test = "<a href='curl%20--data%20"fwcsrf=$(curl%20-s%20-D%20-%20'http://localhost:8083/fhem?XHR=1'%20|%20awk%20'/X-FHEM-csrfToken/{print%20$2}')"%20http://localhost:8083/fhem?cmd=set%20Office%20on'>test</a>";verläuft ins leere und erzeugt keine Logausgabe.

Über eine Mithilfe oder einen Tip wäre ich sehr erfreut.
Danke
« Letzte Änderung: 22 Mai 2019, 18:34:46 von HomeAuto_User »
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3955
  • Wer anderen eine Bratwurst brät...
Wie soll dieser Code verwendet werden?
Innerhalb oder außerhalb von FHEM?
Soll das Perl Code werden?

Gruß
Dan
FHEM 5.9, Brix, VIVO mini, RPi3, Debian Jessie, ZME_UZB1
HM-CFG-LAN, HM-MOD-UART-WIFI, HUE, HarmonyHub, JeeLink, CO20
Hyperion auf RPi Zero W, Sonos, viel Z-Wave und HM
alles per HomeKit steuerbar
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
Es ist ein CodeAuszug von einem PerlModul für FHEM.

Das was dahinter steckt wird innerhalb von FHEM dann befohlen.

Mit der von mir dargestellten Zeile lasse ich mir in einem Fester den Link anzeigen worauf ich dann den FHEM Befehl absetzen möchte.

Gesendet von iPhone mit Tapatalk Pro
« Letzte Änderung: 11 April 2019, 12:37:58 von HomeAuto_User »
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3955
  • Wer anderen eine Bratwurst brät...
In FHEM (Perl) gibt es die Variable $FW_CSRF.
Die kannst Du einfach hinten an die URL anhängen.

Etwa so:
$button_test = "<a href='http://localhost:8083/fhem?cmd=set%20Office%20on$FW_CSRF'>test</a>";
Gruß
Dan
FHEM 5.9, Brix, VIVO mini, RPi3, Debian Jessie, ZME_UZB1
HM-CFG-LAN, HM-MOD-UART-WIFI, HUE, HarmonyHub, JeeLink, CO20
Hyperion auf RPi Zero W, Sonos, viel Z-Wave und HM
alles per HomeKit steuerbar
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Offline Otto123

  • Hero Member
  • *****
  • Beiträge: 12498
  • schon mal restore trainiert?
    • Otto's Technik Blog
Hallo,

da ich den Wiki Artikel mit geschrieben habe, würde ich das Beispiel von Dan dort einfach mal noch mit einfügen.

Der Ansatz vom TE ist doch aber gar nicht realistisch? Also ich frage wirklich :)
Innerhalb eines links <a href='http://...</a> kann doch ein Code wie curl gar nichts ausgeführt werden?

Da wäre mein Ansatz (für den Fall das das Ganze nicht innerhalb FHEM(Perl) laufen soll):
erstmal token ermitteln:
token=$(curl -s -D - "http://$fhemhost/fhem?XHR=1" | awk '/X-FHEM-csrfToken/{print $2}')oder im Perl
my $token;
my $hosturl;
my $ua = new LWP::UserAgent;
my $url = "$hosturl/fhem?XHR=1/";
my $resp = $ua->get($url);
   $token = $resp->header('X-FHEM-CsrfToken');
Und dann analog zum Vorschlag von Dan in den Link die Variable einbauen.
Oder lieg ich falsch?

Gruß Otto
« Letzte Änderung: 11 April 2019, 13:35:02 von Otto123 »
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3955
  • Wer anderen eine Bratwurst brät...
Innerhalb eines links <a href='http://...</a> kann doch ein Code wie curl gar nichts ausgeführt werden?

Natürlich geht sowas nicht in einem Link (mit Perl)!
Deswegen hatte ich gefragt ob der Code innerhalb oder außerhalb von FHEM laufen soll und ob es Perl Code sein soll. Ich kenne nicht alle Programmiersprachen. Vielleicht geht diese Zusammenstellung auch in einer mir unbekannten Sprache.
Innerhalb von FHEM-Perl ist die Benutzung der Variable $FW_CSRF m.E. die einfachste Lösung.
Oder statt dessen selber "zusammenbauen":
my $CSRF= "&fwcsrf=".InternalVal("WEB","CSRFTOKEN","");
$button_test = "<a href='http://localhost:8083/fhem?cmd=set%20Office%20on$CSRF'>test</a>";

Gruß
Dan
« Letzte Änderung: 11 April 2019, 14:12:49 von DeeSPe »
FHEM 5.9, Brix, VIVO mini, RPi3, Debian Jessie, ZME_UZB1
HM-CFG-LAN, HM-MOD-UART-WIFI, HUE, HarmonyHub, JeeLink, CO20
Hyperion auf RPi Zero W, Sonos, viel Z-Wave und HM
alles per HomeKit steuerbar
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
Hi,
der erste einfachste Weg $FW_CSRF dran zu hängen klappt nicht.

Browser zeigt „keine Verbindung“.

Den Wert der Variable wenn ich auf den Link „mousehover“ mache oder sage „Link kopieren“ um diesen sichtbar zu machen.

Gruß


Gesendet von iPhone mit Tapatalk Pro
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline Otto123

  • Hero Member
  • *****
  • Beiträge: 12498
  • schon mal restore trainiert?
    • Otto's Technik Blog
Also ich habe mal getestet, der Code in der FHEM Kommandozeile
{my $button_test = "<a href='http://localhost:8083/fhem?cmd=set%20Office%20on$FW_CSRF'>test</a>"} führt zu
<a href='http://localhost:8083/fhem?cmd=set%20Office%20on&fwcsrf=csrf_387849633005507'>test</a>Sieht eigentlich gut aus. Ich war kurz unsicher wegen der Variablenauflösung, aber das klappt offenbar.
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
@Otto,
Ja der Code wird richtig aufgelöst. Er zeigt bei mir auch das selbe an.

Wenn ich den Code in das Perl Modul einbette, so erhalte ich vom Browser, keine Verbindung.

Sollte dieser Weg absolut fehlschlagen über den „Link“ so bleibt vermutlich noch via SCRIPT die onclick Variante aber da bin ich nicht Form genug.


Gesendet von iPhone mit Tapatalk Pro
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
Bisher ist mir noch kein positives Ergebnis gelungen.

Ich frage mich, ob die von mir bisher genutzte Variante überhaupt „optimal“ ist oder um dies ggf über einen anderen Weg zu lösen.

Wie ist eure Meinung diesbezüglich oder Herangehensweise? Sollte die Umstellung dennoch mit den von mir genutzten Weg funktionieren oder ist das nicht möglich weil ich den „Link als Schalter“ missbrauche für einen Befehl?


Gesendet von iPhone mit Tapatalk Pro
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3955
  • Wer anderen eine Bratwurst brät...
Wie ist eure Meinung diesbezüglich oder Herangehensweise? Sollte die Umstellung dennoch mit den von mir genutzten Weg funktionieren oder ist das nicht möglich weil ich den „Link als Schalter“ missbrauche für einen Befehl?

Für was Du das "missbrauchst" ist eigentlich völlig egal.
Ich benutze es beispielsweise um in einem Modul in JavaScript beim Klick ein Reading zu schreiben.

Gruß
Dan
FHEM 5.9, Brix, VIVO mini, RPi3, Debian Jessie, ZME_UZB1
HM-CFG-LAN, HM-MOD-UART-WIFI, HUE, HarmonyHub, JeeLink, CO20
Hyperion auf RPi Zero W, Sonos, viel Z-Wave und HM
alles per HomeKit steuerbar
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
Hallo,

ich habe nun einiges mal probiert und auch anstatt der Linkumsetzung ein

<INPUT type=\"reset\" onclick=\"FW_cmd('/fhem?XHR=1&cmd.$ ....> Button
Ich erhalte immer wieder die Nachricht.

2019.04.15 19:49:22 3: FHEMWEB WEB CSRF error:  ne csrf_154406050157807 for client WEB_
Wie kann ich das lösen, oder wobei ist mein Fehler? Ich hantiere oftmals mit verschiedenen Browserfenstern.
Die o.g. csrf_154406050157807 entspricht auch dem Attribut unter WEB - CSRFTOKEN.

MfG

EDIT: nun erhalte ich nach dem Neustart von FHEM auch nur diese Nachricht  :o
« Letzte Änderung: 15 April 2019, 20:15:05 von HomeAuto_User »
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
Hallo Mitstreiter,

ich habe bei einem ähnlichen Fall mit der Problematik des $FW_CSRF zu kämpfen.

FW_cmd(FW_root+ \'?XHR=1&cmd={SIGNALduino_TOOL_FW_updateData("'.$name.'","\'+String(allVals)+\'","'.$hash.'")}\');
bringt mir

2019.05.18 00:17:06 3: FHEMWEB WEB CSRF error:  ne csrf_309628872646964 for client WEB_192.168.2.4_59701 / command {SIGNALduino_TOOL_FW_updateData("SIGNALduino_TOOL","P92. For details see the csrfToken FHEMWEB attribute.
Wo binde ich richtigerweise den $FW_CSRF ein um diese Fehlermeldung nicht mehr zu erhalten?
Es steht ja meist beschrieben, das man dies hinter das Kommando setzen soll.

Erbitte Hilfe. MfG
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline Otto123

  • Hero Member
  • *****
  • Beiträge: 12498
  • schon mal restore trainiert?
    • Otto's Technik Blog
Moin,

ich komme mit Deinem String und den ganzen "') usw. nicht klar - aber die $FW_CSRF enthält alles was Du brauchst, diese muss einfach ans Ende von Deinem String/url. Also hinter Deine }
Versuch, aber ich verstehe wirklich Dein Konstrukt nicht.
FW_cmd(FW_root+ \'?XHR=1&cmd={SIGNALduino_TOOL_FW_updateData("'.$name.'","\'+String(allVals)+\'","'.$hash.'")}"'.$FW_CSRF.'"\');
Gruß Otto
« Letzte Änderung: 18 Mai 2019, 08:55:07 von Otto123 »
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 488
Hallo @Otto / @Rudi,

ich habe nun weiter mal die Fehlerursache ergründet und kam auf folgende Erkenntnis.

Beim Code
FW_cmd(FW_root+ \'?XHR=1&cmd={SIGNALduino_TOOL_FW_updateData("'.$name.'","\'+String(allVals)+\'","'.$hash.'")}\');welcher als Script geschrieben ist in der Sub FW_Detail übergebe ich den Namen und eine Variable welche mir Java zusammenbaut.

Sobald in der Variable eine Raute # erscheint bei meinem String, so erscheint

2019.05.22 18:09:37 3: FHEMWEB WEB CSRF error:  ne csrf_341641007257101 for client WEB_192.168.2.4_51839 / command {SIGNALduino_TOOL_FW_updateData("SIGNALduino_TOOL","P13.1. For details see the csrfToken FHEMWEB attribute.
Gegenprobe ohne das ich meinen Code verändert habe. Da funktionieren Bsp. folgende Strings

s4F038300.reading.LastActionTime,s4F038300.reading.mode,s4F038300.reading.other,s4F038300.internal.NAME,s4F038300.internal.DEF,s4F038300.textfield_devicename.ABS700,s4F038300.textfield_comment.,s4F038300.textfield_user.SD_Protocol
s916001A0A000.reading.battery,s916001A0A000.reading.channel,s916001A0A000.reading.mode,s916001A0A000.reading.other,s916001A0A000.internal.NAME,s916001A0A000.internal.DEF,s916001A0A000.textfield_devicename.Prologue,s916001A0A000.textfield_comment.,s916001A0A000.textfield_user.SD_Protocol

und zum reproduzieren zum Fehler führen Bsp. diese Strings

P7#6300C6F0B.reading.absFeuchte,P7#6300C6F0B.reading.dewpoint,P7#6300C6F0B.reading.humidity,P7#6300C6F0B.reading.temperature,P7#6300C6F0B.internal.NAME,P7#6300C6F0B.internal.DEF,P7#6300C6F0B.textfield_devicename.EAS800z,P7#6300C6F0B.textfield_comment.,P7#6300C6F0B.textfield_user.SD_Protocol
P13.1#CBFAD2.reading.alarmcounter,P13.1#CBFAD2.reading.lastReceive_ID,P13.1#CBFAD2.internal.NAME,P13.1#CBFAD2.internal.DEF,P13.1#CBFAD2.textfield_devicename.FA22RF,P13.1#CBFAD2.textfield_comment.,P13.1#CBFAD2.textfield_user.HomeAuto_User

Wenn man sich die Fehlermeldung auch immer ansieht, so ist diese mit Beginn der Raute "gekappt" obwohl dort der String weitergeht.

Muss man Rauten # besonders behandeln in JavaScript oder gibt es dort Sonderzeichen welche speziell behandelt werden müssen oder ist dies vielleicht ein Umsetzungsfehler?

MfG

EDIT:
Moin,

ich komme mit Deinem String und den ganzen "') usw. nicht klar - aber die $FW_CSRF enthält alles was Du brauchst, diese muss einfach ans Ende von Deinem String/url. Also hinter Deine }
Versuch, aber ich verstehe wirklich Dein Konstrukt nicht.
FW_cmd(FW_root+ \'?XHR=1&cmd={SIGNALduino_TOOL_FW_updateData("'.$name.'","\'+String(allVals)+\'","'.$hash.'")}"'.$FW_CSRF.'"\');
Gruß Otto
Das bringt auch kein Erfolg und "weist" auch immer wieder hin, das mit # der Fehler auftritt.

EDIT 2:
hier steht der Hinweis mit der #und Java
https://support.google.com/richmedia/answer/190941?hl=de


Man muss bei einem String mit # in Java sehr aufpassen  ::) Vielleicht sollte man oder kann man solche Hinweise verankern in der Wiki.  :o
Umkehrschluss ist, wenn man eine # nicht wie im Hinweis "ersetzt durch %23" , so bringt das Fonted eine Fehlermeldung wobei man sich sehr in die Irre führen lassen kann!
« Letzte Änderung: 22 Mai 2019, 18:34:18 von HomeAuto_User »
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

 

decade-submarginal