Hello Sven-Jochen, ;-)
Nu aber, so läuft es und zwar mit Sonderzeichen und ohne Zeilenumbrüche in |x| um,zuwandeln und später wieder herzustellen.
Sieht doch schon besser aus.
Java:
// Create a HashMap to store the key-value pairs Map<String, String> data = new HashMap<>(); data.put("description", myDesc); data.put("preis", myPreis); data.put("konto", myKonto); data.put("MwSt", myMwSt); data.put("datum", myDatum); data.put("filename", file.getName()); // Convert the HashMap to a JSON string String jsonString = new Gson().toJson(data); // Convert the JSON string to a RequestBody RequestBody jsonRequestBody = RequestBody.create(MediaType.parse("application/json"), jsonString.getBytes()); // Now send the JSON string to the PHP file RequestBody fileRequestBody = RequestBody.create(MediaType.parse("*/*"), file); map.put("file\"; filename=\"" + file.getName() + "\"", fileRequestBody); map.put("json", jsonRequestBody);
Bei PHP hätte ich auf jeden Fall noch ein paar Dinge zu bemängeln:
- das Umkopieren
$myDescription = $jsonData['description'];
$myDescription = utf8_decode($myDescription);
$myPreis = $jsonData['preis'];
$myKonto = $jsonData['konto'];
$myMwSt = $jsonData['MwSt'];
$myMwSt = str_replace("% MwSt","",$myMwSt);
$myDatum = datum2mysql($jsonData['datum'],'.');
Das ist unnötig und zerstört nur den Zusammenhang der Daten.
-
und die Verwertung der übermittelten Filesize.
Filesize() muss auf jedem Fall auf dem Server geprüft werden, was der Client meldet, kann gelogen sein. Man sollte aber hier auch die handlebasierte Funktion verwenden. Die kann dann auch gleich für den MIME_Type benutzt werden. -
Prüfung des MIME-Types der Datei
Bitte auch auf dem Server prüfen und nicht glauben, was der Client meldet. Die Funktion mime_content_type() sollte hier helfen. [Leider hängt das Online-Manual gerade].
Ohne diese Prüfung könnte man Dir alles auf den Server jublen und dann ist er eventuell schnell geknackt. -
Den vom Client gemekdeten Filename darf man keinesfalls ungeprüft übernehmen. Der könnte ganze Pfade enthalten, bzw. schäfliche Filenamen (PRN, LPT, ...)
-
Das Vezeichnis für den Fileupload sollte außerhalb der Document-Root liegen und es sollten alle Scriptausführungen in diesem Verzeichnis ausgeschaltet sein! (.htaccess -> engine off).
-
User/Passwort-Prüfung konnte ich jetzt nicht entdecken. Habe ich die übersehen?
php:
if($_SERVER['REQUEST_METHOD'] === 'POST') { if(isset($_POST['json'])) { $jsonString = $_POST['json']; // JSON-String als Text aus dem Request-Body lesen $jsonData = json_decode($jsonString,true); // JSON-String in ein PHP-Array umwandeln // hier exception einbauen: if(false === $jsonData) { $success = false; $message = "JSON-Error while uploading"; $response["success"] = $success; $response["message"] = $message; echo json_encode($response); exit; } $myDateiname = $_FILES['file']['name']; $myDateigroesse = $_FILES["file"]["size"]; $myDescription = $jsonData['description']; $myDescription = utf8_decode($myDescription); $myPreis = $jsonData['preis']; $myKonto = $jsonData['konto']; $myMwSt = $jsonData['MwSt']; $myMwSt = str_replace("% MwSt","",$myMwSt); $myDatum = datum2mysql($jsonData['datum'],'.'); $fp = fopen('./androidlog.txt', 'a+'); fwrite($fp, $_FILES['file']['name']."\r\n"); fwrite($fp, print_r($jsonData,true)."\r\n"); fclose($fp); } }
ergibt sowas hier:
IMAGE_20230420_083452.jpg Array ( [datum] => 20.04.2023 [preis] => 36.9 [konto] => GWG [filename] => IMAGE_20230420_081552.jpg [description] => Zeile 1 Zeile 2 und noch eine lange Zeile die einen Zeilenumbruch innerhalb der Textarea hat und in der nächsten Zeile ein paar Sonderzeichen '*+&#@/)?;" [MwSt] => 19% MwSt )
Du hast also noch einiges zu tun, wenn Dir die Sicherheit des Servers etwas wert ist.
Glück Auf
Tom vom Berg