Socket datenübertragung Zeichensatz falsch?

  • Antworten:9
  • OffenNicht stickyBentwortet
Gelöschter Account
  • Forum-Beiträge: 47

18.05.2017, 14:17:07 via Website

Hallo, ich übertrage bytes vom client, zum server.
Diese bytes werden in ein int umgewandelt, dieser int spiegelt die Zahl oder besser gesagt Nummer des zugehörigen Zeichens(UTF-8). Nur mein Problem ist das ich dieses Zeichen als Int gespeichert nicht in einen String umwandeln kann. Hat jemand eine Idee wie man das kann?

Server:

private String readDataCarefully(int MAX_TRANS_SIZE)
{
    try
    {
        StringBuilder br = new StringBuilder();
        int c;
        int counter = 0;

        while((c = this.reader.read()) != -1)
        {
            System.out.println("Reading.");
            System.out.println("ZAHL: " + c);

            if(counter <= MAX_TRANS_SIZE)
            {
                System.out.println("DATA: " + c);
                //Hier würde ich gern aus dem c ein zeichen bekommen.
            }
            else
            {
                System.out.println("TOO MUCH...!!");
                break;
            }

            if(counter == MAX_TRANS_SIZE)
            {
                break;
            }

            counter++;
        }

        System.out.println("MSG: " + br.toString());
        return br.toString();
    }
    catch(Exception ec)
    {
        System.out.println("Exception reading data(): " + ec);
        return null;
    }
}

Client:

 BufferedReader reader = new BufferedReader(new InputStreamReader(loginSocket.getInputStream()));
            OutputStream writer = (loginSocket.getOutputStream());

            writer.write("aäa".getBytes());

Mein Hauptziel ist es Byte für Byte zu übertragen, um die die Daten dann mitzählen zu können.

Antworten
  • Forum-Beiträge: 2.907

18.05.2017, 14:21:50 via Website

Hallo Subrim,

ich frage mich eben , warum du aus einem unsigned Byte ein Int machen möchtest.
(wir haben eh nur 256)

Und vor allem , warum du byte für byte übertragen möchtest ( um mitzuzählen), wenn der BufferRead
(length) dir bereits die Anzahl der Übertragenen ausgibt.

— geändert am 18.05.2017, 14:39:18

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

18.05.2017, 14:43:10 via Website

Ja aber ich will das ja begränzen. Wenn mein Server nur 5 Zeichen braucht dann soll nicht jemand 500 schicken(Hacker).

Antworten
  • Forum-Beiträge: 2.907

18.05.2017, 14:47:26 via Website

Du kannst das nur Sicherstellen, wenn du nach der Vorgehensweise arbeitest,
wie ich dir bereits erklärt habe.

https://www.androidpit.de/forum/742830/java-socket-readline-was-passiert

Das was du verhindern willst, ist ein sogenanntes "Fork-Flood" auf Sockets und das ist nun mal die
Vorgehensweise bei Daemons.

Alles Andere ist Murks

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

18.05.2017, 14:54:17 via Website

Wie Splitte ich diese Blöcke? Ich hab mich ehrlich gesagt nicht lang mit dem Thema Sockets befasst.
Ich weiß nicht wie am halt Daten sicher überträgt. Mein Server soll halt ein Kommando erhalten und das dann ausführen und geg. eine antwort zurückschicken. Es hat alles geklappt nur halt bis auf die Codierung und das was ich da bemerkt hab mit dem "Fork-Flood".

Antworten
  • Forum-Beiträge: 2.907

18.05.2017, 15:02:30 via Website

Sorry, ich wusste halt nicht , dass du in diesem Bereich noch gar nichts gemacht hast.

Ich kann auch jetzt keine tiefgründige Einweisung geben, aber das Essentielle :

Um dieses "Überfluten" zu verhindern, sollte der Server/Client immer in einem "Gültigkeits" -Austausch stehen.
Also wenn A was schickt, sollte B es auf Gültigkeit überprüfen - ggf. was zurückschicken ( Handshake)
Stimmt das nicht überein , wird z.b. die Verbindung /Socket sofort gekappt.- ggf die IP gesperrt.

Damit man sowas Realisieren kann, bildet man Datenblöcke, die vor den eigentlichen Daten dann noch nur dir bekannte Parameter enthält. ( z.b. eine Prüfsumme, eine Header Ident-ID, verschlüsselt etc etc ) oder was einem dazu auch noch einfällt .

Das wäre dann mal die Aldi Lösung

— geändert am 18.05.2017, 15:12:15

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

18.05.2017, 15:17:15 via Website

Ja aber das Problem ist diese Parameter kann man doch durch reverse engineering auslesen?
Was ich momentan Programmiere ist ein App Server und die dazugehörige App.

Wenn ich jetzt mit bufferedWriter.write("String", 0, 6); daten verschicke, und mit bufferedReader.read(buffer, 0, 6) die Daten empfange, kann man doch das manipulieren indem man einfach mehr Daten als angegeben schickt oder nicht?

Antworten
  • Forum-Beiträge: 2.907

18.05.2017, 15:25:20 via Website

Ja aber das Problem ist diese Parameter kann man doch durch reverse engineering auslesen?

Ja klar, auch bei deiner Vorgehensweise - deshalb habe ich ja auch die "Aldi" Lösung erwähnt.

Deine Lösung erkennt allerdings gar nicht , ob etwas manipuliertes vorliegt .
Du musst also etwas einbauen , was den Empfänger veranlassen kann, die Gültigkeit zu erkennen.

Und je mehr Verschlüsselungen Du in den Block einbaust ( z.b. AES 128/256) desto schwerer wird es ein "reverse engineering" geben.

Und dann kannst du noch einen draufsetzen und den Server vorher noch um einen gültigen Schlüssel bitten,
damit du mit diesem Schlüssel die Daten an ihn schickst .
Und der reagiert dann nur auf das ihm Bekannte.

Bei AES kommen wir dann schon an die Grenze des nicht knackbaren ran, auch wenn der Code vorliegen würde

— geändert am 18.05.2017, 15:27:05

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

18.05.2017, 15:49:33 via Website

Vielen dank. Ich habs jetzt selber gelöst.
Also meine methode funktioniert jetzt, ich hab einfach die locales von meinem server geändert und dadurch erkennt er auch den charset. Danke dir trotzdem und für die schnellen Antworten!!

swa00

Antworten

Empfohlene Artikel