kostenloser Webspace werbefrei: lima-city


Android - PHP Script mit AsyncTask aufrufen

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    Hallo zusammen,

    ich bin gerade dabei eine Android App zu entwickeln. Man muss sich in der App einloggen und dafür rufe ich ein PHP Script auf, welches auf eine MySQL Datenbank zugreift.

    Ich benutze folgende AsyncTask Klasse:

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    	@Override
    	protected String doInBackground(String... urls) {
    		String response = "";
    		for (String url : urls) {
    			DefaultHttpClient client = new DefaultHttpClient();
    			HttpGet httpGet = new HttpGet(url);
    			try {
    				HttpResponse execute = client.execute(httpGet);
    				InputStream content = execute.getEntity().getContent();
    
    				BufferedReader buffer = new BufferedReader(
    						new InputStreamReader(content));
    				String s = "";
    				while ((s = buffer.readLine()) != null) {
    					response += s;
    				}
    
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		return response;
    	}
    
    	@Override
    	protected void onPostExecute(String result) {
    		if(result.equals("login_error")){
    			tvPlaceholder.setText("Benutzername oder Passwort falsch!");
    		}
    		if(result.equals("login_finished")){
    			// Muss noch programmiert werden
    		}
    	}
    }


    Man gibt also einen Namen und das Passwort ein und dann klickt man auf Login. Wenn man auf Login klickt soll folgender Code ausgeführt werden:

    public void onClickLogin(View view) {
    	tvPlaceholder.setText("Loading...");
    	String username = etLoginUsername.getText().toString();
    	String password = etLoginPassword.getText().toString();
    		
    	String json = "{\"username\": \"" + username + "\", \"password\": \"" + password + "\"}";
    		
    	String base64 = Base64.encodeToString(json.getBytes(), 0);
    		
    	DownloadWebPageTask task = new DownloadWebPageTask();
    	task.execute(new String[] { "http://meineseite.net/login.php?data=" + base64 });
    }


    Um das ganze etwas sicherer zu machen bringe ich die Daten erst in ein Json Format als String und danach wird der String mit Base64 verschlüsselt. Dieser String soll dann in der URL als GET Variable übergeben werden und im PHP Script wieder entschlüsselt werden. Allerdings kommt jetzt immer beim Klick auf Login folgende Meldung:

    Unfortunately, {appname} has stopped.

    Dann wird die App beendet. Zum testen hab ich dann an die URL anstatt den String base64 einfach "Hallo" angehangen und dann kommt die Meldung nicht. Also hat er anscheinend ein Problem damit, dass dieser base64 string in der URL vorkommt. Aber warum? Woran liegt das? Normal im Browser könnte ich ja auch so einen Code an die URL dranpacken.

    Ich würde mich über Hilfe freuen.
    Viele Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich kann hier aufm Handy leider weder den gesammten Quelltext sehen geschweigedenn testen, aber es sollte gesagt sein: Base64 ist keine Verschlüsselung und bringt dir in Sachen Zugangsdaten genau ein Null an zusätzlicher Sicherheit.
    Ein MD5 wäre nicht blöd, somit fließt zumindest das PW nicht in Klartext über die Leitung, sollte das PW bei mehreren Seiten genutzt werden.
    Overkill: Asymetrische Verschlüsselung. :D
  4. Lass den base64 String mal ausgeben, vielleicht siehst du dann schon, woran es liegen könnte. Sonst einfach mal ausprobieren, ab wann der Fehler auftritt. Ist die Länge des übergebenen Strings entscheidend? Oder ist vielleicht eines der Zeichen Plus (+) oder Schrägstrich (/) schuld? (Die sollen in einer URL angeblich kritisch sein und werden dann durch Bindestrich (-) und Unterstrich (_) ersetzt.)
    Hast du ein Protokoll vom PHP-Skript, ob die Anfrage vielleicht doch schon ankam?
  5. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    muellerlukas schrieb:
    Ich kann hier aufm Handy leider weder den gesammten Quelltext sehen geschweigedenn testen, aber es sollte gesagt sein: Base64 ist keine Verschlüsselung und bringt dir in Sachen Zugangsdaten genau ein Null an zusätzlicher Sicherheit.

    Also ich hab bei der Sicherheit eher daran gedacht, dass man somit nicht die URL manipulieren kann, indem man irgendeinen Code oder sowas in die Textfelder eingibt. Kenne mich da auch nicht so gut aus aber hab mir gedacht es wäre besser so.

    muellerlukas schrieb:
    Ein MD5 wäre nicht blöd, somit fließt zumindest das PW nicht in Klartext über die Leitung, sollte das PW bei mehreren Seiten genutzt werden.


    Aber MD5 ist ja keine Verschlüsselung sondern ein Hash, also könnte ich es nicht in der PHP Datei entschlüsseln um die einzelnen Sachen in die DB einzutragen. Und das Passwort wird dann in der PHP Datei mit MD5 gehashed.

    fuerderer schrieb:
    Lass den base64 String mal ausgeben, vielleicht siehst du dann schon, woran es liegen könnte. Sonst einfach mal ausprobieren, ab wann der Fehler auftritt. Ist die Länge des übergebenen Strings entscheidend? Oder ist vielleicht eines der Zeichen Plus (+) oder Schrägstrich (/) schuld? (Die sollen in einer URL angeblich kritisch sein und werden dann durch Bindestrich (-) und Unterstrich (_) ersetzt.)


    Ich habe jetzt mal den base64 Code ausgeben lassen und ihn dann dahin geschrieben wo vorher die Variable stand. So funktioniert es. Und ich habe auch noch die Sonderzeichen hinzugefügt, damit klappts auch.

    Vielleicht liegts an der doInBackground Methode in der AsyncTask Klasse? Habe die Klasse aus einem Tutorial kopiert und das ist mein erstes Projekt, deswegen kenn ich mich da noch nicht so aus und wüsste nicht was da falsch sein könnte.
  6. Richtig. md5 ist ebenso wie base64,rot13_... eine Verschlüsselung.
    wenn du das Passwort am Client hashsed, und dann mit dem in der DB vergleichst. geht das PW nicht im Klartext rübber.
    Klar ist das ne Spielerei, Https ist natürlich das Wahlmittel.

    Für JSon Encoding würde ich eh lieber eine Klasse einsetzten statt händisch basteln. Hier macht dir ein " schon alles kaputt.
    Oder direkt als GET/POST Werte.


    Ansonsten wär die Exception nützlich.
  7. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    Ok ich denke ich habe das Problem gelöst. Bei dem base64 encoden hatte ich ja vorher als zweiten Parameter eine 0. Das habe ich jetzt zu "Base64.NO_WRAP" geändert. Jetzt klappts. Vorher hat er anscheinend irgendwo ein "\n" eingefügt.

    muellerlukas schrieb:
    Für JSon Encoding würde ich eh lieber eine Klasse einsetzten statt händisch basteln. Hier macht dir ein " schon alles kaputt.


    Ok, hab da jetzt folgenden Code:

    JSONObject json = new JSONObject();
    json.put("username", username);
    json.put("password", password);


    Das ist ja jetzt ein Objekt. Um das in ein String zu wandeln habe ich folgendes gefunden:

    StringWriter out = new StringWriter();
    obj.writeJSONString(out);
    String jsonText = out.toString();


    Allerdings sagt mir Eclipse jetzt bei "writeJSONString":

    The method writeJSONString(StringWriter) is undefined for the type JSONObject

    Weißt du woran das liegt?

    EDIT:

    So klappts jetzt:

    String jsonText = json.toString();

    Beitrag zuletzt geändert: 22.2.2015 21:01:58 von ultimate-bravery
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!