سؤال الأمان: كيفية تأمين مجموعات السبات التي تعود من العميل إلى الخادم؟

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

سؤال

لقد حصلت على Pojo بسيط اسمه "Parent" الذي يحتوي على مجموعة من الكائن "طفل".

في Hibernate/JPA ، إنها ببساطة جمعية واحدة لأعلى ، لا يعرف الأطفال والديهم: يمكن أن يكون لهذه الأشياء الفرعية نوع مختلف من الوالدين ، لذا من الأسهل عدم معرفة الوالد (فكر في الطفل الذي يمثل العلامات والآباء والأمهات يمكن أن يكونوا أنواع كائنات مختلفة لها علامات).

الآن ، أرسل كائن الوالد الخاص بي إلى عرض العميل لموقع الويب الخاص بي للسماح للمستخدم بتعديله.

لذلك ، أستخدم Hibernate/GWT/Gilead.

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

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

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

شكرًا

ملاحظة: آسف على لغتي الإنجليزية ، أتمنى أن تفهم المفهوم ؛)

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

المحلول 2

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

عندما يعود DTO الخاص بي إلى الخادم ، أتحقق من التوقيع للتأكد من أن حقول قراءتي فقط لم تتغير (إعادة حساب التوقيع مع حقول العودة ومقارنتها بالتوقيع مع DTO)

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

نصائح أخرى

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

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

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

حظا طيبا وفقك الله. أوصيك برسم مخطط تدفق مفصل لمنطقك قبل أن تقوم بالكثير من الترميز.

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