Frage

Ich habe eine PHP-Anwendung, wo ich auf bestimmte Objekte möchte auf folgende Weise bestehen:

  1. Das Objekt muss nicht in dem $ _SESSION existiert. Separate Web-Browser-Fenster separate Instanzen des Objekts steuern müssen.
  2. Der Endbenutzer muss das Objekt zu ändern, indem Sie den Inhalt des $ _REQUEST Variable von Hand nicht möglich ist (wenn dies die Anforderung geschieht so behandelt, als beschädigt werden soll).

Gibt es eine Best Practices / die richtige Art und Weise, dies zu tun? Mit PHP immer mehr objektorientiert, befürchte ich, dass ich ein Rad bin neu zu erfinden.

Der große Zweck dieses Codes ist die Erstellung und Bearbeitung von komplexen Objekten zu ermöglichen, ohne eine Datenbank mit, bis sie werden verpflichtet sind, dann werde ich eine richtige Transaktion verwenden sie in voller Höhe an die Datenbank zu übernehmen. Ich will es machen, so dass meine Datenbank nur die komplette Rechnung enthält, oder keine Rechnung überhaupt.

Meine aktuelle Methode ist wie folgt:

<?php

include('encrypt.php');
include('invoice.class.php');

if(isset($_REQUEST['invoice']))
{
    $invoice = unserialize(decrypt(base64_decode($_REQUEST['invoice'])));
    if(!($invoice instanceOf invoice)) throw new exception('Something bad happened');
}
else
{
    // Some pages throw an exception if the $_REQUEST doesn't exist.
    $invoice = new invoice();
}

if(isset($_REQUEST['action']) && $_REQUEST['action'] == 'addLine')
{
    $invoice->addLine(new invoiceLine($_REQUEST['description'], $_REQUEST['qty'], $_REQUEST['unitprice']);
}

?>
<form action="index.php" method="post">
<input type="text" name="qty" />
...
<input type="hidden" name="invoice" value="<?php echo(base64_encode(encrypt(serialize($invoice)))); ?>" />
</form>
War es hilfreich?

Lösung

Sie können auch Zustand auf dem Client, ohne Cookies, mit einer einfachen versteckten Formulareingaben speichern. Solange die Daten (wahrscheinlich eine serialisierte blob) verschlüsselt und signiert, kann der Benutzer es nicht ändern, ohne ihre Sitzung zu brechen.

Steve Gibson verwendet diese Methode für sein benutzerdefiniertes E-Commerce-System. Während sein Code nicht Open Source ist, erklärt er durchaus Möglichkeiten Zustand zu speichern, ohne sensible Daten auf dem Server zu speichern oder die Cookie-Unterstützung erfordern in Security Now Episode # 109 "GRC eCommerce System".

Andere Tipps

Hier ist ein Trick: Legen Sie es in einem Cookie

!

Ordentlich Algorithmus:

$ data = serialize ($ object); $ Time = time (); $ Signature = SHA1 (. $ ServerSideSecret $ time $ data.); $ Cookie = base64 ( "$ signatur $ zeit $ data");

Der Vorteil ist, dass Sie

a) kann das Cookie abläuft, wenn Sie wollen, weil Sie den Zeitstempel als Teil des Signatur-Hash verwenden.

b) kann überprüfen, ob die Daten auf der Client-Seite nicht geändert wurden, weil Sie den Hash aus dem Datensegment in dem Cookie neu erstellen können.

Auch Sie müssen nicht im Cookie das gesamte Objekt speichern, wenn es zu groß sein wird. Speichern Sie einfach die Daten, die Sie auf dem Server benötigen und die Daten im Cookie als Schlüssel verwendet werden.

Ich kann Kredit für den Algorithmus nehmen, ich lernte es von Cal Henderson, von Flickr Ruhm.

Edit: Wenn Sie die Verwendung von Cookies zu kompliziert ist, nur um sie vergessen und die Daten speichern, die in einem versteckten Formularfeld im Cookie gegangen wären

.

Was ich tun würde, ist speichern eine kryptographische Schlüssel (nicht die gesamte Struktur, wie Ihr Beispiel ist) in einer versteckten Form variabel. Dieser Schlüssel ist ein Index zu einem uncreated_invoices Tisch, wo Sie unvollständige Rechnungen speichern.

Zwischen-Seiten, können Sie die Daten in der uncreated_invoices Tabelle aktualisieren, und wenn sie fertig sind, ziehen Sie es heraus und es zu begehen. Wenn Sie die Benutzername in den uncreate_invoices Tisch gelegt, wird dies auch sie läßt abholen, wo sie aufgehört hat (nicht sicher, ob einen gültigen Anwendungsfall das ist). Es wäre wahrscheinlich eine gute Idee, den Benutzernamen in es sowieso zu setzen, damit die Leute nicht versuchen, anderen Menschen die Rechnungen kapern.

Sie können sich wahrscheinlich weg serialisierten Daten in der uncreated_invoices Tabelle mit Speicher, wenn man will. Persönlich würde ich es ein wenig normalisieren (wie viel auf dem Schema abhängt), so können Sie ganz einfach hinzufügen / entfernen einzelne Stücke.

Edit: Ich vergaß zu erwähnen, dass Sie die uncreated_invoices Tabelle in regelmäßigen Abständen reinigen sollte, damit es nicht mit veralteten Rechnungen nicht füllen.

können nicht speichern Sie die Daten in einem Array innerhalb von $ _SESSION und dann eine eindeutige ID für jedes Fenster. Wenn jedes Fenster eindeutige ID hat, können Sie die ID übergeben um als Teil Ihrer Formulare. Store / Abrufen der Daten in der Session oder Datenbank auf der Basis der Fenster-ID.

So etwas wie das? $ _SESSION [ 'data'] [$ WindowID] -> $ objektname

Wenn Sie nicht SESSION verwenden können, dann müssen Sie die Daten selbst bestehen bleiben. Sie müssen die Daten irgendwo wird es, wie eine Datenbank oder eine andere Datei bestehen. Es ist die einzige Möglichkeit, neben SESSION Daten Persit.

ich das zurücknehmen, können Sie die Daten in den einzelnen HTML-Seite senden und lokal verwenden. Jede Seite, die die Daten akzeptiert HTML erstellen müssen / Javascript, das die Datenfolge fortgesetzt wird.

Wenn Sie die Dinge auf der Client-Seite speichern kann sie geändert werden. Gibt es einen bestimmten Grund, warum Sie nicht wollen, um die Objekte in einer Sitzung speichern? Wenn eine Speicherung tatsächlich das Objekt nicht lebensfähig ist, müssen Sie es anhalten woanders auf dem Server.

Das ist in Ordnung, werden sie in der Lage sein, alle Einzelteile sie hinzufügen möchten. Das Problem in Ihrem Code ist, dass Sie den Elementdeskriptor, Menge nehmen und Preis von der Anfrage, der Preis soll wirklich im Hintergrund nachgeschlagen werden, sonst könnte ein Benutzer ihren Preises des Handwerk. Heck, negativer Wert Elemente und Sie Sachen kostenlos zu erhalten.

Sie wollen etwas speichern. Das ist in der Regel in Datenbanken durchgeführt. Wie wissen Sie, den Preis von etwas, ohne es zu suchen in einer Datenbank? So verwenden die gleiche Datenbank Informationen über den aktuellen Benutzer / Session zu speichern.

könnten Sie verwenden die magische Methoden __sleep() und __wakeup()

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