Frage

Ich versuche, eine XML-serialisierten Objekts in einem Cookie gespeichert werden, aber ich erhalte eine Fehlermeldung wie folgt aus:

A potentially dangerous Request.Cookies value was detected from the client (KundeContextCookie="<?xml version="1.0" ...")

Ich kenne das Problem aus similiar Fällen, wenn Sie versuchen, etwas zu speichern, die in einem Formulareingabefeld wie Javascript-Code aussieht.

Was ist die beste Praxis hier? Gibt es eine Möglichkeit (wie die Form Problem, das ich beschrieben) diese Warnung aus dem asp.net Rahmen zu unterdrücken, oder sollte ich JSON Serialisierung statt oder vielleicht sollte ich es binäre Serialisierung? Was ist gängige Praxis, wenn serialisierten Daten in einem Cookie gespeichert?

EDIT: Danke für die Rückmeldung. Der Grund, warum ich mehr Daten im Cookie gespeichert werden soll als die ID ist, da das Objekt i wirklich brauchen etwa 2 Sekunden dauert, von einem Dienst retreive ich keine Kontrolle haben. Ich habe ein leichtes Objekt ‚KundeContext‘ ein paar der Eigenschaften aus dem vollen Objekt zu halten, aber diese 90% der Zeit verwendet werden. Auf diese Weise muss ich nur auf 10% meiner Seiten den langsamen Dienst anrufen. Wenn ich nur die Id gespeichert würde ich immer noch den Dienst auf fast alle meine Seiten zu nennen haben.

Ich konnte speichern alle Saiten und separat Ints aber das Objekt hat andere leichte Gegenstände wie ‚Kontaktinformationen‘ und ‚Adresse‘, die manuell sehr mühsam sein würde für jede ihrer Eigenschaften speichern.

War es hilfreich?

Lösung

Ich würde nicht speichern Daten in XML im Cookie - gibt es eine Grenze für Keksgröße für Starter (verwendet werden 4K für alle Header einschließlich des Cookie). Wählen Sie eine ausführliche weniger Codierungsstrategie wie z.B. Begrenzer anstelle a | b | c oder getrennte Cookie-Werte. Trennzeichen Codierung macht es besonders einfach und schnell, um die Werte zu dekodieren.

Der Fehler, den Sie sehen beschwert ASP.NET, dass die Header wie ein XSS-Angriff zu suchen.

Andere Tipps

serialisierten Daten in einem Cookie gespeichert ist eine sehr, sehr schlechte Idee. Da die Benutzer die vollständige Kontrolle über Cookie-Daten haben, ist es einfach zu leicht für sie, diesen Mechanismus nutzen Sie bösartige Daten zu füttern. Mit anderen Worten:. beliebige Schwäche in Ihrem Deserialisierung Code sofort verwertbar wird (oder zumindest eine Möglichkeit, etwas zum Absturz zu bringen)

Stattdessen hält nur die einfachste Kennung möglich in Ihren Cookies, einen Typs, von denen das Format kann (zum Beispiel eines GUID) leicht überprüft werden. Dann speichern Sie Ihre serialisierten Daten-Server-Seite (in einer Datenbank, XML-Datei auf dem Dateisystem, oder was auch immer) und rufen Sie sie diese Kennung verwendet wird.

Edit: Auch in diesem Szenario stellen Sie sicher, dass Ihre Kennung zufällig genug ist, um es für Benutzer unmöglich macht jeweils andere Kennungen zu erraten, und sie imitiert, indem Sie einfach ihre eigene Kennung ein wenig zu verändern. Auch hier arbeiten zu diesem Zweck sehr gut GUIDs (oder ASP.NET Sitzungs-IDs).

Zweiter bearbeiten nach Szenario Klärung von Fragen Eigentümer: warum in diesem Fall auf alle Ihre eigenen Cookies verwenden? Wenn Sie einen Verweis halten entweder auf das ursprüngliche Objekt oder Ihr leichtes Objekt in der Sitzungsstatus (Session-Objekt), ASP.NET wird für Sie von allen Implementierungsdetails kümmern in einer ziemlich effizient.

Schauen Sie in den View State . Vielleicht möchten Sie die Daten über Post-backs in der Viewstate anstelle der Verwendung von Cookies bestehen bleiben möchte. Andernfalls sollten Sie wahrscheinlich speichern Sie die XML auf dem Server und eine eindeutige Kennung auf diese Daten im Cookie statt.

Sie aussehen könnten, in der Verwendung Session State den Wert zu speichern . Sie können es so konfigurieren, ein Cookie zu verwenden, um die Session-ID zu speichern. Dies ist auch sicherer, da der Wert weder sichtbar oder veränderbar durch die Benutzer-Seite ist.

Eine weitere Alternative ist ein verteiltes Caching-Mechanismus zu verwenden, um den Wert zu speichern. Mein aktueller Favorit ist Memcached .

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