Java Applikation als Backend (REST) absichern

danielmaann

Mitglied
Hallo zusammen

Gestern hatte ich ein Gespräch mit einem erfahrenen Entwickler im Betrieb. Ich selbst arbeite als Softwareentwickler mit Java und anderen Technologien. Nun kam das Thema auf "Backend absichern". Es istz schwer zu erklären wie es gemeint ist, jedoch versuche ich es mit beispielen.

Es ist so:
- Mein Wissensstand war:
Wenn man eine Frontenedapplikation hat welche mit einem Backend komuniziert über die URL (via REST) kann man diese Frontendapplikation entschüsseln und man sieht die Backendurl.
Nun kann in diesem Fall dieser mit dem Endpoint mit dem Browser, oder Postman oder was auch sonst über diese REST Schnittstelle kommunizieren. Auch wenn ich im Backend ein Token habe, kann es halt denselben Token vewenden und als Header mit geben.

- Der erfahrere Entwickler sagte:
Dies ist so, aber dies ist nicht abgesichert. Man kann wie eine Sicherung über die Backend applikation legen, welche ein verschlüsseltes Token mit gibt, somit ist das dann unmöglich. Und nur die Frontendapplikation kann kommunizieren.

Nun frage ich mich, wieso sollte man diesen verschlüsselten Token auch nicht nehmen können und diesen mit Postman oder so mit geben? Wie funktioniert das? Gibt es dafür Frameworks oder Libraries?

Kann mir jemand das besser erklären?
 

Thallius

Top Contributor
Am einfachsten indem du den verschlüsselten Token abhängig machst von einem Login am Frontend. Sprich, der User der Frontend Applikation muss einen Login eingeben um sich mit dem Backend verbinden zu können.

Gruß

Claus
 

danielmaann

Mitglied
Am einfachsten indem du den verschlüsselten Token abhängig machst von einem Login am Frontend. Sprich, der User der Frontend Applikation muss einen Login eingeben um sich mit dem Backend verbinden zu können.

Gruß

Claus
Verstehe ich das richtig, das in diesem Fall dieses Token jedesmal mitgesendet wird und somit wie eingeloggt wird jedesmal... aber dieses token kann man ja auch kopieren und dann via Postman verwenden
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn man eine Frontenedapplikation hat welche mit einem Backend komuniziert über die URL (via REST) kann man diese Frontendapplikation entschüsseln und man sieht die Backendurl.
Nun kann in diesem Fall dieser mit dem Endpoint mit dem Browser, oder Postman oder was auch sonst über diese REST Schnittstelle kommunizieren. Auch wenn ich im Backend ein Token habe, kann es halt denselben Token vewenden und als Header mit geben.
Was ist denn daran das Problem? In den meisten Fällen ist es völlig irrelevant, welcher Client genutzt wird - und in den anderen Fällen ist häufig das Backend nicht sicher genug gegen invalide Eingaben, dass sollte aber Backendseitig gelöst werden, nicht Clientseitig.


Am einfachsten indem du den verschlüsselten Token abhängig machst von einem Login am Frontend. Sprich, der User der Frontend Applikation muss einen Login eingeben um sich mit dem Backend verbinden zu können.
Das hilft gegen seinen genannten Fall nicht. Es geht nicht um den falschen Nutzer, sondern um den falschen Client
 

Thallius

Top Contributor
Was ist denn daran das Problem? In den meisten Fällen ist es völlig irrelevant, welcher Client genutzt wird - und in den anderen Fällen ist häufig das Backend nicht sicher genug gegen invalide Eingaben, dass sollte aber Backendseitig gelöst werden, nicht Clientseitig.

Das hilft gegen seinen genannten Fall nicht. Es geht nicht um den falschen Nutzer, sondern um den falschen Client

Was ist denn "Der falsche Client" ?
 

Flown

Administrator
Mitarbeiter
Wenn man den Token besitzt, dann kann man sich immer am Server authentifizieren. Die Frage ist, wie man an den Token kommt.
Wenn man ihn mit MITM Attacken bekommt hilft ungemein eine verschlüsselte Verbindung (z.B. TLS).
Wenn man ihn weitergibt, dann gibts keine Absicherung.
 

Thallius

Top Contributor
Verstehe ich das richtig, das in diesem Fall dieses Token jedesmal mitgesendet wird und somit wie eingeloggt wird jedesmal... aber dieses token kann man ja auch kopieren und dann via Postman verwenden

Nein der User logged sich auf dem Backend ein und dabei wird immer ein neues Token generiert welches für die zukünftige Kommunikation genutzt wird. Sobald sich der User ausloggt wird das Token natürlich invalide. genauso wenn sich die IP des Senders ändert oder nach einer gewissen Zeit untätigkeit. Im Prinzip nichts anderes als eine Session bei einer Webapplikation.

Beispiele für so etwas sind oAuth, openID o.ä.

Gruß

Claus
 

danielmaann

Mitglied
Nein der User logged sich auf dem Backend ein und dabei wird immer ein neues Token generiert welches für die zukünftige Kommunikation genutzt wird. Sobald sich der User ausloggt wird das Token natürlich invalide. genauso wenn sich die IP des Senders ändert oder nach einer gewissen Zeit untätigkeit. Im Prinzip nichts anderes als eine Session bei einer Webapplikation.

Beispiele für so etwas sind oAuth, openID o.ä.

Gruß

Claus
Danke für deinen Beitrag jedoch hilft das bei meinem Problen nicht weiter. Nimm mal die Facebook App, dekompiliere sie und dann probiere über die REST Schnittstelle auf facebook zuzugreifen (mit allen Daten die du auch in der App hast, Token und so weiter).. Es wird nicht funktionieren .. das will ich auch so haben
 

Thallius

Top Contributor
Selbst wenn nicht, dann kann man im Code herausfinden was man machen muss damit es geht. Ich denke die werden da schon noch ein paar zusätzliche Sicherheiten eingebaut haben. Wenn sich deine Software gegenüber dem FB Server genauso verhält wie die App, dann wird sie auch die Daten bekommen.
 

sascha-sphw

Top Contributor
In der Adminkonsole der Facebook App legt man die Domain der App fest, zusätzlich kann man auch die IP festlegen. Wenn dann Anfragen über eine andere IP als die eingetragene kommen, werden sie blockiert. Zusätzlich kann man aber auch noch explizit IP Adressen blockieren.
 

mrBrown

Super-Moderator
Mitarbeiter
In der Adminkonsole der Facebook App legt man die Domain der App fest, zusätzlich kann man auch die IP festlegen. Wenn dann Anfragen über eine andere IP als die eingetragene kommen, werden sie blockiert. Zusätzlich kann man aber auch noch explizit IP Adressen blockieren.
Ist aber was anderes, als das vom TO beschriebene

Achso, und einen Geheimcode, den die App nicht im Client Code aufbewahrt wird ebenfalls noch an FB geschickt.
Er liegt aber trotzdem beim Client -> hat man volle Kontrolle über den Client, kommt man an den Token.
 

sascha-sphw

Top Contributor
Ich beziehe mich auf die folgende Aussage. Und wollte deshalb nur erwähnt haben, dass FB hier mehr macht als einen simplen Token den man über einen Login bekommt.
Nimm mal die Facebook App, dekompiliere sie und dann probiere über die REST Schnittstelle auf facebook zuzugreifen (mit allen Daten die du auch in der App hast, Token und so weiter).. Es wird nicht funktionieren .. das will ich auch so haben

Er liegt aber trotzdem beim Client -> hat man volle Kontrolle über den Client, kommt man an den Token.
Wenn Du den Geheim Code trotz Sicherheitshinweise von FB im Client Code aufbewahrst, dann schon. Sollte man aber nicht machen...
https://developers.facebook.com/docs/facebook-login/security#appsecret
 

mrBrown

Super-Moderator
Mitarbeiter
Ich beziehe mich auf die folgende Aussage. Und wollte deshalb nur erwähnt haben, dass FB hier mehr macht als einen simplen Token den man über einen Login bekommt.
*Was* sollen sie denn machen?
Beschränkung auf eine IP ist bei der Facebook-App ganz offensichtlich nicht möglich, bei um die Milliarde Nutzer...

Und zu dem Geheimcode:
Wenn Du den Geheim Code trotz Sicherheitshinweise von FB im Client Code aufbewahrst, dann schon. Sollte man aber nicht machen...
https://developers.facebook.com/docs/facebook-login/security#appsecret
Ich sagte "Client", nicht "Code".
In dem von dir geposteten Link ist der Client der App-Server, und auf genau dem liegen die Codes...

Und wo bringt man denn zB den Geheimcode in der App (auf die du dich ja bezogen hast) unter, wenn nicht in der App (=Client)?
 

danielmaann

Mitglied
Schade das es da nun Diskussionen gibt. Naja ist wahrscheinlich so, dass ihr wirklich aneinander vorbei redet. Um es zu vereifachen.

Ich will sicherstellen, das mein Backend nur von meiner App aus abgerufen werden kann. Bzw. abfragen auf die Restschnittstelle sollten nur von der App passieren können und nicht von einem anderen Client (Postman,...). Also Ich habe dazu gehört, das dies mit einem Token funktionieren würde. Aber mit noch etwas zusätzlichem, ohne das man diesen token einfach kopieren kann (mit MITM oder wie auch immer) und diesen dann für den falschen Client wieder verwenden kann.
 

Dukel

Top Contributor
Ich glaube das kannst du nicht verhindern. Alles was auf einem Client ist kann kopiert werden.

Wieso darf die Schnittstelle nur von deinem Client aus angesprochen werden?
 

mrBrown

Super-Moderator
Mitarbeiter
Weil ich der einzige sein will, der mit der Restschnittstelle kommuniziert.
Das fällt unter Nutzer-Authentifizierung, und hat nichts mit Begrenzung auf Clients zu tun.

Somit kann auch verhindert werden, das jemand nicht unzählige requests absetzt von seiner eigenen applikation.
Das lässt sich auch mit einfacher Nutzer-Authentifizierung lösen, uU unter Zuhilfenahme von anderen Techniken.
 

Dukel

Top Contributor
Du hast Clients grundsätzlich nicht im Griff. Daher muss deine Applikation / App Server sicher sein. Wenn eine Bedrohung unzählige Zugriffe (DOS / DDOS, kann auch ohne deinen Client passieren, in dem dein App Server dauernd abgefragt wird) ist dann muss man dagegen was machen. Eine Möglichkeit ist die Zugriffe zu begrenzen.
 

danielmaann

Mitglied
Du hast Clients grundsätzlich nicht im Griff. Daher muss deine Applikation / App Server sicher sein. Wenn eine Bedrohung unzählige Zugriffe (DOS / DDOS, kann auch ohne deinen Client passieren, in dem dein App Server dauernd abgefragt wird) ist dann muss man dagegen was machen. Eine Möglichkeit ist die Zugriffe zu begrenzen.
Und wie werden die zugriffe begrenzt? werden die reinprogrammiert mit java, nun bei spring oder gibts da auf dem server eine config file dafür und wie wird der zugriff begrenzt? generell, pro sekunde, pro stunde, pro user? oder wie funktioniert das?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java Applikation auf Webserver - was brauche ich dafür? Server einrichten und konfigurieren 7
I Hosting einer JAVA EE App Server einrichten und konfigurieren 26
QU3LLC0D3 Hosting von (u.a.) Java- und Node.js Anwendungen Server einrichten und konfigurieren 6
K "Java-11-openjdk-headless" + Abhängigkeiten manuell installieren / Ohne Internet Server einrichten und konfigurieren 1
J ich kann meinen Craftbukkitserver 1.15.2 nicht starten, obwohl ich Java installiert habe und es über 13 ist Server einrichten und konfigurieren 5
M Keine Verbinung zu Java-Https-Server möglich (Handshake-Fail) Server einrichten und konfigurieren 7
D java code auf Xampp laufen lassen Server einrichten und konfigurieren 5
K Tomcat - Java-Version? Server einrichten und konfigurieren 5
E Bekomme java.lang.IllegalStateException und java.lang.ClassNotFoundException beim deployen Server einrichten und konfigurieren 0
I JAVA EE Server mit integrierter Datenbank Server einrichten und konfigurieren 0
M Java-EJB-Anwendung auf Server bzw. Client deployen Server einrichten und konfigurieren 0
M Glassfish 4: java.net.MalformedURLException: Bad URL path Server einrichten und konfigurieren 7
J Java Programm auf Linux Server Laufen lassen Server einrichten und konfigurieren 6
A internal exception: java.io.ioexception: an existing connection was forcibly closed by remote host ? Server einrichten und konfigurieren 2
P Ständige Java.Authentifizierung Server einrichten und konfigurieren 0
P Problem "Java Heap Space" Server einrichten und konfigurieren 5
TheJavaKid Cent OS für Java und MySQL konfigurieren Server einrichten und konfigurieren 21
E Ubuntu Java pfad Server einrichten und konfigurieren 5
B Java VM Bezugsquelle Server einrichten und konfigurieren 5
R Java-update auf Debian-Etch Server einrichten und konfigurieren 11
I Beurteilung der Serverausstattung für JAVA Programm Server einrichten und konfigurieren 10
F Weblogic und Java 1.5 parallel GC sinvoll? Server einrichten und konfigurieren 3
G VServer Java Server einrichten und konfigurieren 19
M MySQL/Tomcat mit java.net.SocketException "Broken Pipe& Server einrichten und konfigurieren 1
V Java-Klasse mit Tomcat starten (kein Servlet) Server einrichten und konfigurieren 5
S Java und CGI Server einrichten und konfigurieren 2
J tools.jar fehler ::: java.lang.RuntimeException Server einrichten und konfigurieren 14
M Günstigen Applikation Server? Server einrichten und konfigurieren 5
M Ganz simples Backend Mock...womit? Server einrichten und konfigurieren 5

Ähnliche Java Themen


Oben