الرسائل الخاصة متاحة للمسؤولين إذا كان لدى المسؤول الرابط

لقد اكتشفت للتو أنه إذا أرسل شخص ما رسالة خاصة (PM) إلى شخص آخر، فلنفترض من حساب joe إلى jane، وبسبب سبب ما، اكتشف شخص ما (مسجل الدخول) “معرف الموضوع” الصحيح، يمكنه قراءة الرسالة الخاصة.

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

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

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

إذا كنت تحتاج إلى توفير نظام خاص حقًا، فهناك إضافة discourse-encrypt التي توفر تشفيرًا من طرف إلى طرف للرسائل.

9 إعجابات

ليس هذا ضروريًا، لم يخطر ببالي ذلك فحسب.

سأختبره بحساب عادي وأحدّث هذا، احتياطًا.

إعجاب واحد (1)

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

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

5 إعجابات

سؤال قد يكون غبياً - أين يوجد هذا الإعداد بالضبط؟ نحن على الإصدار المستقر (والذي يجب أن يحتوي على هذا الخيار نظرياً) ولا يمكنني العثور عليه.

تعديل: وجده مسؤول آخر لدينا - إنه “تسجيل مشاهدات الرسائل الشخصية” في علامة التبويب “المستخدمون”. أجادل بأن هذا يجب أن يكون شيئاً في علامة التبويب “الأمان”، ولكن يمكنني أن أفهم لماذا قد يكون هناك بدلاً من ذلك إذا فكرت في الأمر لدقيقة.

إعجابَين (2)

سؤال متابعة - هل من الممكن تمكين التسجيل عندما يقوم مسؤول بعرض الرسائل التي يمتلكها حساب، حتى لو لم يفتحوا رسالة لقراءة محتوياتها؟

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

إعجاب واحد (1)

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

المسؤولون هم مديرو المنتدى ولديهم حق الوصول إلى جميع البيانات. هناك العديد من الطرق للمسؤولين لعرض محتويات الرسائل دون تسجيلها:

  • تنزيل نسخة احتياطية
  • مستكشف البيانات
  • انتحال الشخصية
  • إنشاء مفاتيح API

لحماية المستخدمين بالكامل، فإن أفضل حل هو استخدام المراسلة المشفرة. إذا كنت لا تثق في المسؤولين لديك، فلا ينبغي أن يكونوا مسؤولين.

5 إعجابات

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

من المؤكد أنه سيجعل من السهل جدًا التأكد من أن لا أحد يفعل ذلك عن طريق الخطأ أو عن قصد دون الإبلاغ عنه إذا تم تسجيله مع جميع الطرق الأخرى التي يمكنهم من خلالها الوصول إلى نفس البيانات.

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

إعجاب واحد (1)

يمكنك إخفاء/حجب عناوين الرسائل في قوائم رسائل المستخدمين الآخرين باستخدام سمة موقعك.

إذا كان ذلك عن قصد، فهذه مسألة أخرى.

أماكن أخرى يمكنك الحصول منها على معلومات التدقيق هذه: سجلات خادم الويب.

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

إعجابَين (2)

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

إعجاب واحد (1)

قد تتمكن من استخدام محدد على العنوان في تلك الصفحة - “الرسائل” هي رسائلك مقابل “اسم المستخدم — الرسائل” هي رسائل شخص آخر.

إعجابَين (2)

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

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange(() => {
        window.onload = determineUser();
    });
    
    function determineUser() {
        var pageURL = document.querySelector("meta[property='og:url']").getAttribute("content");
        var userPage = pageURL.includes("https://www.fortressoflies.com/u/");
        document.documentElement.style.setProperty('--currUsername', pageURL);
        
        if(userPage)
        {
            document.documentElement.style.setProperty('--lastUsername', pageURL);
        }
    }
</script>

بشكل أساسي، يتم تحديث --currUsername الخاص بي، ثم يتم تحديث العلامة الوصفية بعنوان URL الجديد، لذا فإن --currUsername الخاص بي دائمًا ما يكون صفحة واحدة خلف ما أنظر إليه فعليًا. يحدث هذا بغض النظر عما إذا كان لدي سطر “window.onload” أم لا.

أي فكرة عما أفعله بشكل خاطئ هنا؟

الهدف النهائي هو مجرد إضافة فئة إلى الجسم بناءً على الصفحة التي تنظر إليها، ثم التنسيق بناءً على ذلك - يجب أن يسمح لنا بقراءة، على سبيل المثال، حقل العنوان بدلاً من حقل og:url، ثم وضع فئة “myMessages” على الجسم للحصول على التأثير المطلوب في هذه الحالة. من الناحية النظرية.

إعجاب واحد (1)

هذا الأمر غير احترافي للغاية، لكن ما يلي يبدو أنه يعمل عن طريق إجبار دالة JavaScript على الانتظار لمدة عُشر ثانية:


    api.onPageChange(() =>{
        window.onload = determineUser();
    });
    
    async function determineUser() {
        await sleep(50);
        var pageURL = document.querySelector("meta[property='og:url']").getAttribute("content");
        var userPage = pageURL.includes("https://www.fortressoflies.com/u/");
        document.documentElement.style.setProperty('--currUsername', pageURL);
        if(userPage)
        {
            document.documentElement.style.setProperty('--lastUsername', pageURL);
        }
    }
    
    function sleep(ms)
    {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

سنرى ما إذا كان بإمكاني جعل هذا يعمل كما هو مقصود.

إعجابَين (2)