Hallo zusammen (mein erster Post )
ich bin mir nicht sicher wo ich diese Frage platzieren soll, ich hoffe aber hier ist sie am ehesten passend.
Ich erstelle ein internes Tool und muss zu dem Zweck verschiedene Dateninhalte beim Nutzer abfragen. Das ganze wird in php (ohne Framework weil ich kein geeignetes gefunden habe) auf der Server-Seite passieren und auf Client-Seite mit jquery, Javascript, HTML und der MetroUI für die Oberfläche.
Soweit klappt auch alles ganz hervorragend - allerdings stolpere ich bei einem sehr speziellen Inhalt über die "backslashes" der eingegebenen Daten.
Die Datenbank ist eine mariaDB/mySQL mit einigen Tabellen. Die Tabellenstruktur ist soweit recht klein gehalten - ein paar Felder zur Verwaltung und ein "großes" Feld für die Einstellungen, was der Nutzer konfiguriert hat. Die Anzahl der möglichen Variablen für die Konfiguration ist variabel und jede darf ein unterschiedlichen Namen tragen. Ziel der ganzen Variablen ist ein Linux Befehl, der dann an einen Server geschickt wird und ein Prozess angestoßen wird.
Ein Teil der Variablen kann nun UNC Pfade beinhalten - z.B,. in der Art: \\meinServer\Freigabe\Ordner\zum\Ziel\eineDatei.tx t
Im HTML Formular nutze ich dazu ein normales Text-Input-Feld.
Die Datenübertragung an das php Script für die Eintragung in der Datenbank wird mit einer JS Funktion angestoßen. Aus einem JS Array lese ich alle benötigten Feld-Namen aus, hole mir die aktuell gesetzten Variablen und baue daraus ein PHP fertigen Variablen String zusammen:
der ge-Postete Datenstrom sieht dann so aus:
PostData => "$data['FeldnameInDB']['subParameter'] = array('use' => '1', 'val' => '\meinServer\Freigabe\Ordner\zum\Ziel\eineDatei.tx t');"
=> Fehler 1 - der doppelte Backslash wurde geschluckt; Javascript ist nicht zu überreden diesen mitzunehmen
auf dem Server wird alles an ein php Script übergeben.
=> Fehler 2. - ich muss den string evaluieren (eval) - find ich sehr ungünstig - aber nur so sehe ich auf dem Server was der Nutzer alles für Parameter eingestellt hat, weil ich per foreach da recht gut durchgehen kann.
um die Daten im Datenbank Feld abzulegen mache ich daraus ein json_encode($data['FeldnameDB']) - auch wenn ich explizit an der Stelle ein doppelten Backslash gesetzt ist, schluckt hier json_encode einen davon
=> Fehler 3 und 4 - der doppelte Backslash wird von json_encode geschluckt - und die Datenbank schluckt auch einen davon
Beim Testing habe ich an allen Stellen natürlich händisch jeweils einen weiteren hinzugefügt um weitermachen zu können.
Beim Lesen der Daten wiederum selektiert php den Datensatz
=> doppelter Backslash ist noch drin
Um daraus wieder eine PHP Variable zu machen also ein json_decode($data, TRUE) damit ich ein assoziatives Array bekomme und kein Objekt
=> Fehler 5a - ein Backslash ist weg
=> Fehler 5b - json erzeugt einen Fehler und es gibt ein NULL objekt zurück
Andere Werte mit einem einfachen Backslash oder auch Umlauten drin werden geschluckt.
Ich weiss, daß der Backslash eine Escape Sequenz in nahezu allen Sprachen bedeutet. Ich kann mir aber nicht vorstellen, daß ich der erste bin, der darüber stolpert.
Also liebe Gemeinde - was tun?
In jeder Sprache habe ich separate Möglichkeiten dieses Problem zu beheben - das ist mir bewusst, aber wie komme ich den ganzen Weg hin und zurück?
(html) -> input mit \\
(js) -> Zusammensetzen der Variablen für httpd-post - in Form von PHP Variablen Definition
(php) -> Post Variable als json umcodieren
(json) -> Dateninhalt zur mariaDB
(mariaDB) -> in Feld speichern
(php) -> Datenbank Inhalt lesen
(json) -> zurück in PHP Variable codieren
(html) -> Wert zurück in HTML Seite
Alle Ideen sind willkommen - Dankeschön!
Ich hab nun 2x editiert - bei der TXT wird das letzte "t" immer abgetrennt - und der Rest fehlte hier noch.
Was mir noch einfällt - es gibt natürlich auch Konstruktionen wo im Pfad ein \test oder ein \neueDatei eingetragen werden kann - diese dürfen natürlich nicht als Tabulator oder "new line" interpretiert werden.
ich bin mir nicht sicher wo ich diese Frage platzieren soll, ich hoffe aber hier ist sie am ehesten passend.
Ich erstelle ein internes Tool und muss zu dem Zweck verschiedene Dateninhalte beim Nutzer abfragen. Das ganze wird in php (ohne Framework weil ich kein geeignetes gefunden habe) auf der Server-Seite passieren und auf Client-Seite mit jquery, Javascript, HTML und der MetroUI für die Oberfläche.
Soweit klappt auch alles ganz hervorragend - allerdings stolpere ich bei einem sehr speziellen Inhalt über die "backslashes" der eingegebenen Daten.
Die Datenbank ist eine mariaDB/mySQL mit einigen Tabellen. Die Tabellenstruktur ist soweit recht klein gehalten - ein paar Felder zur Verwaltung und ein "großes" Feld für die Einstellungen, was der Nutzer konfiguriert hat. Die Anzahl der möglichen Variablen für die Konfiguration ist variabel und jede darf ein unterschiedlichen Namen tragen. Ziel der ganzen Variablen ist ein Linux Befehl, der dann an einen Server geschickt wird und ein Prozess angestoßen wird.
Ein Teil der Variablen kann nun UNC Pfade beinhalten - z.B,. in der Art: \\meinServer\Freigabe\Ordner\zum\Ziel\eineDatei.tx t
Im HTML Formular nutze ich dazu ein normales Text-Input-Feld.
Die Datenübertragung an das php Script für die Eintragung in der Datenbank wird mit einer JS Funktion angestoßen. Aus einem JS Array lese ich alle benötigten Feld-Namen aus, hole mir die aktuell gesetzten Variablen und baue daraus ein PHP fertigen Variablen String zusammen:
der ge-Postete Datenstrom sieht dann so aus:
PostData => "$data['FeldnameInDB']['subParameter'] = array('use' => '1', 'val' => '\meinServer\Freigabe\Ordner\zum\Ziel\eineDatei.tx t');"
=> Fehler 1 - der doppelte Backslash wurde geschluckt; Javascript ist nicht zu überreden diesen mitzunehmen
auf dem Server wird alles an ein php Script übergeben.
=> Fehler 2. - ich muss den string evaluieren (eval) - find ich sehr ungünstig - aber nur so sehe ich auf dem Server was der Nutzer alles für Parameter eingestellt hat, weil ich per foreach da recht gut durchgehen kann.
um die Daten im Datenbank Feld abzulegen mache ich daraus ein json_encode($data['FeldnameDB']) - auch wenn ich explizit an der Stelle ein doppelten Backslash gesetzt ist, schluckt hier json_encode einen davon
=> Fehler 3 und 4 - der doppelte Backslash wird von json_encode geschluckt - und die Datenbank schluckt auch einen davon
Beim Testing habe ich an allen Stellen natürlich händisch jeweils einen weiteren hinzugefügt um weitermachen zu können.
Beim Lesen der Daten wiederum selektiert php den Datensatz
=> doppelter Backslash ist noch drin
Um daraus wieder eine PHP Variable zu machen also ein json_decode($data, TRUE) damit ich ein assoziatives Array bekomme und kein Objekt
=> Fehler 5a - ein Backslash ist weg
=> Fehler 5b - json erzeugt einen Fehler und es gibt ein NULL objekt zurück
Andere Werte mit einem einfachen Backslash oder auch Umlauten drin werden geschluckt.
Ich weiss, daß der Backslash eine Escape Sequenz in nahezu allen Sprachen bedeutet. Ich kann mir aber nicht vorstellen, daß ich der erste bin, der darüber stolpert.
Also liebe Gemeinde - was tun?
In jeder Sprache habe ich separate Möglichkeiten dieses Problem zu beheben - das ist mir bewusst, aber wie komme ich den ganzen Weg hin und zurück?
(html) -> input mit \\
(js) -> Zusammensetzen der Variablen für httpd-post - in Form von PHP Variablen Definition
(php) -> Post Variable als json umcodieren
(json) -> Dateninhalt zur mariaDB
(mariaDB) -> in Feld speichern
(php) -> Datenbank Inhalt lesen
(json) -> zurück in PHP Variable codieren
(html) -> Wert zurück in HTML Seite
Alle Ideen sind willkommen - Dankeschön!
Ich hab nun 2x editiert - bei der TXT wird das letzte "t" immer abgetrennt - und der Rest fehlte hier noch.
Was mir noch einfällt - es gibt natürlich auch Konstruktionen wo im Pfad ein \test oder ein \neueDatei eingetragen werden kann - diese dürfen natürlich nicht als Tabulator oder "new line" interpretiert werden.
Kommentar