# Nur ASCII in URL, Umlautproblem bei Übertragung



## Milbo (30. Jan 2008)

Hallo,

ich habe folgendes Problem, ich habe einen Java-client, welcher Eigennamen und Nachnamen in eine mysql Datenbank schreibt.

Innerhalb meines Programmes benutze ich nur latin-1.

Momentan jage ich alles durch nen gebastelten Encoder

```
mySC = new ServerConnector();
String command = "?user_name="+mySC.encodeURL(nameOwner);
String buffer ="";
		
try {
	buffer = mySC.getHTMLText(protocol +adresse+seite+command,false);
} catch (Exception e) {
}
```

So in der Art halt,.. der ServerConnector sieht so aus

```
public class ServerConnector {
	
	public boolean verboseXML = false;
	public boolean verboseSQL = false;
	public String lastConnectorError = "";
	
	public String[][] URLENCODER={{"%","%25"},{"/","%2F"},{":","%3A"},
			{";","%3B"},{"=","%3D"},{"@","%40"},{" ","%20"},
			{"#","%23"},{"&","%26"}};
	
	ServerConnector() {
		
	}
	
	public String encode(String[][] encoder, String source){
		String out = source;
	    for (int i=0; i<encoder.length; i++){
			out = out.replaceAll(encoder[i][0],encoder[i][1]);
	    }
	    return out;
	}
	
	public String encodeXML(String source){
	    return encode(XMLENCODER, source);
	}
	
	public String encodeURL(String source){
	    return encode(URLENCODER, source);
	}
	
	public String getHTMLText(String url, boolean setCR) throws Exception{
		String output = "";
		URL site = new URL(url);
		URLConnection conn = site.openConnection();
		BufferedReader in = new BufferedReader(
		                        new InputStreamReader(
		                        conn.getInputStream()));
		String inputLine;

		while ((inputLine = in.readLine()) != null){ 
		    if (verboseXML) System.out.println(inputLine);
		    if (setCR)
		    	output += inputLine + "\n";
		    else
		    	output += inputLine;
		}
		return output;
	}
```


Wie man oben sehen kann wird alles per Hand umencodiert.

Ich habe mir überlegt, dass es da eigentlich irgendwas fertiges geben müsste, weil das ein Leerzeichen ein %20 wird, woher kommt das nochmal?
Also letzendlich haben sehr viele Leute das Problem, dass man nur ASCII übers Netz übertragen kann. Ich hab wenig Lust mir alle möglichen europäischen Sonderzeichen rauszusuchen und dann für jedes irgendeine Maskierung zu überlegen, ich denke das ist verständlich. 
Ich hab da auch schon mit getBytes rumgefummelt und verschiedenen Charsets, aber eigentlich gehts ja um latin-1 => ASCII und wieder zurück....

Ich hoffe mir kann jmd von euch helfen, sonst muss ich es halt doch manuell mir überlegen.

Grüße da Milbo[/code]


----------



## tuxedo (30. Jan 2008)

Stichwort: UrlEncode / UrlDecode ...

Aber was bastelst du denn da? Du willst von Java aus Daten in eine DB füttern und diese unterwegs via HTTP übertragen?

Schau dir da am besten mal meine Signatur an *wink*

- Alex


----------



## Milbo (30. Jan 2008)

alex0801 hat gesagt.:
			
		

> Stichwort: UrlEncode / UrlDecode ...


okey, dann werd ich mal danach im Forum suchen



			
				alex0801 hat gesagt.:
			
		

> Aber was bastelst du denn da? Du willst von Java aus Daten in eine DB füttern und diese unterwegs via HTTP übertragen?


Richtig, aber eigentlich über Https kann sein, dass ich dazu die nächste Frage stelle. Letztendlich ist das ganze ein Kopierschutzsystem. Es funktioniert auch schon wunderbar. Kram verschlüsselt in die Registry ablegen funktioniert auch.

Der letzte Rest, der fehlt ist der URLEncode/URLDecode und die Übertragung mit https.




			
				alex0801 hat gesagt.:
			
		

> Schau dir da am besten mal meine Signatur an *wink*
> 
> - Alex


Wenn ich die sehen täte :-( Bei mir wird keine angezeigt,.. oder meinst du die Links unter deinem Avatar?

Vielen Dank 

da Milbo


----------



## tuxedo (30. Jan 2008)

Korrekt, in diesem Forum ist die Signatur _links_

jPMdbc kann im übrigen auch HTTPS ...


----------



## Milbo (30. Jan 2008)

okey wunderbar

hab jetzt das nachgelesen, was du da gebaut hast. Allerdings habe ich das ja alles schon lol. Sicher nicht so schön allgemein ist halt nur fürn speziellen Fall. Ich hab mir mal das genommen:


```
public String encodeURL(String s){
      String result = null;
      try {
         result = URLEncoder.encode( encodeURL(s) ,"ISO-8859-1");
      } catch (UnsupportedEncodingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      return result;
   }
   
   public String decodeURL(String s){
      String result = null;
      try {
         result = decodeURL(URLDecoder.decode( s ,"ISO-8859-1"));
      } catch (UnsupportedEncodingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      return result;
   }
```

is genau das Stück, welches ich brauchte. allerdings wird bei mir der Fehler: java.lang.StackOverflowError geworfen


Zudem habe ich da noch fragen zu dieser Seite: https://jpmdbc.dev.java.net/source/...runk/jpmdbc/Howto_SSL_with_jPMdbc.txt?rev=250

Wenn ich das richtig verstanden habe, dann muss jeder client diese Prozedur machen? Das ist ja in meinem Fall nicht erwünscht.

In meinem Fall geht es 
1. um eine verschlüsselte Übertragung, damit nicht jeder mithören kann.   und
2. geht es um die Server authentifizierung. Bei einem KOpierschutzsystem muss ich von einem Böswilligen User ausgehen, daher muss ich das Certifikate mit reincoden, da es der Benutzer ja gerade nicht austauschen können soll.

Da frag ich mich an bissal wie das geht. Eigentlich müsste doch nur die Zeile 

```
URLConnection conn = site.openConnection();
```
Gegen eine andere ausgetauscht werden und irgendwo nen langer String oder bytefolge mitgeben bzw gesetzt werden als Schlüssel. Oben diese getHTMLText-Methode ist schön klein und schlank und macht bisher alles was ich brauche. Vorher kannte ich diese Methode nicht und habe 100 von Zeilen Code geschrieben für nen javaclient und server auf streambasis. An bissal übertrieben meinte mein Kumpel und gab mir obige Methode. Ich will jetzt nicht wieder den Fehler machen ewig irgendeinen Kram zu schreiben, den es schon längst fertig gibt ;-)

Es gibt ja sogar HttpsURLConnection aber irgendwie bekomme ich es nicht angeworfen.

Öhmm merke das ist gerade etwas offtopic, aber mir scheint alex0801 du bist gerade der richtige Spezialist für mein Problem

cyas da Milbo


Daher macht es glaube ich in meinem Falll nicht viel Sinn dein Packet zu nehmen. Wenn ich es vorher gesehen hätte, wäre es was anderes.


----------



## tuxedo (30. Jan 2008)

Du musst den "Aufwand" wie in der HowTo von mir nicht bei jedem CLient betreiben. Du musst das Zertifikat nur einmal in eine Keystore-File stecken und dann in deine JAR oder in dein Projekt reinbauen. Fertig. Das Projekt läuft dann auf jedem Rechner. Der Client/Nutzer muss die Prozedur also nicht selbst machen.
Du kannst die Keystore-File natürlich auch in binärer-Form, oder irgendwie serialisiert oder sowas in der Art im Quellcode verstecken. 

Letztendlich bleibt das ganze aber so oder so knackbar. Empfehle dir aber auch noch einen "Obfuscator" (google hilft) drüber laufen zu lassen. 

Wie ich das mit HTTPS gemacht habe, kannst du ja bei mit im Code nachlesen. die File PhpHandler ist hier ausschlaggebend. Sind nur wenige Zeilen ...

- Alex


----------



## Milbo (30. Jan 2008)

Jo genau

Ich wollte noch nen Code Obfuscator benutzen und den key irgendwie so verpacken, dass es nicht zu einfach zu erhalten ist.

Klar knackbar bleibst immer, aber ich sehe es so:

Wenn jmd mein Programm knackt, dann kanns mir wahrscheinlich egal sein, weil dann habe ich damit genug verdient, denn sonst wäre es zu unbekannt und unbedeutend (bzw schlecht) dass es eh keiner kennt oder knacken will. 
Es geht auch mehr darum ein Unrechtsbewusstsein zu erschaffen als es 100% sicher zu bekommen. Das is wie mit nem Fahrrad ohne Schloss  . Der Aufwand muss halt hoch genug sein, dass es sich für den normalen admin nicht lohnt.

Vielen Dank erstmal

Ahh,. .haste noch ne Idee zu dem java.lang.StackOverflowError ? Wirft er beim Encode :-( 

da MIlbo


----------



## tuxedo (30. Jan 2008)

Wie groß ist denn der String den du da encoden willst?

- Alex


----------



## Milbo (30. Jan 2008)

Es lag nicht an der Größe, sondern am Code,...

ich hab den Code von dir aus diesem ProjektThread, bei dem du dein jpmdbc gestartet hast, der war wahrscheinlich etwas älter, habs korrigiert und läuft jetzt. Den paste ich jetzt nochmal, falls mal später jmd sucht (so jmd wie ich sonst, hat nur den Begriff encodeURL nicht .


```
public String encodeURL(String s){
      String result = null;
      try {
      result = URLEncoder.encode(s ,"ISO-8859-1");
      } catch (UnsupportedEncodingException e) {
        System.out.println("UnsupportedEncodingException");
      }
      return result;
   }
   
   public String decodeURL(String s){
      String result = null;
      try {
         result = URLDecoder.decode( s ,"ISO-8859-1");
      } catch (UnsupportedEncodingException e) {
      	 System.out.println("UnsupportedEncodingException");
      }
      return result;
   }
```


Ich hab mir den code von jpmdbc geladen und mir die phpHandler angesehen.

Letztendlich sehe ich den Trick noch nicht, du machst ja auch nur 

```
_urlConn = _hostUrl.openConnection();
```

irgendwie find ich den https part nicht. Dein Projekt ist fett nur für meine Zwecke etwa um 95% überdimensionert ;-)

Wie mache ich hostUrl.openConnection mit ssl und übergebe den Schlüssel?

Naja immerhin heute das URL Encoden geschafft.

cya da Milbo


----------



## tuxedo (31. Jan 2008)

Stimmt, die HTTPS tauglichkeit war recht schnell implementiert... Musste nix großartig umstellen.

Arbeite nach wie vor mit UrlConnection.

Damit du eine HTTPS-URL Benutzen kannst, musst du den "keystore", also das einmalig erzeugte keyfile  (siehe hier)das das SSL-Zertifikat enthält, dem System beibringen:


```
// optional: If you want to use HTTPS:
		// the keystore which contains the certificate, 
		System.setProperty("javax.net.ssl.trustStore", "keystorefile");
```

In diesem Beispiel heißt die Datei "keystorefile" und liegt im Projekt-Root-Verzeichnis. 
Danach kannst du einfach so HTTPS benutzen.


----------



## Milbo (31. Jan 2008)

okey 

vielen Dank, ich glaube ich habs jetzt gecheckt. 

cya da Milbo


----------

