Thema Sicherheit bei Facebook:
Es soll (in deutscher Sprache) beschrieben werden, wie eine
Anmeldung an eine facebook-Anwendung funktioniert. Die
Anwendung soll "gleichheit_jg" lauten, eine interne FB-Canvas-Anwendung.
Der Benutzer drückt hierbei z.B. auf einen Verweis(engl.: link), welcher im
unsicheren Internet gefunden wurde,
um eine Anwendung starten zu können. Drei Dinge sind für den Anwender wichtig:
- Die Anwendung ist tatsächlich diejenige, für die es sich mit Namen ausgibt.
Dies hat facebook in der Hand, nämlich die richtige Weiterleitung
anhand vom Anwendungsentwickler intern gespeicherten Einstellungen,
welche ein Hacker von aussen nicht kennen dürfte (Authentifizierung).
- Die Anwendung muss um Zugriffsrechte bitten, welche der Benutzer
steuern kann, dazu kommt ein Dialog, um Datenmissbrauch von privaten
Angaben des Benutzers zu verhindern oder anzuzeigen (Autorisierung).
- Die https-Technologie (SSL) wird eingesetzt, dass ein Lauscher im Netz zwischen
dem Benutzer und facebook die gemachten Eingaben nicht unverschlüsselt
mitlesen (und später benutzen) oder abändern kann, so dass
dann eine andere gefährliche Anwendung stattdessen aufgerufen wird.
Annahme: es wird in der Fb-Anwendung eine existierende php-Seite angegeben.
Es entspricht dem Eintrag "Adresse der Webseite".
Notation:
-------------------------------
FB=facebook
Anwender=Person mit FB-Konto, welche eine FB-Anwendung starten will
Programmierer=Ersteller der Anwendung, Besitzer mehrerer Dateien und
Verwalter der Anwendungs-Einstellungen
API=Application programmer interface, Möglichkeit, Funktionen
auzurufen und Daten lesen zu können
1) Web-Seite mit einem Verweis auf eine FB-Anwendung
Der Verweis, den man aufrufen kann, lautet folgendermassen:
<a href="siehe unten">gleichheit_jg</a>
https://www.facebook.com/dialog/oauth?client_id=178799588928777&redirect_uri=http://juga.lima-city.de/gleichheit_jg.php
Die Angabe vor dem Fragezeichen muss so sein, wenn nicht, liegt Betrugsversuch
vor, dann keine FB-Anwendung !
Die client_id enthält die Identifikation der Anwendung, der Programmierer sieht diese
anhand der Anwendungs-Einstellungen.
Die redirect_uri ist wichtig, weil diese Seite (siehe Schritt 5) dann Informationen
erhält, um auf die FB-API zugreifen zu können. Es sollte deshalb
eine aktive Seite sein, also PHP, nicht nur HTML. Die Seite
muss in der vom Programmierer angegebenen Domäne liegen, um Angriffe
wie cross-Site-Scripting zu unterbinden. Facebook prüft dies !
2)Die Anmeldung von Benutzerkennung
Es kommt folgende Adresse:
https://www.facebook.com/login.php?api_key=178799588928777&skip_api_login=1&display=page&cancel_url=http%3A%2F%2Fjuga.lima-city.de%2Fgleichheit_jg.php%3Ferror_reason%3Duser_denied%26error%3Daccess_denied%26error_description%3DThe%2Buser%2Bdenied%2Byour%2Brequest.&fbconnect=1&next=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fpermissions.request%3F_path%3Dpermissions.request%26app_id%3D178799588928777%26client_id%3D178799588928777%26redirect_uri%3Dhttp%253A%252F%252Fjuga.lima-city.de%252Fgleichheit_jg.php%26display%3Dpage%26response_type%3Dcode%26fbconnect%3D1%26from_login%3D1&rcount=1
Es wird also ein "sicherer" https-Dialog gemacht, der FB-Anwendungsname und
zwei Eingabefelder angezeigt. Die Adresse ist lang, weil auch Informationen
drin sind, wenn die Anmeldung nicht geklappt hat (Falsches Benutzerkonto
oder Passwort). Mit dem Parameter display= sieht man, welchen Gerätetyp
der Aufrufer hat (page=normaler PC, touch=iPhone/Android etc).
3) Es kommt eine Rückfrage über eine Identifikation des
Anmeldegerätes
Dies ist optional und erscheint, falls man "login-Notifications" an hat, es dient aber der Sicherheit. Denn bei fehlgeschlagenen
Anmeldeversuchen auf das FB-Konto (z.B von Unbefugten) meldet FB
dann beim nächsten erfolgreichen Versuch, bei welchem Gerät (möglichst
mit Standort) es nicht funktioniert hat, was Angriffsversuche aufzeigen
kann.
https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fpermissions.request%3F_path%3Dpermissions.request%26app_id%3D178799588928777%26client_id%3D178799588928777%26redirect_uri%3Dhttp%253A%252F%252Fjuga.lima-city.de%252Fgleichheit_jg.php%26display%3Dpage%26response_type%3Dcode%26fbconnect%3D1%26from_login%3D1&isfbconnect=1
4) Dann kommt die Frage nach den Berechtigungen, die die Anwendung haben will
Eine Anwendung braucht Berechtigungen, um auf Daten des Benutzers
wie Freunde, Photos oder Veranstaltungen zugreifen zu können. Diese
müssen der Anwendung also hier gegeben werden.
https://www.facebook.com/dialog/permissions.request?_path=permissions.request&app_id=178799588928777&client_id=178799588928777&redirect_uri=http%3A%2F%2Fjuga.lima-city.de%2Fgleichheit_jg.php&display=page&response_type=code&fbconnect=1&from_login=1
Hat man der Anwendung einmal Berechtigung gegeben, kommt dieser Dialog später
nicht mehr, ausser die Anwendungen will neue Rechte als bisher haben.
Um z.B. noch auf Gruppen und Ereignisse zugreifen zu können (falls
der Programmierer dies nicht in den bisherigen Eintragungen hatte), ist
noch folgendes zu tun (Opt-In-Verfahren, Angabe von scope):
https://graph.facebook.com/oauth/authorize?client_id=178799588928777&redirect_uri=http://juga.lima-city.de/gleichheit_jg.php&scope=user_groups,user_events
Hierbei gibt es drei inhaltliche Kategorien,
Veröffentlichungsberechtigungen wie publish_stream,
Datenberechtigungen Benutzer wie z.B. user_groups und
Datenberechtigungen Freunde wie z.B. friends_groups.
5) Bei Bestätigung mit ja kommt folgendes
Es wird die bei Schritt 1 angegebene Adresse (redirect_uri) aufgerufen,
welche im Besitz des Anwendungsprogrammierers ist.
http://juga.lima-city.de/gleichheit_jg.php?code=AQDZWxmTABfBifnk7wH2Oir2X1Vgj4Pa2AK2FdujnYa6lRhDX9juQ84eD2SCsChzA1-CVkwjWmBdQ-xEKHb0sHxuH4abTUVaqh8SsVSabIbZ8TkT2Q_Xntv4GPz464OobEMHKNU81oLMGQc8rHa4cBM73YYo-a55CyvBqZyCFLEyl9ENPNtO_QzmxASuAJ_IuBRpgYFO-AcAYrDbS_KhEopp#_=_
Hier liegt dann ein temporärer Schluessel vor (Verifizierungscode). Dieser
ist nur im Zusammenhang mit der Anwendung+Benutzer gültig, und
wird bei neuer Anmeldung neu von FB generiert.
6) Zugriffsschlüssel für die FB-API
Mit dem Code von Schritt 5 und dem geheimen API-Schlüssel
kann diese Seite nun einen Zugriffsschlüssel für die API generieren.
Dazu muss eine Anfrage an folgende Adresse erfolgen:
https://graph.facebook.com/oauth/access_token?client_id=178799588928777&redirect_uri=http%3A%2F%2Fjuga.lima-city.de%2Fgleichheit_jg.php&code=xx&client_secret=yy
Die Rückgabe ist eine JSON-Struktur (access_token=zz).
HTML-Format sollte man deshalb nicht für die "redirect_uri"-Seite verwenden,
weil man sonst "client_secret" beim Aufruf in einem Browser erkennen
kann (nicht in der Anzeige, sondern im Quelltext) und von dort eine Abfrage einer www.facebook.com-Seite über AJAX
wegen Sicherheitsbeschränungen scheitern wird (same-origin-policy),
da der Anwendungsprogrammierer ja eine andere Domäne nutzt. Es bietet
sich also PHP an, was man z.B. auf lima-city.de oder heroku kostenlos
verwenden kann.
7) Anwendung nutzt API
Die Anwendung auf der redirect_uri-Seite kann sich nun Informationen zu
dem Benutzer über die API holen, der die Anwendung gerade gestartet hat. Den access-token
muss man hierbei mitgeben oder als Cookie speichern.
https://graph.facebook.com/me/friends?access_token=xy
Ist der access_token nicht gültig oder fehlt, wird bei obigem Aufruf
ein Authentifizierungsfehler erzeugt, also HTTP-Fehler 4xy.
Da FB einige sicherheitsrelevante Daten in den sog. Cookies speichert,
sollten nach Abmeldung diese Cookies gelöscht bzw. überschrieben werden.
Literatur:
Andre Wussow, "Facebook-Applikationsentwicklung", Data-Becker-Verlag (ohne Jahresangabe)
Michael Kamleitner, "Facebook-Programmierung", Galileo Verlag 1.Auflage 2012