ما هي أفضل طريقة أن تستمر كائن باستخدام أشكال في PHP?

StackOverflow https://stackoverflow.com/questions/617793

  •  03-07-2019
  •  | 
  •  

سؤال

يجب تطبيق PHP حيث أود أن أشياء معينة أن تستمر على النحو التالي:

  1. يجب أن يكون الكائن غير موجود في $_SESSION.ويب منفصلة نوافذ المتصفح يجب السيطرة على حالات منفصلة من وجوه.
  2. النهاية-لا يجب أن يكون المستخدم قادرا على تعديل كائن عن طريق تغيير محتوى $_REQUEST متغير باليد (إذا حدث هذا الطلب يجب أن تعامل على أنها تالفة).

هل هناك أفضل الممارسات / الطريقة الصحيحة للقيام بذلك ؟ مع PHP أصبحت أكثر وأكثر وجوه المنحى, أخشى أنني إعادة اختراع العجلة.

جراند الغرض من هذا القانون هو السماح إنشاء ومعالجة الكائنات المعقدة دون استخدام قاعدة البيانات حتى يتم ارتكاب هذه ثم استخدام الصفقة المناسبة لارتكاب لهم قاعدة البيانات بالكامل.أنا تريد أن تجعل من ذلك أن قاعدة البيانات يحتوي فقط على كامل الفاتورة أو رقم الفاتورة في كل شيء.

بلدي الأسلوب الحالي على النحو التالي:

<?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>
هل كانت مفيدة؟

المحلول

يمكنك أيضا حفظ الدولة على العميل ، دون ملفات تعريف الارتباط باستخدام بسيط خفية شكل الإدخال.طالما أن البيانات (ربما تسلسل blob) مشفرة توقيع المستخدم لا يمكن تعديله دون كسر الدورة.

ستيف جيبسون يستخدم هذا الأسلوب على عادته نظام التجارة الإلكترونية.في حين رمز له ليس مفتوح المصدر تماما يشرح طرق لإنقاذ الدولة دون تخزين البيانات الحساسة على الخادم أو التي تتطلب الدعم في كوكي الأمن الآن الحلقة #109, "GRC هو نظام التجارة الإلكترونية".

نصائح أخرى

هنا خدعة:وضعه في ملف تعريف الارتباط!

أنيق الخوارزمية:

$data = تسلسل($وجوه) ؛ $time = time();$توقيع = sha1($serverSideSecret .$الوقت .$data);$cookie = base64("$التوقيع-$الوقت-$البيانات");

فائدة هذا لك

أ) يمكن أن تنتهي صلاحية ملف تعريف الارتباط عندما تريد لأنك تستخدم الزمني كجزء من التوقيع التجزئة.

ب) يمكن التحقق من أن البيانات لم يتم تعديل على جانب العميل ، لأنه يمكنك إعادة تجزئة من قطاع البيانات في ملف تعريف الارتباط.

كما لا يجب أن المتجر الكائن بأكمله في ملف تعريف الارتباط إذا كان سوف تكون كبيرة جدا.مجرد تخزين البيانات على الخادم واستخدام البيانات في ملف تعريف الارتباط الرئيسية.

أنا لا يمكن أن تأخذ الائتمان الخوارزمية ، تعلمته من كال هندرسون من فليكر الشهرة.

تحرير:إذا كنت العثور على استخدام ملفات تعريف الارتباط معقدة جدا ، تجاهلهم و تخزين البيانات التي كان قد ذهب في تعريف الارتباط في شكل خفي المجال.

ما أود القيام به هو متجر التشفير الرئيسية (لا الهيكل كله ، مثل المثال) في شكل خفي متغير.هذا المفتاح هو مؤشر إلى uncreated_invoices الجدول حيث يمكنك تخزين غير مكتملة الفواتير.

بين الصفحات ، يمكنك تحديث البيانات في uncreated_invoices الجدول, و عند الانتهاء من ذلك ، تخلعها و ارتكابها.إذا كنت وضعت اسم المستخدم في uncreate_invoices الجدول, هذا سوف تتيح لهم التقاط حيث توقفت (لست متأكدا إذا كان هذا صحيحا في حالة استخدام).ربما تكون فكرة جيدة أن تضع اسم المستخدم في ذلك على أي حال حتى لا يستطيع الناس في محاولة لخطف الآخرين الفواتير.

يمكن أن تحصل على الأرجح بعيدا مع تخزين تسلسل البيانات في uncreated_invoices الجدول ، إذا أردت.شخصيا كنت تطبيع قليلا (كم يعتمد على المخطط) بحيث يمكنك بسهولة إضافة/إزالة القطع الفردية.

تحرير:نسيت أن أذكر أنه يجب تنظيف uncreated_invoices الجدول بشكل دوري حتى لا تمتلئ قديمة الفواتير.

لا يمكنك تخزين البيانات في مجموعة ضمن $_SESSION ، ومن ثم يكون معرف فريد لكل نافذة.إذا كان كل نافذة معرف فريد يمكنك تمرير معرف حول كجزء من النماذج الخاصة بك.مخزن/استرداد البيانات في الدورة أو قاعدة البيانات استنادا إلى نافذة معرف.

حتى شيء مثل هذا ؟ $_SESSION['البيانات'][$windowid]->$objectname

إذا لم تتمكن من استخدام الدورة ثم يجب أن تستمر البيانات بنفسك.يجب عليك وضع البيانات في مكان ما سوف سوف تستمر ، مثل قاعدة بيانات أو بعض الملفات الأخرى.هذه هي الطريقة الوحيدة ، إلى جانب الدورة persit البيانات.

أنا أعتبر أن يعود ، يمكنك إرسال البيانات في كل صفحة HTML واستخدامها محليا.كل صفحة يقبل البيانات يجب إنشاء HTML/جافا سكريبت التي لا تزال البيانات تسلسل.

إذا قمت بتخزين الأشياء على جانب العميل يمكن تعديلها.هل هناك سبب معين كنت لا ترغب في تخزين الأشياء في الدورة ؟ إذا كان تخزين كائن في الواقع ليست قابلة للتطبيق سوف تحتاج أن تستمر في مكان آخر على الملقم.

لا بأس, سوف تكون قادرا على إضافة كافة العناصر التي تريد.المشكلة في التعليمات البرمجية الخاصة بك أن كنت تأخذ هذا البند واصف, الكمية, السعر من طلب السعر حقا يجب أن يكون بدا في الخلفية, خلاف ذلك, يمكن للمستخدم اليد الحرفية أسعارها.هيك السلبية قيمة البنود, ويمكنك الحصول على الأشياء مجانا.

تريد تخزين شيء.هذا عادة ما يتم في قواعد البيانات.كيف تعرف سعر شيئا دون أن تبحث عنها في قاعدة البيانات ؟ وذلك باستخدام نفس قاعدة بيانات لتخزين المعلومات عن المستخدم الحالي/الدورة.

هل يمكن استخدام طرق سحرية __sleep() و __wakeup()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top