Angenommen, ich habe eine REST-API, die auch zum Festlegen / Zurücksetzen von Kennwörtern verwendet wird. Nehmen wir auch an, dass dies über HTTPS-Verbindungen funktioniert. Gibt es einen guten Grund, dieses Passwort nicht in den Aufrufpfad zu schreiben? Sagen wir auch, dass ich es in BASE64 verschlüsseln werde?
Ein Beispiel wäre, ein Passwort wie folgt zurückzusetzen:
http://www.example.com/user/joe/resetpassword/OLDPASSWD/NEWPASSWD
Ich verstehe, dass BASE64 keine Verschlüsselung ist, aber ich möchte in diesem Fall nur das Passwort für das Schulter-Surfen schützen.
resetpassword/OLDPASSWD/NEWPASSWD
es sich nicht um eine Ressource handelt. Es ist ein Aufruf eines Prozesses. Sie müssen nicht alles in eine URL einfügen.Antworten:
Ein guter Server protokolliert alle an ihn gesendeten Anforderungen, einschließlich URLs (häufig ohne variablen Teil nach '?'), Quell-IP, Ausführungszeit ... Soll dieses Protokoll wirklich (möglicherweise von einer großen Gruppe von Administratoren gelesen) enthalten sein Kritisch sichere Infos als Passwörter? Base64 ist kein Stopper gegen sie.
quelle
Was Sie vorschlagen, ist weder sicher noch restvoll.
@Netch hat das Problem mit den Protokollen bereits erwähnt, aber es gibt auch ein anderes Problem, bei dem Sie Passwörter anzeigen, die über HTTP gesendet werden, was es trivial macht, Passwörter mit jeder Art von Wire Sniffer oder Man-in-the-Middle-Angriff zu erfassen.
Wenn Sie eine GET-Anforderung mit REST ausführen, stellen die verschiedenen Elemente in der URL feinkörnigere Elemente dar. Ihre URL sieht so aus, als würden Sie einen NEWPASSWD-Teil eines OLDPASSWD zurückgeben, der Teil eines Reset-Passworts ist. Das ergibt keinen semantischen Sinn. GETs sollten nicht zum Speichern von Daten verwendet werden.
Sie sollten so etwas tun:
POST, weil Sie Daten schreiben, und https, weil Sie nicht möchten, dass sie abgehört werden.
(Dies ist wirklich die Low-Bar-Sicherheit. Das absolute Minimum, das Sie tun sollten.)
quelle
/user/joe/password
ist ein wenig besser , aber nicht optimal.PUT
, weilPUT
es idempotent ist. Wurde das Kennwort jedoch erfolgreich von geändertsecret
,supersecret
schlägt dieselbe Anforderung beim zweiten Mal fehl. DaherPOST
ist dies hier richtig. Natürlich ist diese Ressource, wie @whirlwin sagte, nicht gut benannt.Die vorgeschlagene Regelung weist in mehreren Bereichen Probleme auf.
Sicherheit
URL-Pfade werden häufig protokolliert. Das Einfügen von nicht gehashten Passwörtern in den Pfad ist eine schlechte Praxis.
HTTP
Authentifizierungs- / Autorisierungsinformationen sollten in der Kopfzeile der Autorisierung angezeigt werden. Oder möglicherweise für browserbasierte Inhalte den Cookie-Header.
SICH AUSRUHEN
Verben wie
resetpassword
in Ihrer URL sind im Allgemeinen ein deutliches Zeichen für ein nichtrepräsentatives Zustandsübertragungsparadigma. Eine URL sollte eine Ressource darstellen. Was bedeutet es für GETresetpassword
? Oder LÖSCHEN?API
Für dieses Schema muss immer das vorherige Kennwort bekannt sein. Sie werden wahrscheinlich mehr Fälle zulassen wollen; zB das Passwort ist verloren.
Sie können die Standardauthentifizierung oder die Digestauthentifizierung verwenden , bei denen es sich um allgemein bekannte Schemata handelt.
Es werden keine hochsensiblen Informationen in den Pfad eingefügt, und es werden HTTP- und REST-Konventionen befolgt.
Wenn Sie einen anderen Autorisierungsmodus zulassen müssen (z. B. einen Token, der über einen überprüften Kanal gesendet wurde, um das Kennwort zurückzusetzen), können Sie einfach einen anderen Autorisierungsheader verwenden, ohne etwas anderes ändern zu müssen.
quelle
Abgesehen von der Sicherheit besteht das Problem darin, dass es sich nicht um einen sehr restvollen Ansatz handelt.
OLDPASSWD
undNEWPASSWD
stehe nicht für irgendetwas in deiner Ressourcenhierarchie und noch schlimmer, die Operation ist nicht idempotent.Sie können also nur
POST
als Verb verwenden und sollten die beiden Kennwörter nicht in Ihren Ressourcenpfad aufnehmen.quelle
PUT
als Verb disqualifiziert. Es könnte umgestaltet werden, um damit zu arbeiten,PUT
aber in seiner jetzigen Form ist dies nicht der Fall.Das Problem ist, Klartext-Passwörter in Ihren Anfragen zu vermeiden. Es gibt zwei Möglichkeiten, um die Restful-Webservice-Anforderungen zu erfüllen.
1. Client-Side-Hashing
2. Verschlüsselung
Hinweis: Für beide Optionen ist HTTPS erforderlich!
quelle
Was sind die Merkmale eines Passwort-Reset-Vorgangs?
Punkt 1 bedeutet hier, dass Sie GET nicht verwenden können. Sie müssen entweder etwas, das die Kennwortänderungsoperation darstellt, in einen URI POSTEN, der eine Ressource darstellt, die Kennwortänderungen behandelt, oder etwas, das das neue Kennwort darstellt, in einen URI PUTEN, der das Kennwort darstellt oder etwas darstellt (z. B. den Benutzer), dessen Passwort ein Merkmal ist.
Im Allgemeinen würden wir POSTEN, nicht zuletzt, weil es unangenehm sein kann, etwas zu schreiben, das wir später nicht bekommen können, und natürlich können wir das Passwort nicht bekommen.
Punkt 2 werden daher Daten sein, die das neue Passwort darstellen, in dem was gepostet wird.
Punkt 3 bedeutet, dass wir die Anfrage autorisieren müssen. Wenn der Benutzer der aktuelle Benutzer ist, muss das aktuelle Kennwort überprüft werden (es muss jedoch nicht unbedingt das aktuelle Kennwort erhalten werden, wenn z. B. eine hashbasierte Abfrage vorliegt wurde verwendet, um das Wissen darüber zu beweisen, ohne es zu senden).
Die URI sollte daher so ähnlich wie
<http://example.net/changeCurrentUserPassword>
oder sein<http://example.net/users/joe/changePassword>
.Möglicherweise möchten wir das aktuelle Kennwort sowohl in den POST-Daten als auch im verwendeten allgemeinen Autorisierungsmechanismus erhalten.
quelle