Frage

Wir arbeiten derzeit an einem sehr einfachen Webapp, und wir möchten „verschleiern“ (was der richtige Begriff wäre?) Oder kodieren irgendwie die Anfrageparameter, so dass wir die Chance reduzieren ein Leerlauf Benutzer willkürlich Daten sendet.

Zum Beispiel der URL sieht aus wie /webapp?user=Oscar&count=3

Wir möchten, dass somthing haben wie:. /webapp?data=EDZhjgzzkjhGZKJHGZIUYZT und haben, dass in dem Server mit der realen Anfrage Info decodiert Wert

Bevor so etwas wie diese selbst (und wahrscheinlich etwas falsch gemacht) gehe in der Umsetzung Ich würde gerne wissen, ob es etwas gibt, das schon zu tun?

Wir haben Java auf dem Server und JavaScript auf dem Client.

War es hilfreich?

Lösung

Nein, tut dies nicht. Wenn Sie etwas in Ihrem Client-Code bauen die Daten zu verschleiern an den Server, die übertragen zurück, dann kann so einen vorsätzlichen Hacker. Sie können nicht einfach Vertrauen Daten, die auf dem Server, egal, was Ihr offizielles Client tut gesendet. Stick an Kundendaten zu entkommen und es gegen eine weiße Liste auf der Serverseite Validierung . SSL verwenden, und wenn Sie können, setzen Sie Ihre Anfrage Parameter in einer POST anstelle von GET.

Expansion bearbeiten

Ihre Verwirrung ergibt sich aus dem Ziel, Nutzer zu sperren vor Manipulation mit Anforderungsdaten, die mit dem erforderlichen Standard-Sicherheitsmaßnahmen. Standard-Sicherheitsmaßnahmen für Web-Anwendungen beinhalten die Verwendung einer Kombination von Authentifizierung, Berechtigung und Session-Management, Audit-Trails, Datenvalidierung und sichere Kommunikationskanäle.

Verwenden von SSL den Client nicht verhindern, dass mit der Datenmanipulation, aber es hindert mittlere Männer nicht sehen oder mit ihm Manipulation. Er weist auch gut erzogene Browser keine sensiblen Daten in der URL-Geschichte cachen.

Es scheint, dass Sie irgendeine Art von einfacher Web-Anwendung, die keine Authentifizierung hat, und läuft um Anforderungsparameter, die es direkt im GET steuern und damit einige nicht technisch versierten Menschen wahrscheinlich, dass user=WorkerBee herausfinden konnte, können einfach geändert werden user=Boss in ihrer Browserleiste, und so können sie Daten zugreifen, die sie nicht sehen sollen, oder tun Dinge, die sie nicht tun sollen. Ihr Wunsch (oder Ihr Kunde den Wunsch), um diese Parameter zu verschleiern, ist naiv, da es nur die wenigsten technisch versierte Person vereiteln wird. Es ist eine unausgegorene Maßnahme und der Grund, warum Sie nicht eine vorhandene Lösung gefunden haben, ist, dass es kein guter Ansatz ist . Du bist besser dran Zeit der Umsetzung ein anständiges Authentifizierungssystem mit einem Audit-Trail für eine gute Maßnahme zu verbringen (und wenn dies ist in der Tat, was Sie tun, Zeichen Gary Antwort als korrekt).

Also, um es einpacken:

  1. Sicherheit durch Verschleierung ist nicht Sicherheit überhaupt.
  2. Sie können nicht vertrauen Benutzerdaten, auch wenn es verdeckt. Validate Ihre Daten .
  3. Die Verwendung von sicheren Kommunikationskanälen (SSL) hilft andere verwandte Bedrohungen zu blockieren.
  4. Sie sollte Ihr Ansatz aufgeben und tun das Richtige. Das Richtige, in Ihr Fall bedeutet wahrscheinlich eine Zugabe Authentifizierungsmechanismus mit einem Berechtigungssystem zu Verhindern, dass Benutzer der Zugriff auf Dinge, die sie nicht privilegiert genug, um zu sehen - einschließlich Dinge, die sie für den Zugriff versuchen könnten durch Manipulation mit GET-Parameter. Gary R Antwort sowie Dave und Wills Kommentar Hit dieser auf dem Kopf.

Andere Tipps

Wenn es Ihr Ziel ist „senden willkürlich Daten die Chance zu verringern, eine Leer Benutzer,“ es gibt einen anderen einfacheren Ansatz, den ich versuchen würde. Machen Sie einen privaten Verschlüsselungsschlüssel und speichern Sie es in Ihrem Anwendungsserver Seite. Jedes Mal, wenn Ihre Anwendung eine URL erzeugt, erstellen Sie einen Hash der URL Ihrer privaten Verschlüsselungsschlüssel verwenden und dass Hash in dem Query-String setzen. Jedes Mal, wenn ein Benutzer eine Seite mit den Parametern in der URL-Anforderungen, neu berechnen den Hash und sehen, ob sie paßt. Dies gibt Ihnen eine gewisse Sicherheit, dass Ihre Anwendung die URL berechnet. Es wird Ihre Abfrage-String-Parameter lesbar obwohl verlassen. In Pseudo-Code,

SALT = "so9dnfi3i21nwpsodjf";

function computeUrl(url) {
  return url + "&hash=" + md5(url + SALT );
}

function checkUrl(url) {
  hash = /&hash=(.+)/.match(url);
  oldUrl = url.strip(/&hash=.+/);
  return md5(oldUrl + SALT ) == hash;
}

Wenn Sie versuchen, Zugriff auf die Daten zu beschränken dann mit einem Cookie eine Art von Login-Mechanismus verwenden, um eine Single Sign On-Authentifizierungsschlüssel bereitstellt. Wenn der Client das Cookie mit dem Schlüssel sendet dann können sie die Daten in Übereinstimmung mit den Behörden manipulieren, die mit ihrem Konto (admin, Öffentliche Benutzer usw.). Gerade in Spring Security, CAS usw. für einfach zu bedienen Implementierungen dieser in Java. Die Token in den Cookie erzeugten sind in der Regel mit dem privaten Schlüssel des ausstellenden Servers verschlüsselt und sind in der Regel manipulationssicher.

Alternativ, wenn Sie Ihr öffentlicher Benutzer wollen (nicht authentifiziert) in der Lage sein, einige Daten zu Ihrer Website zu veröffentlichen, dann ist alle Wetten ab. Sie müssen auf der Server-Seite überprüfen. Dieses Mittel den Zugriff auf bestimmte URIs zu beschränken und dafür sorgen, dass alle Eingaben gereinigt wird.

Die goldene Regel ist hier nicht zulassen alles, außer Material, das Sie wissen, ist sicher.

Wenn das Ziel es „statische“ URLs zu verhindern, manipuliert zu werden, dann können Sie einfach die Parameter verschlüsseln, oder sie unterschreiben. Es ist wahrscheinlich, „sicher genug“, um tack auf einem MD5 der URL-Parameter, zusammen mit etwas Salz. Das Salz kann eine zufällige Zeichenfolge in der Session gespeichert sein, sagen.

Dann können Sie einfach:

http://example.com/service?x=123&y=Bob&sig=ABCD1324

Diese Technik, die Daten freigibt (das heißt, sie „sehen“ kann, dass xyz = 123), aber sie können nicht die Daten ändern.

Es gibt einen Vorteil von „Verschlüsselung“ (und ich verwende diesen Begriff lost). Hier können Sie den gesamten Parameterbereich der URL verschlüsselt werden.

Hier können Sie so etwas wie:

http://example.com/service?data=ABC1235ABC

Die nette Sache über Verschlüsselung ist zweifach.

Eine schützt die Daten (sie Benutzer nie das xyz = 123, zum Beispiel sehen).

Das andere Merkmal Tho ist, dass es erweiterbar:

http://example.com/service?data=ABC1235ABC&newparm=123&otherparm=abc

Hier können Sie die ursprüngliche Nutzlast dekodieren, und machen Sie einen (sicheren) merge mit den neuen Daten.

So, Anfragen können Daten ADD auf die Anforderung, nur nicht vorhandene Daten geändert werden.

Sie können über die Unterzeichnung Technik das gleiche tun, würden Sie brauchen nur die gesamte Anfrage in zu einem einzigen „Blob“, konsolidieren und dass blob implizit unterzeichnet. Das ist „effektiv“ verschlüsselt, nur eine schwache Verschlüsselung.

Natürlich wollen Sie nicht irgendetwas davon auf dem Client zu tun. Es hat keinen Sinn. Wenn Sie es tun können, „sie“ kann es tun, und Sie können den Unterschied nicht erkennen, so können Sie auch nicht, dass es überhaupt tun - es sei denn, Sie über eine normale HTTP-Port zu „verschlüsseln“ Daten wollen (vs TLS, aber dann werden die Leute klug fragen, „warum die Mühe“).

Für Java, all diese Arbeit geht in einem Filter, das ist der Weg ich es tat. Das hintere Ende wird von diesem isoliert.

Wenn Sie möchten, können Sie das hintere Ende vollständig von diesem mit einem Outbound-Filter, der Griffe der URL-Verschlüsselung / Signierung auf dem Weg.

isoliert machen

Das ist auch das, was ich getan habe.

Die Kehrseite ist, dass es sehr ist beteiligt es richtig und performant. Sie benötigen einen geringen Gewicht HTML-Parser, um die URLs herausziehen (Ich schrieb einen Streaming-Parser es on the fly zu tun, damit es nicht die gesamte Seite in dem RAM-Speicher kopiert hat).

Die helle Seite der gesamte Inhalt Seite ist „einfach funktioniert“, wie sie wissen nichts über sie.

Es gibt auch einige besondere Behandlung, wenn sie mit Javascript (wie Ihr Filter wird nicht leicht „wissen“, wo es eine URL zu verschlüsseln) handelt. Ich beschloss, dies durch Urls erfordert spezifisch sein unterzeichnet werden „var signedURL =‚....‘“, so dass ich diese einfach in den Ausgang zu finden. Nicht als eine Belastung für Designer vernichtend wie Sie vielleicht denken.

Die andere helle Seite des Filters ist, dass Sie es deaktivieren. Wenn Sie einige „seltsame Verhalten“ haben passiert, einfach deaktivieren. Wenn das Verhalten fortsetzt, haben Sie einen Fehler im Zusammenhang mit Verschlüsselung gefunden. Es läßt auch Entwickler im Klartext arbeiten und die Verschlüsselung für den Integrationstest verlassen.

Schmerz zu tun, aber es ist schön, insgesamt am Ende.

So etwas wie jCryption?

http://www.jcryption.org/examples/

Sie können die Daten kodieren base64 oder etwas ähnliches verwenden. Ich würde die Argumente kodieren inself in JSON sie serialisiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top