jg-appsgemacht-insights

Insight

jg-appsgemacht-insights

Insight

jg-appsgemacht-insights

Insight

jg-appsgemacht-insights

Insight

Best Practices für die Sicherheit von Flutter-Apps

Best Practices für die Sicherheit von Flutter-Apps

05.08.2024

Foto von Franck auf Unsplash


Mit der zunehmenden Verbreitung von Smartphones und der steigenden Anzahl von Anwendungen, die persönliche und sensible Daten verarbeiten, wächst auch die Notwendigkeit, diese Daten vor potenziellen Bedrohungen zu schützen. Für Entwickler, die mit Flutter arbeiten, stellt dies eine besondere Herausforderung dar, da es einige spezifische Sicherheitsaspekte gibt, die beachtet werden müssen.


Flutter, als modernes Framework zur plattformübergreifenden Entwicklung von mobilen Apps, bietet viele Vorteile hinsichtlich der Effizienz und der Benutzerfreundlichkeit. Dennoch birgt es, wie jede Technologie, auch Sicherheitsrisiken, die es zu adressieren gilt. Dies umfasst sowohl die sichere Handhabung von Daten als auch den Schutz vor Angriffen und die Einhaltung von Datenschutzbestimmungen.


In diesem Artikel werden wir die besten Praktiken zur Verbesserung der Sicherheit von Flutter-Apps beleuchten. Du wirst lernen, wie du sensible Daten sicher speichern kannst, welche Authentifizierungs- und Autorisierungsmethoden am effektivsten sind und wie du durch regelmäßige Sicherheitsüberprüfungen und -aktualisierungen das Risiko von Sicherheitsvorfällen minimieren kannst.


Im Folgenden findest Du eine Übersicht der wichtigsten Sicherheitsmaßnahmen, die wir im Detail betrachten werden. Diese Maßnahmen sind darauf ausgelegt, deine Flutter-App vor den häufigsten Bedrohungen zu schützen und gleichzeitig die Benutzererfahrung nicht zu beeinträchtigen. Indem du diese Best Practices implementierst, stellst du sicher, dass deine App sowohl robust als auch sicher ist.



Code-Verwaltung und Sicherheit


Eine der fundamentalen Säulen für die Sicherheit von Flutter-Apps liegt in der sorgfältigen Verwaltung und Sicherung des Quellcodes. Hier sind einige wesentliche Praktiken, die Du berücksichtigen solltest:


Sichere Speicherung von API-Schlüsseln und geheimen Daten


API-Schlüssel und andere sensible Informationen sollten niemals direkt im Quellcode gespeichert werden. Diese Praxis könnte zu einem erheblichen Sicherheitsrisiko führen, falls der Code kompromittiert wird. Verwende stattdessen eine sichere Möglichkeit zur Speicherung dieser Daten, wie Umgebungsvariablen oder spezielle Geheimnis-Management-Tools wie AWS Secrets Manager oder Google Cloud Secret Manager. Diese Dienste ermöglichen es, sensible Informationen sicher zu speichern und bei Bedarf abzurufen, ohne sie direkt im Code zu hinterlegen.


Verwendung von sicheren Abhängigkeiten


Die Abhängigkeiten, die in deiner Flutter-App verwendet werden, sollten regelmäßig überprüft und aktualisiert werden. Veraltete Bibliotheken können Sicherheitslücken enthalten, die von Angreifern ausgenutzt werden könnten. Nutze Tools wie Dependabot oder Snyk, um regelmäßig Berichte über die Sicherheit deiner Abhängigkeiten zu erhalten und sicherzustellen, dass du immer die neuesten und sichersten Versionen verwendest. Es ist auch wichtig, die Herkunft und Vertrauenswürdigkeit der Bibliotheken zu überprüfen, bevor du sie in deinem Projekt einsetzt.


Durchführung von regelmäßigen Code-Reviews und Sicherheitstests


Code-Reviews sind ein essenzieller Bestandteil der Qualitätssicherung und helfen dabei, potenzielle Sicherheitsprobleme frühzeitig zu identifizieren. Indem Du regelmäßige und gründliche Code-Reviews durchführst, kannst Du sicherstellen, dass Sicherheitslücken oder unsichere Codierungspraktiken erkannt und behoben werden, bevor sie in die Produktion gelangen. Dabei sollten Sicherheitsaspekte ein fester Bestandteil des Review-Prozesses sein.


Zusätzlich zu Code-Reviews sollten regelmäßige Sicherheitstests durchgeführt werden. Automatisierte Sicherheitsscans und manuelle Penetrationstests helfen, Schwachstellen zu identifizieren, die durch Code-Reviews möglicherweise übersehen wurden.


Durch die konsequente Umsetzung dieser Praktiken in der Code-Verwaltung kannst Du die Sicherheit Deiner Flutter-App erheblich erhöhen. Eine sichere Code-Basis bildet das Fundament für den weiteren Schutz deiner Anwendung und sorgt dafür, dass potenzielle Angriffsflächen minimiert werden.

 

 

Datenverschlüsselung


Die Datenverschlüsselung spielt eine zentrale Rolle beim Schutz sensibler Informationen in deiner Flutter-App. Sie stellt sicher, dass Daten sowohl bei der Speicherung auf dem Gerät als auch während der Übertragung sicher und unlesbar für Unbefugte bleiben. Hier sind einige essenzielle Aspekte der Datenverschlüsselung, die du in deiner App berücksichtigen solltest:


Verschlüsselung von lokalen Daten


Lokale Daten, die auf dem Gerät gespeichert werden, müssen verschlüsselt sein, um sicherzustellen, dass sie im Falle eines Geräteverlusts oder -diebstahls nicht zugänglich sind. Flutter bietet mehrere Pakete und Bibliotheken, die eine einfache Implementierung von Verschlüsselung ermöglichen. Das flutter_secure_storage Paket ist eine beliebte Wahl, da es eine sichere Möglichkeit bietet, Schlüssel-Wert-Paare zu speichern und zu verschlüsseln. Dieses Paket nutzt die sicheren Speichermechanismen des jeweiligen Betriebssystems (Keychain auf iOS und Keystore auf Android), um maximale Sicherheit zu gewährleisten.


Ein Beispiel für die Verwendung von flutter_secure_storage:

import 'package:flutter_secure_storage/flutter_secure_storage.dart';

final storage = new FlutterSecureStorage();

// Schreiben
await storage.write(key: 'api_key', value: '123456');

// Lesen
String? value = await storage.read(key: 'api_key');


Sicherer Datentransfer zwischen App und Server


Die Datenübertragung zwischen deiner Flutter-App und dem Backend-Server sollte immer verschlüsselt sein, um Man-in-the-Middle-Angriffe zu verhindern. Verwende HTTPS (HyperText Transfer Protocol Secure) für alle Netzwerkanfragen. HTTPS nutzt SSL/TLS (Secure Sockets Layer / Transport Layer Security) zur Verschlüsselung der Daten, die zwischen dem Client und dem Server übertragen werden.


Stelle sicher, dass dein Server ein gültiges SSL/TLS-Zertifikat besitzt und deine App nur mit Servern kommuniziert, deren Zertifikate vertrauenswürdig sind. Du kannst dies durch die Implementierung von Zertifikats-Pinning sicherstellen, bei dem das Zertifikat des Servers in der App hartkodiert und überprüft wird. Dies verhindert, dass deine App mit gefälschten Servern kommuniziert, wenngleich das Gerät des Benutzers einem Angriff ausgesetzt ist.


Implementierung von HTTPS und SSL/TLS-Zertifikaten

Für die Implementierung von HTTPS in deiner Flutter-App, kannst du die http oder dio Pakete verwenden, die beide die Nutzung von HTTPS unterstützen. Hier ein einfaches Beispiel mit dem http Paket:

import 'package:flutter_secure_storage/flutter_secure_storage.dart';

final storage = new FlutterSecureStorage();

// Schreiben
await storage.write(key: 'api_key', value: '123456');

// Lesen
String? value = await storage.read(key: 'api_key');


Sicherer Datentransfer zwischen App und Server


Die Datenübertragung zwischen deiner Flutter-App und dem Backend-Server sollte immer verschlüsselt sein, um Man-in-the-Middle-Angriffe zu verhindern. Verwende HTTPS (HyperText Transfer Protocol Secure) für alle Netzwerkanfragen. HTTPS nutzt SSL/TLS (Secure Sockets Layer / Transport Layer Security) zur Verschlüsselung der Daten, die zwischen dem Client und dem Server übertragen werden.


Stelle sicher, dass dein Server ein gültiges SSL/TLS-Zertifikat besitzt und deine App nur mit Servern kommuniziert, deren Zertifikate vertrauenswürdig sind. Du kannst dies durch die Implementierung von Zertifikats-Pinning sicherstellen, bei dem das Zertifikat des Servers in der App hartkodiert und überprüft wird. Dies verhindert, dass deine App mit gefälschten Servern kommuniziert, wenngleich das Gerät des Benutzers einem Angriff ausgesetzt ist.


Implementierung von HTTPS und SSL/TLS-Zertifikaten


Für die Implementierung von HTTPS in deiner Flutter-App, kannst du die http oder dio Pakete verwenden, die beide die Nutzung von HTTPS unterstützen. Hier ein einfaches Beispiel mit dem http Paket:

import 'package:http/http.dart' as http;

final response = await http.get(Uri.parse('<https://example.com/data>'));

if (response.statusCode == 200) {
  // Erfolgreiche Anfrage
} else {
  // Fehler
}


Um die Sicherheit weiter zu erhöhen, solltest du zusätzlich HSTS (HTTP Strict Transport Security) auf deinem Server aktivieren. HSTS zwingt Browser und Apps dazu, immer eine sichere Verbindung zu nutzen und reduziert das Risiko, dass Benutzer versehentlich eine unsichere Verbindung verwenden.

Zusammengefasst stellt die richtige Implementierung von Datenverschlüsselung sicher, dass sowohl lokal gespeicherte Daten als auch übertragene Daten geschützt sind. Durch die Verwendung bewährter Methoden und Tools kannst du die Sicherheitsanforderungen deiner Flutter-App erfüllen und gleichzeitig das Vertrauen deiner Benutzer in die Sicherheit ihrer Daten stärken.

 

Authentifizierung und Autorisierung


Eine robuste Authentifizierung und Autorisierung sind entscheidend, um den Zugriff auf sensible Bereiche deiner Flutter-App zu steuern und sicherzustellen, dass nur berechtigte Benutzer auf bestimmte Funktionen und Daten zugreifen können. Hier sind einige bewährte Verfahren und Technologien, die du implementieren solltest:


Verwendung sicherer Authentifizierungsverfahren


Die Implementierung sicherer Authentifizierungsverfahren ist der erste Schritt, um sicherzustellen, dass nur autorisierte Benutzer auf deine App zugreifen können. Eine der am häufigsten verwendeten Methoden ist die Multi-Faktor-Authentifizierung (MFA), die eine zusätzliche Sicherheitsebene hinzufügt, indem Benutzer neben ihrem Passwort auch einen zweiten Faktor (z. B. eine SMS, eine E-Mail oder eine Authentifizierungs-App) eingeben müssen. MFA erschwert es Angreifern erheblich, auf Benutzerkonten zuzugreifen, auch wenn sie das Passwort kennen.


Zusätzlich zur MFA ist es wichtig, sichere Passwortanforderungen durchzusetzen. Dies umfasst Mindestlängen, die Verwendung von Sonderzeichen und regelmäßige Aufforderungen zum Passwortwechsel. Verwende Bibliotheken wie flutter_auth_ui oder firebase_auth für eine einfache Integration sicherer Authentifizierungsmethoden.


Implementierung von OAuth2 und JWT


OAuth2 ist ein weitverbreitetes Autorisierungsframework, das es Drittanbietern ermöglicht, auf Ressourcen zuzugreifen, ohne dass Benutzer ihre Passwörter preisgeben müssen. JSON Web Tokens (JWT) sind dabei ein gängiges Format zur sicheren Übertragung von Informationen zwischen Parteien. JWTs sind sicher, da sie digital signiert sind und leicht überprüft werden können.


Die Integration von OAuth2 in Flutter-Apps kann durch Pakete wie flutter_appauth erreicht werden. Ein Beispiel für die Verwendung von OAuth2 mit JWT:

import 'package:flutter_appauth/flutter_appauth.dart';

final FlutterAppAuth appAuth = FlutterAppAuth();

final AuthorizationTokenResponse? result = await appAuth.authorizeAndExchangeCode(
  AuthorizationTokenRequest(
    'your_client_id',
    'your_redirect_uri',
    issuer: '<https://your-authorization-server.com>',
    scopes: ['openid', 'profile', 'email'],
  ),
);

if (result != null) {
  // Zugriffstoken erhalten
  String? accessToken = result.accessToken;
  // Token verifizieren und verwenden
}


Verwaltung von Benutzerrollen und -rechten


Eine klare und sichere Verwaltung von Benutzerrollen und -rechten stellt sicher, dass Benutzer nur auf die Ressourcen zugreifen können, für die sie berechtigt sind. Dies reduziert das Risiko, dass sensible Daten kompromittiert werden, und verhindert unbefugte Aktionen innerhalb der App.


Rollenbasierte Zugriffskontrolle (Role-Based Access Control, RBAC) ist ein bewährter Ansatz zur Verwaltung von Benutzerrechten. Jede Rolle hat definierte Berechtigungen und Benutzer werden diesen Rollen zugewiesen. Ein Beispiel für die Implementierung von RBAC in Flutter könnte die Verwendung eines Backends wie Firebase sein, das die Verwaltung von Benutzerrollen und Berechtigungen unterstützt.


import 'package:firebase_auth/firebase_auth.dart';

User? user = FirebaseAuth.instance.currentUser;

if (user != null) {
  // Überprüfen, ob der Benutzer eine bestimmte Rolle hat
  bool isAdmin = await checkUserRole(user, 'admin');
  if (isAdmin) {
    // Admin-spezifische Aktionen
  } else {
    // Aktionen für normale Benutzer
  }
}

Future<bool> checkUserRole(User user, String role) async {
  // Logik zum Überprüfen der Benutzerrolle aus der Datenbank
}


Zusammengefasst stellen zuverlässige Authentifizierungs- und Autorisierungsmethoden sicher, dass nur berechtigte Benutzer auf deine Flutter-App zugreifen und bestimmte Aktionen ausführen können. Durch die Implementierung von MFA, OAuth2, JWT und RBAC schaffst du eine robuste Sicherheitsstruktur, die das Risiko von unbefugtem Zugriff und Datenlecks minimiert.

 


Sicherheitsrichtlinien und Best Practices


Das Implementieren von Sicherheitsrichtlinien und die Einhaltung bewährter Praktiken sind entscheidend, um die Sicherheit deiner Flutter-App zu gewährleisten. Diese Maßnahmen helfen dabei, Sicherheitslücken zu minimieren und die Gesamtintegrität deiner Anwendung zu stärken. Hier sind einige der wichtigsten Sicherheitsrichtlinien und Best Practices, die du berücksichtigen solltest:


Anwendung der Prinzipien des "Least Privilege" und "Defence in Depth"


Least Privilege (Minimalrechteprinzip) bedeutet, dass Benutzer und Systemkomponenten nur die minimal notwendigen Rechte und Berechtigungen erhalten sollten, die sie für ihre Aufgaben benötigen. Dies reduziert die Angriffsfläche und minimiert das Risiko, dass ein Kompromiss schwerwiegende Auswirkungen hat.


Ein Beispiel für die Anwendung des Minimalrechteprinzips in Flutter ist die Einschränkung von Berechtigungen, die deine App anfordert. Wenn eine Funktion deiner App beispielsweise keine Standortinformationen benötigt, fordere diese Berechtigung nicht an.


Defence in Depth (Verteidigung in der Tiefe) ist ein mehrschichtiger Ansatz zur Sicherheit, bei dem mehrere Sicherheitsmechanismen implementiert werden, um potenzielle Bedrohungen abzuwehren. Dies kann durch die Kombination von Firewalls, Verschlüsselung, Zugangskontrollen und anderen Sicherheitsmaßnahmen erreicht werden. Jeder Layer sollte so gestaltet sein, dass er im Falle eines Fehlers eines anderen Layers eine zusätzliche Schutzebene bietet.


Regelmäßige Sicherheitsupdates und Patching


Software, einschließlich Betriebssysteme, Frameworks und Bibliotheken, enthält oft Schwachstellen, die von Angreifern ausgenutzt werden können. Regelmäßige Sicherheitsupdates und Patches sind entscheidend, um diese Schwachstellen zu beheben und deine App vor bekannten Bedrohungen zu schützen. Stelle sicher, dass du regelmäßig die neuesten Versionen der von dir verwendeten Abhängigkeiten und Bibliotheken überprüfst und aktualisierst.


Automatisiere diesen Prozess, soweit möglich, um sicherzustellen, dass keine kritischen Updates übersehen werden.


Schulung und Sensibilisierung des Entwicklungsteams


Ein gut geschultes und sicherheitsbewusstes Entwicklungsteam ist eine der besten Verteidigungslinien gegen Sicherheitsbedrohungen. Regelmäßige Schulungen und Workshops zu Sicherheitsthemen sollten ein integraler Bestandteil deiner Entwicklungsprozesse sein. Dies umfasst:

  • Bewusstsein für aktuelle Bedrohungen und Sicherheitslücken: Halte das Team über die neuesten Sicherheitsbedrohungen und -trends auf dem Laufenden.

  • Verwendung von Sicherheitstools: Mache das Team mit den verfügbaren Sicherheitstools und -techniken vertraut, wie z.B. statische Code-Analyse-Tools, Penetrationstests und Sicherheitsscanner.


Zusätzlich zur Schulung ist die Schaffung einer Sicherheitskultur innerhalb des Teams wichtig. Fördere ein Umfeld, in dem Sicherheitsbedenken offen kommuniziert werden können und Sicherheit als gemeinsame Verantwortung aller Teammitglieder angesehen wird.


Zusammengefasst sind Sicherheitsrichtlinien und Best Practices entscheidend, um die Robustheit und Integrität deiner Flutter-App zu gewährleisten. Durch die Anwendung des Minimalrechteprinzips, die Implementierung von "Defence in Depth", regelmäßige Updates und Schulungen des Teams kannst du das Risiko von Sicherheitsvorfällen signifikant reduzieren und eine sichere Benutzererfahrung gewährleisten.


 

Sicherheitsüberprüfung und Monitoring


Die kontinuierliche Überprüfung und Überwachung der Sicherheitslage deiner Flutter-App sind entscheidend, um potenzielle Schwachstellen frühzeitig zu erkennen und zu beheben. Hier sind einige wichtige Aspekte und Tools, die du in deinem Sicherheitsmanagement berücksichtigen solltest:


Einsatz von Sicherheitsanalyse-Tools und Penetrationstests


Automatisierte Sicherheitsanalyse-Tools helfen dabei, Schwachstellen im Code frühzeitig zu erkennen. Diese Tools führen statische und dynamische Analysen durch und identifizieren potenzielle Sicherheitsprobleme, bevor sie in die Produktion gelangen.


Monitoring und Logging sicherheitsrelevanter Ereignisse


Das Monitoring und Logging sicherheitsrelevanter Ereignisse sind essenziell, um verdächtige Aktivitäten zu erkennen und darauf reagieren zu können. Implementiere umfassende Logging-Mechanismen, die sicherheitsrelevante Ereignisse wie fehlgeschlagene Login-Versuche, verdächtige API-Zugriffe und Änderungen an sensiblen Daten protokollieren.


Verwende Logging-Frameworks wie logger , talker oder firebase_crashlytics, um detaillierte Logs zu erstellen und sie zentralisiert zu speichern. Ein Beispiel für die Verwendung von logger in einer Flutter-App:

import 'package:logger/logger.dart';

var logger = Logger();

void main() {
  logger.d("Debug message");
  logger.i("Info message");
  logger.w("Warning message");
  logger.e("Error message");
}

void monitorSecurityEvents() {
  // Beispiel für das Loggen eines sicherheitsrelevanten Ereignisses
  logger.w("Fehlgeschlagener Login-Versuch von IP: 192.168.0.1");
}


Schnelle Reaktion auf Sicherheitsvorfälle und Schwachstellen


Ein effektives Incident-Response-Management ist entscheidend, um auf Sicherheitsvorfälle schnell und angemessen zu reagieren. Dies umfasst die Identifikation, Analyse, Eindämmung, Behebung und Nachbereitung von Sicherheitsvorfällen. Entwickle einen klaren Incident-Response-Plan, der Rollen und Verantwortlichkeiten definiert und sicherstellt, dass das Team weiß, wie es im Falle eines Sicherheitsvorfalls zu handeln hat.


Zu den Schritten eines typischen Incident-Response-Plans gehören:

  • Erkennung und Meldung: Implementiere Mechanismen, um Vorfälle schnell zu erkennen und zu melden.

  • Eindämmung: Begrenze den Schaden durch sofortige Maßnahmen, wie z.B. das Isolieren betroffener Systeme.

  • Behebung: Behebe die Ursache des Vorfalls und stelle den normalen Betrieb wieder her.

  • Nachbereitung: Analysiere den Vorfall, dokumentiere die Erkenntnisse und passe Sicherheitsmaßnahmen und -richtlinien an, um zukünftige Vorfälle zu verhindern.


Zusammengefasst ist die Sicherheitsüberprüfung und das Monitoring ein kontinuierlicher Prozess, der regelmäßige Analysen, Überwachungen und proaktive Reaktionen auf Sicherheitsvorfälle umfasst. Durch den Einsatz von Sicherheitsanalyse-Tools, umfassendem Monitoring und einem klaren Incident-Response-Plan stellst du sicher, dass deine Flutter-App stets sicher bleibt und potenzielle Bedrohungen frühzeitig erkannt und behoben werden.


 

Fazit


Die Sicherheit von Flutter-Apps ist ein komplexes und vielschichtiges Thema, das sorgfältige Planung und kontinuierliche Aufmerksamkeit erfordert. Angesichts der wachsenden Bedrohungen in der digitalen Welt ist es unerlässlich, robuste Sicherheitsmaßnahmen zu implementieren und diese regelmäßig zu überprüfen und zu aktualisieren.


In diesem Artikel haben wir die wichtigsten Best Practices zur Verbesserung der Sicherheit von Flutter-Apps behandelt. Beginnend mit der sicheren Verwaltung des Quellcodes, einschließlich der sicheren Speicherung von API-Schlüsseln und der regelmäßigen Überprüfung von Abhängigkeiten, haben wir die Bedeutung von Code-Reviews und Sicherheitstests hervorgehoben. Die Verschlüsselung lokaler Daten und die Sicherung des Datentransfers mittels HTTPS und SSL/TLS sind entscheidende Maßnahmen zum Schutz sensibler Informationen.


Wir haben auch die Wichtigkeit sicherer Authentifizierungs- und Autorisierungsverfahren beleuchtet, einschließlich der Verwendung von Multi-Faktor-Authentifizierung, OAuth2 und JWT sowie der Verwaltung von Benutzerrollen und -rechten. Darüber hinaus haben wir die Prinzipien des "Least Privilege" und "Defence in Depth" als zentrale Sicherheitsrichtlinien eingeführt, regelmäßige Sicherheitsupdates und die Schulung des Entwicklungsteams betont.


Die kontinuierliche Sicherheitsüberprüfung und das Monitoring, unterstützt durch automatisierte Tools und Penetrationstests, helfen dabei, potenzielle Schwachstellen frühzeitig zu identifizieren und zu beheben. Ein klarer Incident-Response-Plan stellt sicher, dass das Team auf Sicherheitsvorfälle schnell und effizient reagieren kann.


Abschließend kann gesagt werden, dass die Implementierung dieser Sicherheitspraktiken nicht nur die Sicherheit deiner Flutter-App erhöht, sondern auch das Vertrauen der Benutzer in die Anwendung stärkt. Sicherheitsmaßnahmen sollten stets ein integraler Bestandteil des Entwicklungsprozesses sein, und regelmäßige Überprüfungen und Anpassungen sind entscheidend, um mit den sich ständig weiterentwickelnden Bedrohungen Schritt zu halten.


Durch die konsequente Anwendung dieser Best Practices kannst du sicherstellen, dass deine Flutter-App nicht nur funktional und benutzerfreundlich, sondern auch sicher und zuverlässig ist. Setze die hier vorgestellten Maßnahmen um und schaffe so eine solide Basis für den langfristigen Erfolg deiner mobilen Anwendungen.

Zu allen Insights

Dein planbarer App-Entwickler

für Flutter Apps

“Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC.”

Copyright ©2024. Julian Giesen. Alle Rechte vorbehalten.

Dein planbarer App-Entwickler

für Flutter Apps

Copyright ©2024. Julian Giesen.

Alle Rechte vorbehalten.

“Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC.”

Dein planbarer App-Entwickler

für Flutter Apps

“Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC.”

Copyright ©2024. Julian Giesen. Alle Rechte vorbehalten.