• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Eigene API Sicherheit

yss

Mitglied
Hallo Leute

Ich muss für ein Schulprojekt eine API schreiben, mit der es erstens möglich ist, verschiedene Daten aus der Datenbank auszulesen und zweitens auch Daten in die Datenbank einzutragen.

Die meisten bekannten APIs benutzen für das auslesen der Daten einen API-Code, den ich als Parameter bei der Anfrage an das PHP-Skript mitschicke. Doch dieser Code kann ganz einfach ausgelesen werden und somit ist die API nicht vor fremden Zugriff geschützt, was allerdings mein Ziel ist.
Beim Eintragen der Daten ist es natürlich noch schwieriger. Die "Eintrag-API" wird nur aus einem Bereich geöffnet, der mit einem Login gesichert ist und somit nur für Administratoren zugänglich. Trotzdem sollte die API geschützt sein.

Wie löst Ihr solche Probleme? Habt Ihr gute Vorschläge/Ideen wir ich die API schützen kann?
 
Werbung:
Ist der API-Code nur serverseitig auslesbar oder auch clienseitig?

Um welche Programmiersprache/n handelt es sich denn?

Ich gehe mal davon aus, dass der API-Code an den Client geschickt wird. Obwohl ich noch kein API geschrieben habe, denke ich du solltest dein Konzept nochmal etwas überdenken.

Rein instinktiv würde ich es jetzt (mit PHP) so machen:

Server1 (Homeserver) meldet sich bei Server2 (API-Server) an:
PHP:
session_start();
$api = new DeineAPI();
$token = $api->getAuthToken('dein-api-code');
$_SESSION['api_token'] = $token;

Dein API musst du natürlich noch um die Funktion getAuthToken erweitern. Ich möchte es dir nur grob erklären. In dieser Anfrage wird nun auf Server2 eine Art Session erstellt. Hier wird also bspw ein Datensatz in eine Datenbank geschrieben mit Ablaufdatum und ein zugehöriger 'token' generiert. Durch diesen 'token' kann Server2 nun alle Anfragen identifizieren.

Bei jeder API-Anfrage wird nun zuerst von Server2 überprüft, ob der Datensatz noch nicht abgelaufen ist und ob er auch existiert.

Wenn NEIN, lehne Anfrage ab.
Wenn JA, verarbeite Anfrage und verlängere Ablaufdatum des 'token'.

So haben wir grob schonmal die Anmeldung von Server1 bei Server2 konstruiert. Ab sofort, identifiziert Server2 Server1 nicht mehr mit dem API-Code, sondern mit dem 'token'.

Wenn du jetzt eine Funktion in deiner API ausführen willst, machst du das so:

PHP:
$result = $api->insertRow($_SESSION['api_token'],weitere variablen);

Ich hoffe es ist einigermaßen Verständlich.

Vom Prinzip her funktioniert es immer gleich, egal welche Programmiersprachen du nutzt. Allerdings muss alles serverseitig passieren.

So könnte es dann insgesamt aussehen:

PHP:
session_start();
$api = new DeineAPI();

if(!$api->istAngemeldet()) { // true or false
     $token = $api->getAuthToken('dein-api-code');
     $_SESSION['api_token'] = $token;
     $api->setAuthToken($token); // token speichern, damit du ihn nicht bei jeder Aktion als Parameter übergeben musst.
} else {
     $api->setAuthToken($_SESSION['api_token']);
}

$api->insertRow(blablabla);

Jetzt hoffe ich nur noch dass ich keinen Mist erzähle :)
 
Auf die API soll Clientseitig mit AJAX und HTTP-Requests aus einer iPhone App zugegriffen werden.

Mein theoretischer Ansatz wäre so:
Beim Login der User bekommt man 2 Cookies, eins mit der BenutzerID, welches die E-Mail in MD5 ist und einen tempKey, welcher vom Server generiert wurde und in der Datenbank steht. Bei einer Abfrage der API werden die BenutzerID und der tempKey mitgesendet und überprüft, ob beide gültig sind. Wenn ja, wird die Anfrage der API verarbeitet und beim zurückgeben der Daten wird ein neuer tempKey für die nächste Abfrage generiert und Clientseitig wieder in einem Cookie gespeichert. Alle Anfragen werden über HTTPS und POST versendet, somit können die Keys unterwegs nicht mitgelesen werden.
 
Zuletzt bearbeitet:
Werbung:
In dem Fall sollte es so ungefähr funktionieren:

App an API-Server: Anmeldung mit Benutzername und Passwort.
API-Server an App: Rückgabe des Session-Tokens.
App an API-Server: Bei jeder Aktion wird nun zur Identifikation der Session-Token mit übermittelt. Wenn der Token noch gültig ist -> Anfrage durführen. Wenn nicht -> Nochmal mit Benutzer und PW anmelden.

Edit:
Achso, du weißt theoretisch ja ohnehin schon was du willst.
 
Zuletzt bearbeitet:
Ja so ungefähr hatte ich es mir auch gedacht. Wenn ich alles über HTTPS übertrage sollte es auch relativ sicher sein.
 
Zurück
Oben