Es ist kein Problem, weil Sie die Echtheit des Cookies überprüfen können. Facebook enthält einen Wert namens sig mit jedem Cookie. Ich werde nicht auf alle Details eingehen, aber im Grunde, fügen Sie Ihr API-Geheimnis an den Cookie an, entfernen Sie den sig-Wert, hacken Sie den Cookie-Wert und verifizieren Sie, dass der Hash mit dem sig übereinstimmt. Da Sie und Facebook die einzigen sind, die den Wert des API-Geheimnisses kennen, können Sie sicher sein, dass der Cookie nicht manipuliert wurde.
Die andere Seite der Dinge, der Benutzer, der den Inhalt des Kekses betrachtet, spielt keine Rolle. Der Cookie enthält nur ein Zugriffstoken, das diesem Benutzer zugeordnet ist. Wenn der Benutzer versucht, den Cookie zu manipulieren, wird nur das Cookie ungültig. Und ihr Zugangstoken ermöglicht ihnen ohnehin nur den Zugriff auf ihr eigenes Konto.
Das Wichtigste ist zu überprüfen, ob der Cookie authentisch ist. Viele Leute tun das nicht und verursachen große Sicherheitsprobleme. Zum Beispiel enthält das Cookie die Facebook-Benutzer-ID. Sagen wir, ich bekomme diese Benutzer-ID und frage dann meinen Benutzer nach seiner Kreditkarte. Wenn ich diese Kreditkarte mit dieser Benutzer-ID speichere, aber das Cookie nicht validiere, könnte jeder reinkommen und den Benutzer-ID-Wert in seinem Cookie ändern und Zugriff auf private Daten erhalten. Wenn ich jedoch das Cookie mit dem API-Geheimnis verifiziere, würde ich wissen, ob der Cookie manipuliert wurde.
Hier ist, wie wir das Cookie in meinem Facebook C# SDK (http://facebooksdk.codeplex.com) validieren:
/// <summary>
/// Validates a session_version=3 style session object.
/// </summary>
/// <param name="session">The session to validate.</param>
protected override void ValidateSessionObject(FacebookSession session)
{
if (session == null)
{
return;
}
var signature = this.GenerateSignature(session);
if (session.Signature == signature.ToString())
{
return;
}
session = null;
}
/// <summary>
/// Generates a MD5 signature for the facebook session.
/// </summary>
/// <param name="session">The session to generate a signature.</param>
/// <returns>An MD5 signature.</returns>
/// <exception cref="System.ArgumentNullException">If the session is null.</exception>
/// <exception cref="System.InvalidOperationException">If there is a problem generating the hash.</exception>
protected override string GenerateSignature(FacebookSession session)
{
var args = session.Dictionary;
StringBuilder payload = new StringBuilder();
var parts = (from a in args
orderby a.Key
where a.Key != "sig"
select string.Format(CultureInfo.InvariantCulture, "{0}={1}", a.Key, a.Value)).ToList();
parts.ForEach((s) => { payload.Append(s); });
payload.Append(this.ApiSecret);
byte[] hash = null;
using (var md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create())
{
if (md5 != null)
{
hash = md5.ComputeHash(Encoding.UTF8.GetBytes(payload.ToString()));
}
}
if (hash == null)
{
throw new InvalidOperationException("Hash is not valid.");
}
StringBuilder signature = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
signature.Append(hash[i].ToString("x2", CultureInfo.InvariantCulture));
}
return signature.ToString();
}
Danke. Ich war so besorgt über den FB-Keks, dass ich übersehen habe, dass jeder andere Keks auch entführt werden kann, was mein Anliegen irrelevant macht, da es meinen ernsteren im Garten gibt! –