مرتبك بشأن محتوى جافاسكريبت المحمل عن بعد

حسناً… ما زلت في رحلتي لجعل خادم الإعلانات الخاص بي يعمل على منصة Discourse. لقد صادفت لغزاً لا أستطيع حله. باستخدام ميزة تحرير المظهر، أضفت طلب السكربت الخاص بي إلى كل من </body> و ‘footer’.

إذا تمت إضافة السكربت إلى ‘footer’ (أو ‘بعد الرأس’)، يفشل الكود. رغم أنه في وضع الفحص يبدو النص المشفر صحيحاً. انظر أدناه:

يظهر نص “أين هذا؟”، لكن لا شيء آخر.

ومع ذلك، فإن نفس طلب السكربت (أدناه) الذي يُضاف إلى </body> يعمل. لماذا؟

<script language="Javascript" src="https://adserver.kitmaker.net/index.php?section=serve&action=1">

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

creatives\":{\"Leaderboard Ad\":\"\\u003cscript language=\\\"Javascript\\\" src=\\\"https://adserver.kitmaker.net/index.php?section=serve\\u0026action=1\\\"\\u003e\"}},\"

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

شكراً لأي مساعدة.

جيم

آمل أن يرى أحد المطورين هذه الرسالة. :slight_smile:

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

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

حسنًا، لاحظت أن سجل CSP يُظهر أن سكريبت إعلانات جوجل يتم حظره، لذا أضفت

https://pagead2.googlesyndication.com

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

هل هناك شيء ما يمنع الإخراج لكنه لا يُفعّل تحذير CSP؟

الإخراج يستخدم document.write لإنشاء مساحة الإعلان. وأنا أظن أن هذا هو السبب. يبدو الإخراج كالتالي:

ههه… إذا وضعت مخرجات السكريبت هنا كنص، كان سيُنتج بشكل صحيح. آه…

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

وكما هو الحال معه، أنا مستعد لدفع مبلغ لشخص ما للمساعدة في حل هذه المشكلة.

شكرًا،
جيم

إذن… كل هذا يتعلق بـ CSP (أفترض ذلك) لأن الموقع مضبوط على ‘unsafe-inline’ للبيانات، وأنا أحاول جلب سكريبت خادم الإعلانات الخاص بي عبر عنوان URL يحتوي على متغيرات. أعرف… كم هذا بدائي من قبلي.

إذن… هل هناك أي شخص؟ هل يوجد حل بسيط لهذه المشكلة أم عليّ الاستسلام؟

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

يمكنك أيضًا البحث عن إضافة خادمك إلى نسخة مشتقة من إضافة الإعلانات، كما تم فعله في طلبات الدمج التالية: AdButler support by communiteq · Pull Request #80 · discourse/discourse-adplugin · GitHub أو Carbon Ads Integration by barreeeiroo · Pull Request #73 · discourse/discourse-adplugin · GitHub أو حتى Add CodeFund Advertising option by coderberry · Pull Request #65 · discourse/discourse-adplugin · GitHub

أيضًا، أين يتم الإعلان عن سياسة أمن المحتوى؟ لا أرى أي وسم meta خاص بها. هل هذه مجرد إعدادات افتراضية مفترضة في HTML 5 من خلال كل متصفح؟

راجع التخفيف من هجمات XSS باستخدام سياسة أمان المحتوى

شكرًا لك يا فالكو. بدلًا من إيقاف جميع الحماية، هل توجد طريقة لإضافة سلاسل البيانات إلى القائمة البيضاء لمصدر URL الخاص بخادم الإعلانات فقط والسماح بتلك المتغيرات بالمرور؟ أو… مجرد إيقاف شرط “‘unsafe-inline’ data”؟

للأسف، لم أجد هذا الخيار موضحًا في المقال الذي ربطته.

شكرًا مجددًا.

حسناً، يبدو أنني أصبحت يائساً، فقد حاولت إيقاف سياسة أمن المحتوى (CSP) تماماً…

ومع ذلك، لا يزال الإعلان لا يظهر في القسم الرئيسي من الموقع، بل يظهر فقط في التذييل حيث تم تثبيته في السمة داخل </body>. لقد أدركت أن هناك غلاف <noscript> حول القسم الأوسط، بينما ذلك الموجود في التذييل يقع خارج إغلاق </noscript>، لذا ربما يكون هذا هو السبب؟

لقد تحققت في متصفح فايرفوكس، والآن لا تظهر أي تحذيرات CSP في وحدة التحكم. لست متأكداً من سبب عدم رؤيتي لها في كروم من الأساس.

تُعدّ منصة Discourse تطبيق صفحة واحدة (SPA)، ويتم إنشاء ترميز جميع الصفحات على جانب العميل عبر تطبيق EmberJS الخاص بنا.

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

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

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

سأجرب بعض الخيارات البديلة لاستخدام document.write لأرى ما إذا كان ذلك ممكنًا.

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