<p>يتطلب MathJax "نهج أمان المحتوى" غير الآمن</p>

تم إنشاؤها على ١١ يونيو ٢٠١٢  ·  42تعليقات  ·  مصدر: mathjax/MathJax

يستخدم تطبيق MathJax الحالي الميزات التالية التي لا تعتبر آمنة في العالم الحديث ولا يمكن استخدامها مع رؤوس Content-Security-Policy الافتراضية (http://www.w3.org/TR/CSP/):

  • تقييم JavaScript للسلاسل (وظيفة جديدة () بسلسلة أو EVAL ()) (1)
  • سمات النمط المضمنة المُدرجة عبر JavaScript (2)

إنه أمر قابل للنقاش إذا كان يجب إصلاح المشكلة (2) ولكن يجب إصلاح (1) على الأقل لأن Content-Security-Policy لا يحتوي على دقة كافية للسماح لـ MathJax بالتنفيذ كبرنامج نصي موثوق به وفي نفس الوقت لا تفسر كل JavaScript آخر ملف موثوق به بشكل خاص. حاليًا ، إذا أراد أحد استخدام MathJax ، فعليه السماح لـ EVAL () في كل مكان. تتسبب المشكلة (1) أيضًا في الخطأ رقم 130 (MathJax غير متوافق مع الوضع الصارم ECMAScript 5).

الطريقة الوحيدة حاليًا لجعل MathJax تعمل ، حتى إذا كان أحدهم يستخدم كود MathJax المثبت محليًا ، هو استخدام رؤوس CSP HTTP التالية (يتم تضمين رأس "الخيارات" المهملة في Firefox 13.0 وأقل):

X-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; options eval-script
X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'

ستسمح هذه الرؤوس ببعض الحماية المقدمة من CSP وستظل تسمح لـ MathJax بالعمل ، إذا تم توزيع MathJax من نفس أصل محتوى الصفحة.

Accepted Fixed Test Not Needed v2.4

التعليق الأكثر فائدة

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

ال 42 كومينتر

يعد التقييم غير الآمن مشكلة كبيرة بالنسبة لي أيضًا. قريبًا جدًا سيجبر الكروم جميع الامتدادات على اعتماد سياسة أمان المحتوى التي تحظر استخدام eval . نحاول حاليًا ترقية Readium للتوافق مع هذا ولكن لا يمكننا استخدام القيام بذلك واستخدام MathJax

+1

شكرا يا شباب. سننظر فيه.

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

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

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

أيضًا ، لا يجب تشغيل eval() في كل صفحة يتم تحميل Mathjax فقط للتحقق مما إذا كان يمكنك تشغيل eval() . في الأساس ، هذا يحتاج للذهاب.

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

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

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

بقدر ما يتعلق الأمر بالشيء eval ، فإن وجهة نظري هي أنه لا يجب عليك تشغيل رمز على صفحة إذا لم تكن بحاجة إلى ذلك ، خاصة إذا كان هذا الرمز يستخدم eval() غير الآمن. يمكنك فقط استخدام هذه الوظيفة EVAL إذا تم تضمين Mathjax في التكوين المباشر ، لذلك لا تقم بإجراء الاختبار لها حتى تحتاج إلى ذلك. ولكن في الحقيقة ، لماذا يجب أن يكون التكوين رمزًا قابلاً للتنفيذ. إنه في الحقيقة مجرد جزء من JSON يتم تمريره للعمل. لماذا لا تقوم فقط بتمرير JSON وتحليلها وجعل MathJAX تستدعي الوظيفة؟

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

لا أعتقد أن الأمور بهذا الوضوح. أولاً ، لم يكن هذا هو الحال في عام 2008 عندما تمت كتابة هذا الجزء من الكود. لقد أجريت للتو اختبارات هذا الصباح والتي يبدو أنها تؤكد أن إصدارات Safari و Firefox و Opera و IE قيد التشغيل في ذلك الوقت كانت جميعها تعمل بالطريقة التي وصفتها (تم الاحتفاظ بسلسلة النطاق الكاملة في الإغلاق ، بغض النظر عن المتغيرات المستخدمة ). يبدو أن الموقع الذي يعد مرجعي لهذا الموقع معطلاً هذا الصباح (كان بالأمس) ، لذلك لا يمكنني التحقق من التفاصيل ، لكن ما أذكره هو أن هذا كان جزءًا من مواصفات ECMAScript 262.

يبدو أن الإصدارات الحالية من Safari و Chrome و Firefox و IE تعمل كما تصفها ، لذلك تغيرت الأمور في مكان ما منذ ذلك الحين. يبدو أن Safari 4 و Firefox 3.6 و IE9 هم المكان الذي حدث فيه التغيير ؛ ليس لدي إصدارات قديمة من Chrome لأختبرها ، لذا لا أعرف التاريخ هناك. IE8 لديه السلوك الأقدم ، ولا يزال Opera 12 يفعل. لم أتحقق من الأجهزة المحمولة. بعض هذه المتصفحات موجودة في قائمة دعم MathJax ، لذلك لا تزال مشكلة يتعين علينا مراعاتها في MathJax بشكل عام. بالطبع ، أنا متأكد من أنه يمكن عمل شيء ما لتلبية احتياجاتك.

بالنسبة لبيانات JSON ، قد تكون كتلة التكوين أكثر من مجرد مكالمة MathJax.Hub.Config() . على سبيل المثال ، يمكنك تثبيت مستمعات الأحداث ، أو إضافة وظائف إلى jax إدخال TeX لتنفيذ أوامر إضافية ، وما إلى ذلك. لا يمكن أن تكون هذه جزءًا من بيانات JSON لأنها تتضمن كودًا قابلاً للتنفيذ. لا يتم استخدام هذه الميزة دائمًا ، ولكنها بالتأكيد _يتم استخدامها من قِبل مواقع الويب الفعلية. بالإضافة إلى ذلك ، لا تحتوي جميع المتصفحات المستهدفة على مكتبة JSON مضمنة ، وبالتالي ستكون هناك حاجة إلى مكتبات إضافية لإجراء التحليل. (بالتأكيد ليس من المستحيل التغلب عليه ، ولكن هناك المزيد من التعليمات البرمجية للتنزيل.)

+1 لتغيير هذا ، بحيث (من بين أشياء أخرى) سيسمح Github لـ MathJax في مواقع الويكي الخاصة بهم مرة أخرى.

ketch هل لديك مرجع ل Github يدلي ببيان في هذا الصدد؟ لا أرى كيف تمس هذه المشكلة أمان Github Wiki.

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

http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-pages

ونرى

https://github.com/blog/1477-content-security-policy

أعتقد أن دعم MathJax اختفى في نفس الوقت الذي قاموا فيه بتطبيق ميزة CSP.

شكرا هذا ممتع. لست متأكدًا من أن الاثنين مرتبطان ولكن من يدري - لم يناقش فريق جيثب علنًا سبب إزالة MathJax. سيكون من المؤسف أن يكون السبب هو وجود شيء لا يمثل مشكلة في إعدادهم.

+1 للامتثال لـ CSP.

+1

قرأت هذا الموضوع ووجدته إعلاميًا للغاية وغير متحيز إلى حد ما. سأشارك في ادعائي بأنهم [github] سيمنعون شيئًا مثل exec و CSP بشأن مسائل الأمن وعدم السماح بذلك.

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

بالمناسبة ، قمت بإرسال بريد إلكتروني إلى دعم Github حول سبب إسقاط MathJax. ها هو الرد:

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

شكرًا ketch ، من الجيد معرفة ذلك.

dpvc هل يجب أن نضيف هذا إلى المرحلة التالية؟

: +1:

pkra ، كنت أخطط لإضافته. لم أحصل على هذا بعيدًا عدديًا في القائمة حتى الآن.

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

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

+1 لتأمين MathJax. من المؤسف جدًا عدم القدرة على استخدام هذه المكتبة الرائعة في الإنتاج بسبب المخاوف الأمنية.

أي تقدم في هذه المسألة؟ أحاول حقن MathJax برمجيًا في الصفحات ذات امتداد Chrome ، وأنا أصطدم إن لم يكن جدارًا من الطوب على الأقل بجدار صلب لائق. كما هو موضح في emichael / texthings # 4 ، فإن مشكلتي الأكبر الآن هي مع MathJax.js:265 . تمكنت من إلغاء المكالمات إلى

new Function()

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

تحرير: انتهى بي الأمر بإعطاء المستخدم خيارًا لإضافة تقييم غير آمن وغير آمن إلى CSP ، ولكن الإصلاح طويل المدى للحصول على MathJax إلى CSP آمن سيكون أمرًا رائعًا. : +1:

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

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

إذا كان لديك خادم اختبار ، فيمكنك فقط تعيين سياسة أمان المحتوى في رؤوس الاستجابة. فقط تأكد من أن script-src لا يتضمن 'unsafe-eval' أو 'unsafe-inline' (GitHub نفسه مثال جيد). إذا لم تقم بذلك ، فيمكنك استخدام حد أدنى جدًا من امتداد Chrome لحقن الرؤوس بنفسك.

إنه خطأ وقت التشغيل.

شكرا. سوف اري ماذا يمكنني ان افعل.

يتم استخدام الأمر Eval فقط لمعالجة كتل التكوين المضمنة (وهناك أمر أولي لاختبار كيفية التعامل مع المتغيرات العامة في هذه الحالة). يمكن تأجيل الإعداد الأولي حتى يتم استخدام تكوين مضمّن ، وإذا تجنبت استخدام التكوين المضمّن ، فيجب أن يعتني به ذلك. في الإصدار 2.3 ، أضفنا طريقة جديدة لإجراء التهيئة المضمنة بدون EVAL (استعدادًا لحل هذه المشكلة) ، لذا لا يزال بإمكانك تضمين تكوين MathJax في ملفات HTML دون تشغيل استدعاء EVAL.

حسنًا ، لقد قمت بعمل تصحيح يزيل مكالمات new Function() و eval() . يعتمد على أحدث فرع للتطوير ، ولكن التغييرات المدرجة في f220993 يجب أن تتم على النسخة الرئيسية من MathJax.js أيضًا ، إذا كنت بحاجة إلى القيام بذلك. أنت بحاجة إلى السماح بالأنماط المضمنة (لا يوجد حقًا للتغلب على ذلك). يوجد أيضًا مرجع خط إلى about:blank حتى يتمكن MathJax من اختبار الاستجابة لخط مفقود (دون الحاجة إلى الوصول إلى الشبكة) ، لذلك قد ترغب في إضافة about: إلى font-src كذلك. بمجرد أن قمت بتغيير هذين ، تم تشغيل هذه النسخة من MathJax دون أي عوائق.

لطيف! أستطيع أن أرى لماذا تحتاج بالتأكيد إلى 'unsafe-inline' للأنماط.

بقدر ما يذهب الإذن script-src 'unsafe-inline' ، إذا فهمتك بشكل صحيح ، فإن البرامج النصية تكون مبطنة فقط عندما يقوم المستخدم بتضمين تكوين MathJax المضمّن للبدء به. سيكون هذا جيدًا ، نظرًا لأن كل شيء لا يزال بإمكانه العمل بدون 'unsafe-inline' في script-src . ومع ذلك ، يجب ذكره في المستندات.

فهمك حول البرامج النصية المضمنة صحيح. لا تحتاج إلى script-src 'unsafe-inline' إلا إذا كنت تستخدم كتل تكوين مضمنة ، والتي لا تحتاج إلى استخدامها. يمكنك استخدام إما ملف تكوين MathJax محلي (مضاف إلى config= ) أو يمكنك استخدام ملف نصي عادي يقوم بتعيين متغير MathJax لكائن تمرره عادةً إلى MathJax.Hub.Config() وقم بتحميل هذا الملف _before_ البرنامج النصي الذي يقوم بتحميل MathJax.js. على سبيل المثال ، ضع

var MathJax = {
  tex2jax: {
    inlineMath: [['$','$'],['\\(','\\)']],
    procesEscapes: true
  }
};

في ملف يسمى mathjax-config.js ثم

<script src="mathjax-config.js"></script>
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>

آمل أن هذا سيهتم بمتطلباتك.

في الواقع. شكرا على الإصلاح السريع !!

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

=> مدمجة.

فهل طلب أحد من جيثب السماح لـ mathjax حتى الآن؟ لا يزال من غير الممكن كتابة ملف dotjs يتيح لي كتابة tex في مشكلات github حتى يتم عرضه باستخدام mathjax ...

(المثال هنا - http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-pages - فشل.)

مرحبا،

أستضيف حاليًا موقع jekyll على صفحات github وأتابع هذه المقالة ، وقد أضفت ما يلي إلى ملف التضمين الخاص بي:

<script type="text/javascript"
  src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>

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

silky لا شيء معين AFAWK. أعتقد أن جانب العميل غير مرجح ، لكن عقدة MathJax يمكن أن توفر بديلاً مثمرًا.

الأسئلة العامة @ diego898 مناسبة بشكل أفضل على http://groups.google.com/forum/#!forum/mathjax -users؛ قم دائمًا بتضمين رابط إلى صفحة مباشرة ومتصفح وخصائص نظام التشغيل وما إلى ذلك. شكرًا.

pkra أفهم أنني لم أكن متأكدًا مما إذا كان خطأ متعلقًا بهذه المشكلة أو مشكلة في التكوين من جانبي

@ diego898 لا مشكلة. ما تصفه لا يبدو أنه مرتبط بهذه المشكلة.

ما زلت أرى هذه المشكلة. راجع https://github.com/mathjax/MathJax/issues/1988.

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

هل تم حل (2) في الإصدار الأصلي من أي وقت مضى؟ يبدو أن mathjax v3 لا يزال مُدرجًا

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات