HTML، chmod، الحاويات و cron
السبب وراء أربع أدوات مساعدة: لماذا يحتاج محرر HTML إلى قائمة مسموح بها ووضع الحماية، ولماذا يهم الحرف الكبير S في سلسلة chmod، وما لا يمكن لأمر تشغيل عامل الإرساء التعبير عنه في الإنشاء، وقاعدتي cron اللتين تلتقطان الجميع.
محرر HTML: قائمة مسموحة، وليس مرشحًا
يُنتج المحرر HTML، وHTML الذي يأتي من مربع نص هو أقدم ناقل حقن موجود. يتم الخلط هنا بين سؤالين مختلفين، لذا يجدر الفصل بينهما. الأول هو "هل يمكن خداع هذا المحرر لإصدار ترميز يقوم بتشغيل التعليمات البرمجية في الصفحة التي تعرضه؟" والثاني هو "هل هذه طريقة آمنة لتنظيف HTML المعادية من مصدر غير موثوق؟" تجيب هذه الأداة بنعم على السؤال الأول ولا على السؤال الثاني، وهي تقول ذلك على اللوحة بدلاً من السماح لك بافتراض خلاف ذلك.
الآلية هي القائمة المسموح بها. قائمة العناصر مسموح بها؛ يتم فك كل عنصر آخر، لذلك يبقى نصه ولا تبقى علامته. يُسمح بقائمة السمات لكل عنصر؛ يتم إسقاط كل شيء آخر، وهو ما يجعل كل معالج حدث مستحيلًا بدلاً من مجرد حظره. يتم كتابة أسماء السمات بأحرف صغيرة قبل هذا الاختبار، لذا فإن oNeRrOr وONERROR هما نفس الاسم المرفوض مثل onerror. تتم إزالة العناصر التي يتعامل المحلل اللغوي HTML مع محتوياتها كنص خام - البرنامج النصي والنمط ومنطقة النص وiframe والعنوان - مع محتوياتها، لأن إلغاء تغليفها سيؤدي إلى لصق مصدر البرنامج النصي في المستند كعلامة.
تحصل عناوين الارتباط على الشيك الخاص بها. يتم فك تشفير القيمة عن طريق الكيان وتجريدها من المسافات البيضاء وأحرف التحكم قبل قراءة مخططها، لأن هذا هو ما يفعله المتصفح عندما يتنقل: javascript:alert(1) وjav ascript:alert(1) كلاهما يصلان إلى نفس المكان. فقط http، https، mailto، tel، ftp والعناوين النسبية هي التي تبقى على قيد الحياة. مرجع الأحرف الذي لا يمكن للأداة حله - : هو المرجع الكلاسيكي - يؤدي إلى رفض العنوان بالكامل بدلاً من تمريره، لأن المرشح الذي يفهم مدخلات أقل مما يفهمه المتصفح هو مرشح به ثغرة.
لا يوجد زر صورة، وimg غير موجود في القائمة المسموح بها. علامة الصورة المسموح بها هي طلب صادر من أي مكان ينتهي فيه المستند وسطح خطأ. بالنسبة للمحرر الذي ينتج النثر، فإن الأمر لا يستحق ذلك أيضًا.
الدفاع الذي لا يعتمد على كون أي من هذا مثاليًا هو المعاينة. يتم عرضه في إطار iframe مع سمة وضع الحماية التي لا تمنح أي شيء على الإطلاق - لا توجد نصوص برمجية ولا نماذج ولا وصول من نفس المصدر. إذا تجاوزت الحمولة القائمة المسموح بها، فسيظل المتصفح يرفض تنفيذها هناك. وهذا ضمان هيكلي وليس وعدًا بشأن الكود الخاص بنا.
القيد الصادق: هذا معقم قائم على السلسلة، وليس محللًا كاملاً HTML5. الفروق المحللية – المدخلات التي يقوم فيها المتصفح ببناء شجرة مختلفة عن تلك التي قام بها مُرمز الرمز المميز – هي نقطة الضعف المعروفة في كل مُطهر تم تصميمه بهذه الطريقة. بالنسبة للإخراج، فإنك تنشئ بنفسك في هذا المحرر هذا أمر جيد. لتنظيف HTML الذي وصل من شخص غريب، استخدم معقمًا يعمل ضد محلل حقيقي، على خادم تتحكم فيه.
Chmod: الحرف الكبير هو الرسالة بأكملها
يتكون وضع ملف Unix من اثني عشر بت: ثلاث بتات إذن لكل مالك والمجموعة وغيرهم، بالإضافة إلى setuid وsetgid والبت اللاصق. الشكل الثماني هو قراءة مباشرة لتلك البتات، ولهذا السبب 4 + 2 + 1 = 7 تعني القراءة والكتابة والتنفيذ.
الشكل الرمزي الذي يطبعه ls هو المكان الذي تصبح فيه البتات الخاصة مثيرة للاهتمام، لأنها لا تحصل على عمود خاص بها. يستبدل setuid حرف تنفيذ المالك، ويستبدل setgid حرف تنفيذ المجموعة، ويستبدل Sticky حرف التنفيذ الآخر. يكون الحرف صغيرًا عندما يتم أيضًا تعيين بت التنفيذ الأساسي ويكون UPPER بحالة الأحرف عندما لا يكون كذلك.
لذا فإن 4755 هو rwsr-xr-x — وهو برنامج setuid يمكن تنفيذه — بينما 4644 هو rwSr--r--، وهو ملف setuid لا يمكن لأحد تشغيله. الحرف الكبير S هو النظام الذي يخبرك بأن البتة خاملة، وغالبًا ما يكون ذلك خطأً وليس اختيارًا. الأمر نفسه ينطبق على 1644، الذي يُظهر rw-r--r-T: بتة لاصقة في ملف عادي حيث تكون البتة الأخرى التي يتم تنفيذها واضحة، والتي لا تفعل شيئًا على الإطلاق في النواة الحديثة.
هناك تمييزان آخران يستحقان الحفاظ عليهما بشكل مستقيم. السلسلة المكونة من تسعة أحرف ls المطبوعة ليست الوسيطة التي يستخدمها chmod: يريد chmod قائمة مهام مثل u=rwx,g=rx,o=rx,u+s. ونفس البتات تعني أشياء مختلفة في الدليل عنها في الملف - التنفيذ يعني "قد يدخل ويجتاز"، setgid يعني "الملفات الجديدة ترث هذه المجموعة"، والبت الثابت يعني "يمكن لأي شخص الإنشاء، ويمكن للمالك فقط الحذف"، وهذا هو السبب في أن /tmp هو 1777.
تشغيل عامل الإرساء للإنشاء: التحليل وما لا يتم تحويله
يقوم المحول بتقسيم الأمر باستخدام رمز مميز مدرك للاقتباس مكتوب لهذه الأداة. لا يتم تنفيذ أي شيء أو تقييمه أو تسليمه إلى الصدفة. تتم قراءة الأمر الذي يحتوي على علامات خلفية أو $(...) أو فاصلة منقوطة كأحرف حرفية، لأن الشيء الوحيد الذي تفعله هذه الأداة بإدخالك هو قراءته.
يتم تعيين معظم العلامات بشكل واضح: المنافذ ووحدات التخزين والبيئة والتسميات وسياسة إعادة التشغيل والإمكانيات والفحوصات الصحية وحدود الموارد وDNS والمضيفين الإضافيين جميعهم لديهم مفاتيح إنشاء بنفس المعنى. تحتاج وحدات التخزين المُسماة والشبكات المعرفة من قبل المستخدم إلى إعلان المستوى الأعلى بالإضافة إلى مرجع الخدمة، وبالتالي فإن الإخراج يحمل واحدًا - مع خارجي: صحيح على الشبكات، لأن تشغيل عامل إرساء الشبكة كان يمكن الانضمام إليه وهو موجود بالفعل.
بعض العلامات ليس لها مكافئ في الإنشاء، وهذا هو المكان الذي تفشل فيه المحولات عادةً بهدوء. --rm ليست خاصية خدمة: لا تتم إزالة خدمة الإنشاء عند الخروج. يصف -d كيفية استدعاء CLI، وليس ماهية الخدمة. --link قديم، --mount يحتاج إلى نموذج طويل لا تكتبه هذه الأداة، --gpus يعتمد على برنامج التشغيل الخاص بك. كل واحدة منها تنتج تحذيرًا مسمىًا بدلاً من التلاشي. تنتج العلامة غير المعروفة تحذيرًا أيضًا، ويتم التعامل معها على أنها لا قيمة لها، لأن التخمين أنها استغرقت علامة غير معروفة من شأنه أن يحول اسم الصورة إلى وسيطة وينتج ملفًا خاطئًا بشكل مؤكد.
لا يحمل الإخراج إصدار المستوى الأعلى: المفتاح. يتجاهله Compose v2 وتحذر منه الإصدارات الحالية؛ لقد أصبح قديمًا منذ أن حلت مواصفات الإنشاء محل إصدارات تنسيقات الملفات القديمة.
الاقتباس ليس تجميليا. تتم قراءة تعيين المنفذ المكتوب بالشكل 8080:80 بدون علامات الاقتباس كرقم بواسطة المحللين اللغويين YAML 1.1، ونعم، لا، تشغيل وإيقاف هي قيم منطقية بنفس اللهجة. يتم اقتباس أي شيء يمكن أن يُساء قراءته؛ أي شيء يمكن قراءته بشكل واضح كسلسلة يتم تركه بمفرده، لذلك يظل الملف قابلاً للقراءة.
كرون: قاعدتان تجذبان الجميع
الأول هو قاعدة اليوم. عندما يتم تعيين كل من يوم الشهر ويوم الأسبوع على شيء آخر غير *، يقوم cron بتشغيل المهمة عندما يتطابق EITHER - وليس عندما يتطابق كلاهما. إذن 0 0 13 * 5 هو "منتصف ليل يوم 13، ومنتصف ليل كل يوم جمعة"، وهو ما يحدث تقريبًا خمس مرات في الشهر، وليس "الجمعة 13"، الذي يكون مرة أو مرتين في السنة. يحذر المولد عندما يكون كلا الحقلين مقيدًا، والجملة التي يكتبها تقول "أو" بدلاً من "و".
والثاني هو المنطقة الزمنية. يستخدم Cron منطقة الجهاز الذي يعمل عليه، والتي غالبًا ما تكون UTC على الخادم ولا تكاد تكون أبدًا منطقة الشخص الذي يكتب crontab. وبالتالي فإن معاينة التشغيل التالي تسألك عن المنطقة التي يجب استخدامها بدلاً من افتراض منطقتك. يتم حساب الأوقات على أنها أوقات ساعة الحائط في تلك المنطقة، لذلك تظل المهمة اليومية في نفس التوقيت المحلي عبر تغيير التوقيت الصيفي بدلاً من الانحراف بمقدار ساعة - ويتم استبعاد التوقيت المحلي غير الموجود، في الساعة التي يتم تخطيها كل ربيع، من القائمة، لأن cron لن يعمل بعد ذلك أيضًا.
بناء الجملة نفسه صغير: نجمة، رقم، نطاق a-b، قائمة a،b،c، خطوة */n أو a-b/n, وأسماء الشهر واليوم JAN-DEC وSUN-SAT. كل من 0 و7 يعني يوم الأحد. القيمة المجردة بخطوة، مثل 5/15 في حقل الدقيقة، تعني "من 5 إلى نهاية النطاق، كل 15"، وهي الدقيقة 5، 20، 35 و 50.
التحقق صارم عن قصد. 60 * * * * تم رفضه لأن الدقائق تتوقف عند 59؛ * * * * تم رفض 8 لأن حقل اليوم يتوقف عند 7؛ */0 * * * * تم رفضه لأن الخطوة صفر لا تتطابق مع أي شيء. عادةً ما تعني ستة حقول تعبير Quartz أو systemd الذي يكون حقله الأول هو الثواني، لذا يشير الخطأ إلى ذلك بدلاً من العد فقط. الجدول الزمني الصحيح من الناحية النحوية ولكن لا يمكن تشغيله أبدًا — 0 0 30 2 * يطلب يوم 30 فبراير - يتم قبوله ووضع علامة عليه، لأن رفضه سيكون خطأً وسيكون البقاء صامتًا أسوأ.
ماذا يحدث لما تلصقه
- يتم تشغيل كل تحويل وتجزئة وفك تشفير وفرق في علامة تبويب المتصفح الخاص بك. لا يتم تحميل أي مدخلات أو تسجيلها أو تخزينها على الخادم، لأنه لا يوجد خادم مشارك بمجرد تحميل الصفحة.
- تأتي التجزئة من تطبيق Web Crypto الخاص بالمتصفح، والمعرفات الفريدة الفريدة (UUID) من المولد العشوائي الآمن للتشفير. لا يتضمن أي منهما مكالمة شبكة.
- لا تتم كتابة أي شيء تكتبه على وحدة التخزين المحلية أو ملف تعريف الارتباط. تؤدي إعادة تحميل الصفحة إلى تجاهلها؛ إغلاق علامة التبويب يتجاهلها.
- يتم تشغيل التحليلات على مستوى الموقع فقط على مضيف الإنتاج الأساسي الذي تم تكوينه ويتم الكشف عنها في سياسة الخصوصية؛ المضيفون المحليون ومضيفو المعاينة يرفضون ذلك. يتم استبعاد القيم والرموز المميزة وعناوين URL ومحتويات الملفات التي تم لصقها من أحداث التحليلات الخاصة بـ ToolAcre. تم تعطيل الإعلان في التكوين الحالي.
- ومع ذلك: يعد المفتاح JWT أو المفتاح API بمثابة بيانات اعتماد مباشرة. العادة الآمنة هي عدم لصق أي شيء على صفحة ويب لم تكتبها، مهما كانت ادعاءاتها جديرة بالثقة - بما في ذلك هذه الصفحة.
أسئلة
هل يمكنني لصق HTML المعادية في المحرر لتنظيفه؟
يمكنك لصقه، ولن يتم تنفيذ أي شيء: يقوم معالج اللصق بتطهير حمولة الحافظة قبل إدراج أي شيء، وتكون المعاينة عبارة عن إطار iframe في وضع الحماية بدون نصوص برمجية مسموحة. لكن لا تستخدم النتيجة كعنصر تحكم أمني للمدخلات غير الموثوق بها. هذه قائمة مسموح بها تعتمد على سلسلة لمخرجات أحد المحررين، وليست مرشحًا للأغراض العامة XSS، ويمكن للمحلل اللغوي للمتصفح الوصول إلى شجرة مختلفة عن تلك التي يفعلها محلل الرموز المميزة مثل هذا. بالنسبة للمحتوى غير الموثوق به، قم بالتطهير على الخادم باستخدام محلل HTML5 حقيقي.
لماذا يقوم المحرر بحذف الصور والجداول الخاصة بي؟
لأنهم ليسوا في القائمة المسموح بها. الصور عبارة عن طلب صادر وسطح خطأ؛ الجداول ببساطة خارج نطاق هذا المحرر. يبقى محتوى النص الخاص بهم موجودًا، بينما لا تبقى العلامات. هذه هي القائمة المسموح بها وليس خطأً - ولكن هذا يعني أن هذه ليست الأداة المناسبة لتحرير مستند موجود معقد.
لماذا يُظهر chmod 4644 الحرف الكبير S؟
لأنه تم تعيين setuid ولم يتم تنفيذ بت التنفيذ للمالك. الحرف الكبير يعني أن البت الخاص ليس لديه ما يمكن التصرف عليه: فهو ملف setuid لا يمكن تنفيذه. الأحرف الصغيرة تعني أنه تم ضبط كلا البتتين. تمنحك نفس القاعدة S لـ setgid وT للبت الثابت، وإعادتها إلى الوراء هو الخطأ الوحيد الأكثر شيوعًا في حاسبات الوضع.
هل يقوم محول عامل الإرساء بتشغيل الأمر الخاص بي؟
لا، ولا يجوز. يتم تقسيم الأمر بواسطة أداة رمزية تفهم الاقتباس ولا شيء غير ذلك. لا يوجد تقييم، ولا غلاف، ولا عملية فرعية - ولا توجد طريقة لبدء عملية في الصفحة. كل ما تلصقه يبقى في علامة التبويب.
لماذا يقوم المحول بالتحذير بدلاً من مجرد إسقاط إشارة لا يمكنه التعامل معها؟
لأن ملف الإنشاء الذي يقوم بصمت بتنفيذ أقل من الأمر الذي جاء منه هو أسوأ من عدم وجود أي إخراج على الإطلاق: يمكنك اكتشاف ذلك أثناء الإنتاج. تتم تسمية كل علم غير ممثل، وما يجب فعله حيال ذلك. إذا لم تشاهد أي تحذيرات، فهذا يعني أنه لم يتم فقدان أي شيء.
لماذا يختلف تشغيل cron التالي عما يفعله خادمي؟
دائما تقريبا المنطقة الزمنية. يستخدم كرون منطقة الجهاز الذي يقوم بتشغيله؛ تستخدم المعاينة المنطقة التي اخترتها في القائمة المنسدلة. قم بتعيينه على منطقة الخادم الخاص بك - غالبًا UTC - ويجب أن يوافقوا. المرشح الآخر هو قاعدة اليوم: إذا تم تعيين يوم من الشهر ويوم من الأسبوع، فسيتم تشغيل cron على أي منهما، وهو ما يحدث في كثير من الأحيان أكثر مما يقصده معظم الناس.
القيود
- إن أداة التعقيم HTML عبارة عن قائمة مسموح بها لمخرجات هذا المحرر، ويتم تنفيذها كمرمز مميز للسلسلة بدلاً من محلل HTML5 كامل. إنه ليس مرشحًا للأغراض العامة XSS ويجب عدم استخدامه كمرشح.
- لا يحتوي المحرر على صور أو جداول أو ألوان أو عناصر تحكم في الخطوط، ولا توجد طريقة لإضافتها: تتم إزالة كل شيء خارج القائمة المسموح بها.
- يستخدم سطح التحرير document.execCommand، والذي تم إهماله ولم يتم تنفيذ بديل له. لا تزال المتصفحات تدعمه؛ يختلف السلوك قليلاً فيما بينها، خاصة فيما يتعلق بتداخل القائمة.
- تغطي حاسبة chmod بتات الأذونات الاثني عشر فقط. قوائم التحكم في الوصول والسمات الموسعة وسياقات SELinux وحساب umask وقوائم ACL لنظام التشغيل Windows كلها خارج النطاق.
- يقوم محول عامل الإرساء بترجمة أمر تشغيل عامل ميناء واحد إلى خدمة واحدة. لا يقرأ ملفات Dockerfiles، ولا يحل الصور، ولا يمكنه التعبير عن --mount، --gpus، --device، --link أو --volumes-from؛ كل واحد منهم ينتج تحذيرًا محددًا بدلاً من ذلك.
- يتم التعامل مع العلامات التي لا يتعرف عليها المحول على أنها لا تأخذ أي قيمة. إذا تم أخذ مثل هذه العلامة، فسيتم قراءة القيمة بشكل خاطئ - التحذير يقول ذلك، وإزالة العلامة هي الحل.
- يقرأ منشئ cron تنسيق crontab المكون من خمسة حقول فقط. تعبيرات الكوارتز وsystemd ذات ستة مجالات، @reboot، وL وW و# و؟ يتم رفض المشغلين بدلاً من تخمينهم.
- تأتي أوقات التشغيل التالية من قاعدة بيانات المنطقة الزمنية الخاصة بالمتصفح من خلال Intl. إنها معاينة وليست ضمانًا: قد يكون للجهاز الذي يقوم بتشغيل cron منطقة مختلفة، أو إصدار قاعدة بيانات مختلف، أو برنامج خفي لم يكن قيد التشغيل عندما حان الوقت.