FHEM Forum

FHEM => Sonstiges => Thema gestartet von: HomeAuto_User am 11 April 2019, 11:56:24

Titel: [hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Java und #
Beitrag von: HomeAuto_User am 11 April 2019, 11:56:24
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 (https://wiki.fhem.de/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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: DeeSPe am 11 April 2019, 12:12:25
Wie soll dieser Code verwendet werden?
Innerhalb oder außerhalb von FHEM?
Soll das Perl Code werden?

Gruß
Dan
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: HomeAuto_User am 11 April 2019, 12:35:05
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: DeeSPe am 11 April 2019, 13:05:09
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: Otto123 am 11 April 2019, 13:32:36
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: DeeSPe am 11 April 2019, 13:58:31
Zitat von: Otto123 am 11 April 2019, 13:32:36
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: HomeAuto_User am 11 April 2019, 14:59:03
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: Otto123 am 11 April 2019, 15:30:37
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.
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: HomeAuto_User am 11 April 2019, 15:40:14
@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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: HomeAuto_User am 12 April 2019, 12:45:58
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: DeeSPe am 12 April 2019, 12:57:58
Zitat von: HomeAuto_User am 12 April 2019, 12:45:58
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 (https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/22_HOMEMODE.pm#L3542).

Gruß
Dan
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: HomeAuto_User am 15 April 2019, 19:52:24
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: HomeAuto_User am 18 Mai 2019, 00:24:46
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: Otto123 am 18 Mai 2019, 08:47:12
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
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Hilfe benötigt
Beitrag von: HomeAuto_User am 22 Mai 2019, 18:20:30
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:
Zitat von: Otto123 am 18 Mai 2019, 08:47:12
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!
Titel: Antw:[hilfreich] - csrfToken Problematik - Linkanpassung auf "NEU" - Java und #
Beitrag von: rudolfkoenig am 25 Mai 2019, 16:17:30
Java und JavaScript sind unterschiedliche Sprachen, und die Programmierer der jeweiligen Sprache haben meist Probleme mit der anderen Sprache.
Ist ein bisschen so wie mit den Religionen, deswegen bitte nicht verwechseln.

Das # Zeichen ist weder in Java, noch in JavaScript was Besonderes, aber im URL: da bezeichnet man mit # den Anchor (Sprungmarke).
Der Browser sendet das URL nur bis zum ersten # an dem Server (in diesem Fall FHEM), und springt zu diese Marke im zurueckgelieferten Dokument.
Bei solchen Aufgaben empfehle ich zunaechst in der JavaScript-Console des Browsers zu ueben (s.u.), und wen alles klappt, den Code nach Perl zu transportieren und dabei je nach verwendete Perl Methode die notwendigen Zeichen zu quoten.

Beispiel fuer JS (ich habe die Zeilen mit FW_cmd eingegeben, der Rest ist Antwort bzw Nachricht von FHEM):FW_cmd(FW_root+"?cmd=attr global comment x%23y&XHR=1", console.log)
undefined
15:58:01.434 Rcvd: ["#FHEMWEB:w_127.0.0.1_61542","$('#saveCheck').css('visibility','visible')",""]

FW_cmd(FW_root+"?cmd=list global comment&XHR=1", console.log)
global                   x#y