Ajax überträgt vermeintlich falsch ohne Fehlermeldung (Zeichenkodierung)

Yogilein

Member
Hi,

ich habe einen verschlüsselten String, den ich per Ajax an den Server übertragen möchte.

Der String lautet:

ùE׸4½wâ+\ðF#¹‹eQ·>a›¢‘r@*.ö=™¹”3 §@3¶m{LÖLOÎ:XOÍ‹™Æ‚

Ankommen tut aber dies:

ùE׸4½wâ \ðF#¹‹eQ·>a›¢‘r@*.ö=™¹”3 §@3¶m{LÖLOÎ:XOÍ‹™Æ‚

Wie man sieht, fehlt das "+"-Zeichen an der 9. Stelle.

Mein Testcode:

Code:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>
<body>
<script>
if(window.XMLHttpRequest){
request=new XMLHttpRequest();}
else
if(window.ActiveXObject){
try{
request=new ActiveXObject('Msxml2.XMLHTTP');}
catch(e){
try{
request=new ActiveXObject('Microsoft.XMLHTTP');}
catch(e){}}}
grund="ùE׸4½wâ+\ðF#¹‹eQ·>a›¢‘r@*.ö=™¹”3	§@3¶m{LÖLOÎ:XOÍ‹™Æ‚";
var url = "https://www.yogifotos.de/Shoutbox/shoutbox_schreiben.php";
request.open('post',url,true);
request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
request.send('&grund='+grund);
</script>
</body>
</html>

Code:
<?php
header("Content-Type:text/html;charset=utf-8");
header('Cache-Control:must-revalidate,pre-check=0,no-store,no-cache,max-age=0,post-check=0');
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST');
$datei="Test";
$dat=fopen($datei,'a');
if(!is_resource($dat))exit();
if(!flock($dat,LOCK_EX))exit();
$text=substr($_POST["grund"],0,3000);
if($text!=="ùE׸4½wâ+\ðF#¹‹eQ·>a›¢‘r@*.ö=™¹”3	§@3¶m{LÖLOÎ:XOÍ‹™Æ‚")fwrite($dat,"Schitt");
flock($dat,LOCK_UN);
fclose($dat);
header("Content-Type:$ct");
?>

Ich lasse extra in PHP einen Vergleich machen, um auszuschließen, dass der fwrite-Befehl den Fehler verursacht. Es kommt definitiv falsch in der PHP-Datei an. Was kann ich also tun? Ich habe schon mit verschiedenen Headern (beim Request und in der PHP-Datei) experimentiert, aber immer erhalte ich das gleiche Ergebnis.

Der String oben ist nur ein Beispiel. Auch andere verschlüsselte Strings werden falsch übertragen.

Liegt es am Zeichensatz, wer kann helfen?

- - - Aktualisiert - - -

Anders herum geht es. Hole ich den (auf dem Server korrigierten) String mit responseText auf die HTML-Seite zurück, wird er richtig übertragen. Liegt es daher evtl. am $_POST?

- - - Aktualisiert - - -

Ich bin noch ein bisschen weitergekommen. Mit encodeURIComponent() funktioniert jetzt dieses Beispiel. Allerdings werden größere Strings damit auch nicht richtig übertragen. Wobei ich das mit encodeURIComponent() nicht verstehe, denn eigentlich übertrage ich einen Binärstring, der lediglich auf dem Server abgespeichert werden soll.

Daher meine präzisere Frage: Wie übertrage ich mit Ajax einen binären String?
 
Zuletzt bearbeitet von einem Moderator:
AW: Ajax überträgt falsch ohne Fehlermeldung

escape() steht - wahrscheinlich aus diesem Grund - auf der Abschussliste, siehe https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/escape

encodeURIComponent() ist genau richtig und serverseitig muss es als UTF-8 behandelt werden. Das heißt wenn dein Ziel (also die DB oder eine Datei oder eine HTML-Seite oder ein Script oder was auch immer) nicht UTF-8 ist muss es entweder schon beim Speichern oder später bei der Ausgabe konvertiert werden. Meistens arbeitet man mehr oder weniger bewusst ganz oder auch gern teilweise in einer latin1/ISO-8859-1x Umgebung.

Du darfst zu 100 % davon ausgehen, dass encodeURIComponent() alles richtig und vollständig überträgt, der Fehler liegt später.

Es kommt definitiv falsch in der PHP-Datei an.
Nein tut es nicht. Zeig' mal Code. Schaust du mit einem Hex-Editor in die Datei?

P. S.: <meta charset="utf-8" /> nützt nur dann, wenn der Code auch UTF-8 ist. In welchem Editor hast du die Testdatei erstellt und in welcher Kodierung?
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Die Erfassung der Daten erfolgt über ein Input-Feld und es funktioniert in allen Tests, wenn ich die Daten unverschlüsselt sende.

Sobald ich Daten verschlüssle, kommen entweder falsche Daten (in dem einen Beispiel ein Leereichen statt einem Pluszeichen) oder fast überhaupt keine Daten an, wenn die Quelldaten etwas größer sind.

An der Verschlüsselung liegts eigentlich nicht, denn in allen Tests kann ich die Daten fehlerfrei entschlüsseln, wenn ich sie nicht vorher auf den Server übertagen habe, also:

daten="Dies ist ein kleiner Test";key="123456";
x=verschluessel(daten,key);
ausgabe=verschluessel(x,key);

ergibt zu 100 %: "Dies ist ein kleiner Test";

In meinem Test habe ich im PHP-Programm den zu erwartenden String eingefügt und vergleiche diesen dann mit dem empfangenen. Unverschlüsselt stimmt immer alles. Verschlüssselt kann man sagen, dass ab einer bestimmten Größe es grundsätzlich nicht mehr stimmt.

Ich habe auch folgenden Test gemacht:

Ich habe den verschlüsselten String direkt in die HTML-Datei eingefügt, denn per Ajax an die PHP-Datei gesendet und mit dem ebenfalls eingefügten String verglichen. Ergebnis: Nicht identisch.

Bei meiner Verschlüsselung wird mit einer Zufallszahl gexort. Ich habe aber auch schon mit einer RC4_crypt-Verschlüsselung gearbeitet, mit exakt demselben Ergebnis.

Und wie gesagt, der Fehler tritt vor dem Speichern auf. Gespeichert wird dann auch exakt das, was in PHP angekommen ist. Ich speichere übrigens in einer ganz normalen Datei per "fwrite".

PS: Welchen Code möchtest du sehen, ich habe doch alles bereits hochgeladen. In PHP lese ich mit "$text=substr($_POST["grund"],0,3000);" den übergebenen String aus und speichere ihn ohne weitere Bearbeitung ab.
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Ich glaube du hast keine einzige Frage beantwortet. Und ich meine den PHP Code mit dem du die Daten aus JS übernimmst ($text=... ist ja nicht alles) und wie du sie später ausgibst.

Im übrigen: substr($_POST["grund"],0,3000)
Die Frage warum große Dateien nicht funktionieren war hoffentlich ein Joke?
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Sorry, jetzt verstehe ich nicht, was ich noch angeben soll.

Daher mal ganz von vorn:

Per Formularfeld (input) wird ein Text erfasst. Dieser Text wird anschließend verschlüsselt und per $_POST an PHP versendet. Dort wird er ohne weitere Bearbeitung in eine Datei geschrieben. Ein anderer User liest diesen Text dann aus, indem der Inhalt der Datei in HTML per "responseText" abgeholt und entschlüsselt wird. Dieser Schritt funktioniert zu 100 % (wenn zuvor das Richtige abgespeichert wurde).

Mit großen Daten meinte ich, wenn man z. B. mehr als 20 Wörter eingibt. Sorry für die missverständliche Ausdrucksweise. Bei "kleinen" Daten, als z.B. bei nur einem Wort, hat dagegen bis jetzt alles funktioniert. Und "große" Daten funktionieren auch zu 100 %, wenn ich sie unverschlüsselt übertrage.

Ich xore übrigens den Text buchstabenweise mit einem Zeichen aus dem Bereich von 0 bis 255. Können dadurch nicht übertragbare Zeichen entstehen?

Mein Beispielscode (HTML + PHP) ist eigentlich genau das was ich mache und er erzeugt, zumindest bei mir, genau den beschriebenen Fehler.
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Ohne die Antworten auf meine Fragen kann ich nichts weiter für dich tun.
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Wenn das die Fragen sind:

Erstellt in UTF-8 mit Notepad++. Abweichung mit Notepad++ im Modus HEX-Editor überprüft.
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Zeig' mal die Hexeditor Ansicht vom Testscript und der Datei mit den angeblich falschen Zeichen.

Und ich weiß nicht ob es ein Joke war aber das substr schneidet alles jenseits von 3000 Byte ab. Daher funktionieren große Dateien nicht. Wer hat das denn in den Code geschrieben, wenn du es nicht warst und welchem Zweck dient das?
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Jetzt verstehe ich gerade die Welt nicht mehr. Ich wollte gerade die HEX-Dateien mit dem Code von gestern erstellen und muss feststellen, dass der Fehler weg ist. Hallo, es ist der gleiche und absolut unveränderte Code, der gestern den Fehler fabriziert hat. Kann das ein Serverproblem gewesen sein???

Was jetzt noch auf Fehler gelaufen ist, ist decodeURIComponent, wenn ein falscher Schlüssel zum entschlüsseln gewählt wurde. Das kann ich aber mit "try" verhindern.

Auf jeden Fall danke für deine Hilfe. Ich hatte übrigens schon eine Variante gecodet, die nicht die Zeichen überträgt, sondern den Zeichencode + jeweils ein Trennzeichen. Damit hat es dann auch geklappt, auch ohne encodeURIComponent, da ja nur Zahlen mit Bindestrichen übertragen wurden.
 
AW: Ajax überträgt falsch ohne Fehlermeldung

Kann das ein Serverproblem gewesen sein???
Nein. Wahrscheinlicher ist, dass alle Komponenten es in dem ganzen Gewurschtel am Ende richtig behandeln, nämlich als UTF-8.

Man muss dabei immer bedenken, dass die Zeichen sich nach dem Absenden nicht mehr "automatisch" ändern. Nur die Umgebung kann sich ändern. Z. B. wenn du die Daten auf der anderen Seite einem anderen User an den Browser schickst und dieser Browser aufgrund deines falschen Headers "denkt", dass er latin1 vor sich hat und das natürlich knallt, wenn Zeichen außerhalb der Gemeinsamkeiten (von A-Z und 0-9 usw.) enthalten sind.

Das ist das Einzige was man sich in Sachen Zeichenkodierung klar machen und unbedingt merken muss. Das braucht man nämlich in der IT überall.
 
Zurück
Oben