PHPのフォームを使用してオブジェクトを永続化する最良の方法は何ですか?
-
03-07-2019 - |
質問
特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<?php
include('encrypt.php');
include('invoice.class.php');
if(isset(特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>REQUEST['invoice']))
{
$invoice = unserialize(decrypt(base64_decode(特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>REQUEST['invoice'])));
if(!($invoice instanceOf invoice)) throw new exception('Something bad happened');
}
else
{
// Some pages throw an exception if the 特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>REQUEST doesn't exist.
$invoice = new invoice();
}
if(isset(特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>REQUEST['action']) && 特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>REQUEST['action'] == 'addLine')
{
$invoice->addLine(new invoiceLine(特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>REQUEST['description'], 特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>REQUEST['qty'], 特定のオブジェクトを次の方法で永続化したいPHPアプリケーションがあります。
- オブジェクトは$ _SESSIONに存在してはなりません。個別のWebブラウザーウィンドウは、オブジェクトの個別のインスタンスを制御する必要があります。
- エンドユーザーは、$ _ REQUEST変数の内容を手動で変更してオブジェクトを変更できないようにする必要があります(これが発生した場合、リクエストは破損したものとして扱われる必要があります)。
これを行うためのベストプラクティス/適切な方法はありますか? PHPがますますオブジェクト指向になっているので、車輪を再発明しているのではないかと恐れています。
このコードの主な目的は、コミットするまでデータベースを使用せずに複雑なオブジェクトを作成および操作できるようにすることです。その後、適切なトランザクションを使用してそれらを完全にデータベースにコミットします。データベースに完全な請求書のみが含まれるようにするか、請求書をまったく含まないようにします。
現在の方法は次のとおりです。
<*>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>
解決
単純な非表示フォーム入力を使用して、Cookieなしでクライアントに状態を保存することもできます。データ(おそらくシリアル化されたblob)が暗号化および署名されている限り、ユーザーはセッションを中断せずにデータを変更することはできません。
Steve Gibsonは、カスタムeコマースシステムにこの方法を使用しています。彼のコードはオープンソースではありませんが、サーバーに機密データを保存したり、 Security Nowエピソード#109 、「GRCのeコマースシステム」。
他のヒント
ここにトリックがあります:クッキーに入れてください!
きちんとしたアルゴリズム:
$ data = serialize($ object); $ time = time(); $ signature = sha1($ serverSideSecret。$ time。$ data); $ cookie = base64(&quot; $ signature- $ time- $ data&quot;);
利点は、あなたが
a)署名ハッシュの一部としてタイムスタンプを使用しているため、必要に応じてCookieを期限切れにすることができます。
b)Cookieのデータセグメントからハッシュを再作成できるため、クライアント側でデータが変更されていないことを確認できます。
また、オブジェクトが大きすぎる場合は、オブジェクト全体をCookieに保存する必要はありません。必要なデータをサーバーに保存し、Cookieのデータをキーとして使用するだけです。
このアルゴリズムを信用することはできません。Flickrの名声であるCal Hendersonから学びました。
編集:Cookieの使用が複雑すぎる場合は、Cookieを忘れて、Cookieに保存されているデータを非表示フォームフィールドに保存してください。
私がやることは、暗号化されたキー(例のように構造全体ではない)を隠しフォーム変数に保存することです。このキーは、不完全な請求書を保存する uncreated_invoices
テーブルのインデックスです。
ページ間で、uncreated_invoicesテーブルのデータを更新し、完了したらデータを引き出してコミットします。ユーザー名をuncreate_invoicesテーブルに入れると、中断したところから再開できるようになります(それが有効なユースケースかどうかはわかりません)。他の人の請求書を乗っ取ろうとしないように、とにかくユーザー名を入力することをお勧めします。
おそらく、必要に応じて、シリアル化されたデータをuncreated_invoicesテーブルに保存することで回避できます。個人的には、個々のピースを簡単に追加/削除できるように、少し正規化します(スキーマによって異なります)。
編集:
古い請求書でいっぱいにならないように、 uncreated_invoices
テーブルを定期的にクリーニングする必要があることを忘れていました。
データを$ _SESSION内の配列に保存し、各ウィンドウに一意のIDを持たせませんでしたか。各ウィンドウに一意のIDがある場合、フォームの一部としてIDを渡すことができます。ウィンドウIDに基づいてセッションまたはデータベースにデータを保存/取得します。
では、このようなものですか? $ _SESSION ['data'] [$ windowid]-&gt; $ objectname
SESSIONを使用できない場合は、データを自分で永続化する必要があります。データベースやその他のファイルなど、データを永続化する場所に配置する必要があります。 SESSION以外のデータを許可する唯一の方法です。
それを取り戻します。各HTMLページでデータを送信し、ローカルで使用できます。データを受け入れるすべてのページで、データシーケンスを継続するHTML / Javascriptを作成する必要があります。
クライアント側に物を保存する場合、それらを変更できます。セッションにオブジェクトを保存したくない特定の理由はありますか?オブジェクトの保存が実際に実行可能でない場合は、サーバー上の別の場所に保存する必要があります。
これで問題ありません。必要なすべてのアイテムを追加できます。コードの問題は、リクエストからアイテム記述子、数量、価格を取得していることです。価格は実際にバックグラウンドで検索する必要があります。そうしないと、ユーザーが価格を手作業で作成できます。ネガティブな値のアイテムは、無料で入手できます。
何かを保存します。これは通常、データベースで行われます。データベースで調べずに、何かの価格を知るにはどうすればいいですか?そのため、同じデータベースを使用して、現在のユーザー/セッションに関する情報を保存します。
マジックメソッド __sleep()
および __ wakeup()