هل يمكنني منع التنزيل من الروابط الخارجية؟

مرحبًا،

بحثت ولكن لم أجد أي موضوع حول هذا.

أريد تعطيل التحميل من الروابط الخارجية، أي أنني لن أقيّم حق التحميل على المستخدمين المسجلين، فأنا لا بأس بأن يقوم أي شخص بتحميل الموارد على موقع Discourse الخاص بي، لكنني أود أن يزوروا الموقع على الأقل ويروا الموضوع.

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

شكرًا جزيلاً.
جيان

إعجابَين (2)

ربما يساعد هذا؟

3 إعجابات

شكرًا لك على الرد.

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

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

هل هما نفس المعنى من الناحية الدلالية؟

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

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

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

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

من السهل تجاوز هذا الإجراء، لكنه يمنع الربط العادي من مواقع الويب الأخرى.

location /uploads/ {
    valid_referers  www.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

استبدال www.example.com في الكود أعلاه بنطاق مثيل Discourse الخاص بك يجب أن يكون إعدادًا مناسبًا لـ nginx لمنع الارتباط المباشر بملفات التحميل على مثيلك.

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

location /uploads/ {
    valid_referers  www.example.com;
    if ($invalid_referer) {
        return 307 /;
    }
}

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

4 إعجابات

وربما يكون ذلك كافياً؟ أحسنت يا سيمون، رائع.

سيكون أفضل لو أضفت قاعدة لإعادة التوجيه إلى الصفحة الرئيسية؟

3 إعجابات

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

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

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

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

يُظهر الأمر أن إعدادات nginx التي يستخدمها Discourse تتضمن بالفعل إعدادات لمنع الارتباط المباشر (hotlinking)، وإن كانت معلقة (commented out). لذا، ما يمكنك فعله هو إضافة بضعة أوامر استبدال إلى ملف app.yml الخاص بك لإلغاء تعليق تلك الأسطر.

قم بتحرير الملف /var/discourse/containers/app.yml باستخدام المحرر المفضل لديك. في النهاية ستجد قسم run، وفي نهاية هذا القسم ستجد أمر exec يطبع عبارة “end of custom commands”.

قبل أمر exec هذا، أضف الأسطر التالية:

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#valid_referers none blocked mysite.com *.mysite.com;"
      to: valid_referers none blocked mysite.com *.mysite.com;

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#if ($invalid_referer) { return 403; }"
      to: if ($invalid_referer) { return 307 /; }

في قسم الاستبدال الأول، سترى السطر الذي يحتوي على to: مع mysite.com *.mysite.com؛ استبدلها باسم النطاق الخاص بك، مثل discourse.org *.discourse.org. يفترض الاستبدال الثاني أنك تريد إعادة توجيه الزوار إلى الصفحة الرئيسية لـ Discourse.

بعد حفظ التغييرات، قم بتشغيل الأوامر التالية لإعادة بناء Discourse مع إعدادات nginx المحدثة.

cd /var/discourse
./launcher rebuild app
4 إعجابات