2009-03-04 5 views
2

Wenn sich ein Benutzer in unserer Struts-Anwendung anmeldet, möchten wir ihm eine E-Mail mit einem Link zu einer anderen Seite senden. Der Link muss einen eindeutigen Bezeichner in seiner Abfragezeichenfolge enthalten, damit die Zielseite den Benutzer identifizieren und entsprechend reagieren kann.Was ist der beste Weg, um eine Abfragezeichenfolge mit Java zu sichern?

Um die Sicherheit dieses Systems zu verbessern, möchte ich zuerst die Abfragezeichenfolge mit dem Bezeichner verschlüsseln und zweitens den Link zum Ablaufen setzen - nach der Nutzung und/oder nach ein paar Tagen.

Welche Java-Technologien/Methoden würden Sie vorschlagen, um dies zu tun?

Antwort

4

Ich werde einige Annahmen über Ihre Sorgen machen:

  1. Ein Benutzer nicht in der Lage sein soll, eine anderen Benutzer URL zu erraten.
  2. Einmal verwendet, sollte eine URL nicht wiederverwendbar sein (Vermeidung von Session Replay Attacken.)
  3. Ob eine URL verwendet wird oder nicht, sollte nicht ewig leben, so Brute-Force-Sondierung zu vermeiden.

Hier ist, wie ich es tun würde.

  • Behalten Sie die Benutzer-ID und den Ablaufzeitstempel in einer Tabelle.
  • Verketten Sie diese in eine Zeichenfolge und machen Sie dann einen SHA-1-Hash daraus.
  • Generieren Sie eine URL mit dem Hash-Wert SHA-1. Ordnen Sie alle diese URLs einem Servlet zu, das die Validierung durchführt.
  • Wenn Ihnen jemand eine Anfrage für eine Seite mit dem Hash sendet, verwenden Sie diese, um den Benutzer und den Ablauf zu suchen.
  • Nachdem der Benutzer die Zielseite ausgeführt hat, markieren Sie die Zeile in der Datenbank als "used".
  • Führen Sie jeden Tag einen Job aus, um Zeilen zu löschen, die entweder verwendet wurden oder deren Verfallsdatum überschritten wurde.
+0

Dies ist ein guter Ansatz. Ich würde jedoch lieber eine zufällige 128-Bit-Kennung wählen, als Hashing. Es ist einfacher und genauso sicher, wenn nicht noch mehr. – erickson

+0

Ich stimme zu. Keine Notwendigkeit für den Hash. Wenn es zufällig ist, kann der Schlüssel nur über die Datenbanktabelle zurückentwickelt werden. – banjollity

+0

Gute PunkteMerickson & Bonjollity. Ich nehme an, ich habe den Hasch einfach aus Reflex genommen. – mtnygard

2

Für den ersten Teil schauen Sie sich Generating Private, Unique, Secure URLs an. Für den Ablauf müssen Sie lediglich den eindeutigen Zeitstempel für die Schlüsselerstellung in der Datenbank speichern und die Ausführung Ihrer Aktion nur dann zulassen, wenn beispielsweise now-keyCreatedAt < 3 Tage. Eine andere Möglichkeit besteht darin, einen Cron- oder Quartz-Job zu verwenden, der regelmäßig die Zeilen löscht, die für "now-keyCreatedAt < 3 Tage" den Wert "true" aufweisen.

0

Ich denke, dass Sie dies in einer zustandslosen Weise tun können, dh ohne die Datenbanktabelle, die andere vorschlagen.

  • Wie mtnygard vorschlägt, machen Sie einen SHA-1-Hash der URL-Parameter UND eine geheime Salzkette.
  • Fügen Sie den Hash-Wert als erforderlichen Parameter für die URL hinzu.
  • Senden Sie die URL in der E-Mail.
  • Wenn der Anwender auf die URL:

    • die Integrität der URL überprüfen, indem die Hash-Berechnung erneut, und auf der URL zu dem einen den berechneten Wert vergleicht.
    • Solange Sie Ihre geheime Salzkette nie preisgeben, wird niemand in der Lage sein, Anfragen an das System zu schmieden. Im Gegensatz zu den anderen Vorschlägen verhindert dies jedoch nicht, dass eine alte URL erneut wiedergegeben wird. Das kann oder kann nicht wünschenswert sein, abhängig von Ihrer Situation.