الأمان المنطقي فوق إجراءات المستخدم الحالي

أهلاً بك! كيف حالك؟

لقد قمت ببعض الأعمال المتعلقة بالأمن المنطقي بناءً على معلومات المستخدم الحالي، مثل: إذا كان topic.creator.username يساوي User.current().username، فإنني أسمح للمستخدم بتعديل الموضوع أو استبعاده.

المسألة هي أنني أحتاج إلى ضمان بعض الإجراءات بناءً على جلسة المستخدم! لكنني أجريت بعض الاختبارات، وهذا هو السبب في أنني أتوجه إليكم الآن لأطلب مساعدتكم.

عبر JavaScript في متصفح الويب (حتى في وضع الإنتاج)، يمكنني تنفيذ الأمر Discourse.User.current().set('username', 'sometestename'). بهذه الطريقة، سيتم تمكين بعض الإجراءات في نظامي بمجرد هذا التغيير. أعرف أن هذا ليس هدف 99% من المستخدمين، ولكن بغض النظر عن هذه الحالة، هل تعرفون أي طريقة لضمان عدم قيام المستخدم بالتلاعب بمعلومات المستخدم؟

مع أطيب التحيات،
فيليب

إذا قمت بتغيير المعلومات في متصفحك المحلي، فإن ذلك لا يغير أي شيء في الخلفية.

يتم تسجيل دخول المستخدم عبر رمز مصادقة، كما أعتقد، لذا لا يمكنك التظاهر بأنك شخص آخر أمام الخلفية:

وبما أنه لا يمكن خداع الخادم، فلن تتمكن من إجراء أي تغيير باسم مستخدم آخر.

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

أهلاً! نعم!

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

بهذه الطريقة، لن تتأثر التغييرات في ذاكرة التخزين المؤقت من المتصفح! هل تعرف مكاناً يمكنني من خلاله التحقق من أن الأمان المنطقي يعتمد على جلسة المستخدم من الخادم الخلفي، وليس من PreloadStore؟

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

مع أطيب التحيات،
فيليب

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

ينطبق نفس الشيء على جميع عمليات استرجاع البيانات - فسيرسل خادم Rails فقط البيانات التي يكون المستخدم المسجل في الدخول مخولًا بالاطلاع عليها.

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

ما هو مصدر قلقك؟

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

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

تعديل: مثل أذونات منشورات discourse، سأتحقق منها.

مع خالص التحية، فيليبي

يجب تطوير جميع إجراءات الأمان أولاً في الخلفية.

تحدد سيرياليزرات Rails البيانات التي سيتم إرسالها.

يحمي Guardian الإجراءات المسموح بها.

يتم إدارة كل ذلك بواسطة وحدات التحكم في Rails.

لا يهم أي بيانات غير صالحة يرسلها الواجهة الأمامية أو ما تطلبه لاسترجاعه، لأن هذه العناصر تحمي الخادم.

يمكنك محاكاة هذا السلوك في الواجهة الأمامية، لكن الواجهة الأمامية ليست البوابة الأمنية.

اطّلع على بعض الإضافات الكبيرة وستجد أمثلة على سيرياليزرات واستخدام Guardian.

شكرًا لك يا روبرت، لقد كنت بحاجة إلى هذا التقييم!

سأتحقق منه بالتأكيد!

مع خالص التحية،

يا روبرت!

لقد قمت بتحليل كود الإضافة وقاعدة الكود المتعلقة بتحكمات المنشورات (الإجراءات) لمعرفة أين يمكنني تعزيز الأمان بشكل أكبر.

كما تم التحليل! في الواجهة الأمامية، توجد خطوات تضمن ما إذا كان المستخدم قادرًا على التعديل على المنشور أم لا، مثل:

  • الخطوة الأولى: SiteSetting.post_menu_hidden_items
  • الخطوة الثانية: attrs.canEdit
  • الخطوة الثالثة: editPost() - !post.can_edit - controllers/topic

لكن، حتى لو تم التلاعب بها من الواجهة الأمامية، بمجرد إرسالها إلى خادم الخلفية في posts_controller.rb، داخل:

def update

يتم إعادة طلب المنشور مرة أخرى بواسطة Rails كإجراء تحقق نهائي:

  • !guardian.public_send(“can_edit?”, post)
  • guardian.ensure_can_edit!(post)
  • PostRevisor

شكرًا لك على رؤيتك!
هذا رائع جدًا.

أحسنت. يسعدني جداً أنك استمريت وبحثت بعمق :+1:t2: