هل يجب علي تخزين حقل معرف قاعدة البيانات في ViewState؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

أحتاج إلى استرداد سجل من قاعدة بيانات وعرضه على صفحة ويب (أنا أستخدم ASP.NET) ولكن قم بتخزين المعرف (المفتاح الأساسي) من هذا السجل في مكان ما حتى أتمكن من العودة إلى قاعدة البيانات لاحقًا باستخدام هذا المعرف ( ربما للقيام بالتحديث).

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

هل كانت مفيدة؟

المحلول

هذا يعتمد.

هل تهتم إذا رأى أي شخص معرف السجل؟إذا قمت بذلك، فإن الحقول المخفية وحالة العرض غير مناسبة؛تحتاج إلى تخزينه في حالة الجلسة، أو تشفير حالة العرض.

هل تهتم إذا أرسل شخص ما النموذج بمعرف مزيف؟إذا قمت بذلك، فلن تتمكن من استخدام حقل مخفي (وتحتاج إلى النظر إلى حماية CSRF كمكافأة)

هل تريده غير قابل للتغيير ولكن لا تهتم بأن يكون مفتوحًا للعرض (مع بعض الأعمال)؟استخدم حالة العرض وقم بتعيين EnableViewStateMac = "true" على صفحتك (أو عالميًا)

هل تريد أن تكون مخفية ومحمية ولكن لا يمكنك استخدام حالة الجلسة؟قم بتشفير حالة العرض الخاصة بك عن طريق تعيين إدخالات web.config التالية

<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />

نصائح أخرى

هل تريد أن يعرف المستخدم النهائي المعرف؟على سبيل المثال، إذا كانت قيمة المعرف عبارة عن بذرة قياسية 1.1 من قاعدة البيانات، فيمكنني إلقاء نظرة على الرقم ومعرفة عدد العملاء لديك.إذا قمت بتشفير القيمة (كما هو الحال في حالة العرض) فسأجد صعوبة كبيرة في فك تشفير المفتاح (ولكن ليس مستحيلاً).

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

تؤدي قيم حالة العرض إلى تحميل إضافي على العميل بعد كل إعادة نشر، لأن حالة العرض لا تحفظ كائنات الصفحة فحسب، بل تتذكر الكائنات إذا استخدمت زر الرجوع.وهذا يعني أنه بعد كل مشاركة، تصبح حالة العرض أكبر قليلاً ويصعب استخدامها.ستكون موجودة فقط على الصفحة حتى ينتقل المتصفح إلى صفحة أخرى.

عندما أقوم بتخزين معرف في الصفحة مثل هذا، أقوم دائمًا بإنشاء خاصية

public int CustomerID {
    get { return ViewState("CustomerID"); }
    set { ViewState("CustomerID") = value; }
}

أو

    Public Property CustomerID() As Integer
        Get
            Return ViewState("CustomerID")
        End Get
        Set(ByVal value As Integer)
            ViewState("CustomerID") = value
        End Set
    End Property

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

ViewState هو خيار.إنه صالح فقط للصفحة التي تتواجد فيها.ولا يحمل الطلبات إلى موارد أخرى مثل كائن الجلسة.

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

يمكنك أيضًا تخزين السجل بالكامل في ViewState وربما تجنب رحلة أخرى ذهابًا وإيابًا إلى الخادم.

أنا شخصياً أشعر بالقلق الشديد بشأن وضع أي شيء في الجلسة.لقد دارت عملياتنا العاملة مرات عديدة وفقدنا حالة الجلسة.

كما وصفت مشكلتك، أود أن أضعها في حقل مخفي أو في حالة عرض الصفحة.

وأيضًا، عند تحديد مكان وضع بيانات كهذه، انظر دائمًا إلى نطاق البيانات.هل يقتصر على صفحة واحدة أم على الجلسة بأكملها؟إذا كانت الإجابة "جلسة" بالنسبة لنا، فإننا نضعها في ملف تعريف الارتباط.(تنصل:نكتب تطبيقات إنترانت حيث نعلم أن ملفات تعريف الارتباط ممكّنة.)

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

Session["MyId"]=myval;

سيكون أكثر أمانًا قليلاً ويقدم بشكل أساسي نفس الآليات مثل وضعه في حالة العرض

أنا أميل إلى لصق أشياء كهذه في الحقول المخفية فقط افعل القليل

 <asp:label runat=server id=lblThingID visible=false />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top