2010-03-07 3 views
16

Ich bin hier wahrscheinlich ein totaler Noob, aber ich bin immer noch unsicher, was genau ein CSRF (Cross-Site Request Forgery) Angriff ist. Sehen wir uns also drei Situationen an ...Besteht das Risiko von CSRF-Angriffen in einem POST-Formular, bei dem der Benutzer nicht angemeldet sein muss?

1) Ich habe ein POST-Formular, das ich verwende, um Daten auf meiner Website zu bearbeiten. Ich möchte, dass diese Daten bearbeitet werden nur von Benutzern, die eingeloggt sind.

2) Ich habe eine Website, die sowohl von Benutzern, die angemeldet sind, als auch Gäste verwendet werden können. Teile der Seite sind nur für eingeloggte Benutzer, aber es gibt auch POST-Formulare, die von allen Benutzern verwendet werden können - anonym und nicht (zum Beispiel ein Standard-Kontaktformular). Sollte das Kontaktformular vor CSRF-Angriffen geschützt werden?

3) Ich habe eine Seite, die überhaupt kein Authentifizierungssystem hat (naja, vielleicht ist das unrealistisch, also sagen wir, es hat eine Admin-Seite, die vom Rest getrennt ist und der Admin-Teil ist gut geschützt)). Der Hauptteil der Website wird nur von anonymen Benutzern verwendet. Müssen die POST-Formulare darauf gesichert werden?

Im Fall von 1) ist die Antwort eindeutig ja. Aber im Fall von 2 und 3 weiß ich nicht (und ist der Unterschied zwischen 2 und 3 sogar signifikant?).

Antwort

32

Es gibt mittels CSRF, wenn bösartige HTML oder JavaScript, die auf Ihre Website ausgerichtet ist, in andere HTML-Seite (oder eine E-Mail-Nachricht) eingebettet worden, die erfolgreich ausgeführt worden ist.

Ein Beispiel ist die folgende, die in einer anderen Webseite platziert worden ist, die für Ihren Namen und Alter, bevor Sie fortfahren unschuldig fragt:

<form action="http://yoursite.com/transferfunds" method="post"> 
    Your name: <input type="text"><br> 
    Your age: <input type="text"><br> 
    <input type="submit"> 
    <input type="hidden" name="amount" value="1000"> 
    <input type="hidden" name="toaccount" value="12345678"> 
</form> 

Beachten Sie, dass die Aktionspunkte auf Ihre Website und dass die verborgenen Eingänge enthält die benötigten POST-Informationen. In diesem Beispiel wird versucht, einen Geldbetrag von 1000 (in welcher Währung) an die Kontonummer 12345678 zu überweisen. Wenn Sie eine Anmeldung auf Ihrem Formular benötigen und dies auch tatsächlich überprüfen, wird das obige Verfahren natürlich nur erfolgreich ausgeführt, wenn der nicht ahnende Benutzer dies getan hat kürzlich auf Ihrer Website eingeloggt, aber noch nicht ausgeloggt oder die Sitzung ist noch nicht abgelaufen.

Um dies zu vermeiden, fügen Sie am besten ein anforderungsbasiertes Token zum Formular hinzu und validieren es auf der Serverseite. I.e. Erstellen Sie eine lange, eindeutige und unmöglich zu erratende zufällige Zeichenfolge, die Sie in der Sitzung speichern und als <input type="hidden"> Element des Formulars einbetten. Wenn das Formular gesendet wird, vergleichen Sie den übergebenen Token-Wert mit dem Wert, der bereits in der Sitzung ist (und entfernen Sie sofort den in der Sitzung). Um einen Schritt weiter zu gehen, verwenden Sie eine CAPTCHA.

In Ihrem speziellen Fall, ich denke, Sie sind tatsächlich beunruhigender über XSS, die ein Gegenstück von CSRF ist, aber die wiederum kann auch eine Quelle für CSRF sein. Ein Beispiel für XSS ist, wenn der Benutzer die folgenden in einem Eingabefeld eingibt, die früher oder später auf der gleichen Website werden wird erneut angezeigt:

<form name="delete" action="admin/deleteusers" method="post"></form> 
<script>document.form.delete.submit();</script> 

Jedes Mal, wenn Sie die Administrator- -wie ist die Seite mit dem Kommentar Ansichten Mit der (unsichtbaren!) Form und dem Skript innerhalb, wird es erfolgreich ausgeführt.

Verhindern XSS ist eigentlich ziemlich einfach. Just HTML-escape jede Benutzer-gesteuerte Eingabe (d. H. URL, Anfrage Header, Anfrage Parameter und Anfrage Körper), bevor sie auf der Webseite angezeigt werden.In PHP können Sie hierfür htmlspecialchars() verwenden und in JSP/JSP die JSTL fn:escapeXml(). Auf diese Weise wird unter < in &lt; und > in &gt; umgewandelt, was dazu führen wird, dass alle eingegebenen HTML/JS im Wortsinne unverändert angezeigt werden und somit nicht ausgeführt werden können.

+0

Danke - sehr hilfreich :) (Obwohl ich nicht speziell gefragt habe, fand ich den Vergleich mit XSS sehr nützlich :)) Wenn ich richtig verstehe, dann möchte ich vielleicht CSRF in etwas wie ein Kontaktformular verwenden, um zu helfen in Spambot Prävention, oder? –

+1

Ein anforderungsbasierter Token und/oder ein Captcha ist der beste Ansatz. Es ist unklar, was Ihre Webapp-Programmiersprache ist. Ich habe Ihren Frageverlauf überprüft und schätze, dass Sie auf Python abzielen. Sie können dann http://captchas.net nützlich finden. Die Site enthält ein Python-Beispiel. – BalusC

+0

Danke, tolle Antworten :) Ich denke, ich weiß mehr oder weniger, wie ich dies in meiner Technologie der Wahl (das Django-Framework) implementieren kann. War nur unklar über die Art des Angriffs selbst. –

Verwandte Themen