القدرة على تحليل HTML لا تعني القدرة على عرض HTML بأمان
توضح هذه المقالة أن موقع BeautifulSoup يتم وضعه فقط كمحلل وليس كمنظف أمان، وتوضح كيفية إزالة أحداث البرنامج النصي وعناوين URL الخطيرة من خلال إستراتيجية القائمة البيضاء. يوفر رمزًا تعليميًا قابلاً للتشغيل لتنظيف الذاكرة، وحالات اختبار الحدود ومعايير تشغيل المراجعة اليدوية، ويشرح الطريقة الصحيحة لدمج OmniDoc في سير عمل ترجمة المستندات لتقييم إمكانات معالجة المحتوى المختلط.
تم تحليل موقع BeautifulSoup بنجاح، لكن هذا لا يعني أن HTML آمن. بالنسبة للمطورين وفرق التوثيق الذين يحتاجون إلى معالجة HTML خارجي، تشرح هذه المقالة سبب وجوب النظر إلى المحللين والمنقين بشكل منفصل، وتقدم مجموعة من أفكار تنظيف القائمة البيضاء، وحالات الاختبار، ومعايير المراجعة اليدوية.
الأمثلة الواردة في هذه المقالة هي عينات صناعية وتستخدم فقط لتوضيح طرق المعالجة. لقد تم فحص عينة التعليمات البرمجية في بيئة معزولة، ولكن هذا لا يعني أنه مضمون للعمل مع جميع الملفات أو المنتجات الحقيقية. قبل معالجة المستندات المهمة، يرجى الاحتفاظ بالنسخ الأصلية ثم مراجعتها واحدًا تلو الآخر وفقًا للحدود وبنود القبول في المستند.
الخلاصة في جملة واحدة: بعد التحليل يجب أن يتم التنظيف بشكل منفصل
تظل السمات الخطيرة مثل <img src=x onerror=alert(1)> سليمة في الإخراج بعد أن تقوم BeautifulSoup بتحليلها. يجب أن يكون التنظيف طبقة إضافية من منطق الأعمال يتم فرضها بعد التحليل.
| حالتك | الممارسات الموصى بها | سبب |
|---|---|---|
| ما عليك سوى استخراج البيانات أو تعديلها من HTML | استخدام BeautifulSoup للتحليل والاجتياز | تم تصميم BS4 لاستخراج وتعديل الهياكل الشجرية |
| لتضمين HTML خارجي في الأنظمة الداخلية أو ترجمة التسليمات | أضف طبقة تنظيف القائمة البيضاء بعد التحليل | لا يحدد BS4 ما إذا كانت العلامات والسمات آمنة أم لا |
مواجهة السمات مثل onclick أو javascript: أو data: | قم بإزالة السمات أو اترك href فارغًا | قد تحمل هذه الخصائص محتوى قابلاً للتنفيذ |
| جاهز للإنتاج | استخدم مكتبة تعقيم مخصصة (مثل bleach) وقم بإضفاء الطابع الخارجي على القائمة البيضاء | لا يغطي نموذج التعليمات البرمجية تفاصيل مثل السمات متعددة القيم، وتطبيع الحالة، وترميز الكيان، وما إلى ذلك. |
| نتائج التنظيف غير طبيعية أو يتم تقليل النص فجأة. | انتقل إلى المراجعة اليدوية | لا يمكن للقواعد التلقائية أن تغطي جميع مواقف العالم الحقيقي |
عدم التوافق بين القدرات التحليلية ومسؤوليات السلامة
تُعرّفها BeautifulSoup الوثائق الرسمية بأنها "مكتبة لاستخراج البيانات من ملفات HTML وXML" مع التركيز على التنقل والبحث وتعديل الهياكل الشجرية. وبالتالي فهو محايد فيما يتعلق بالأمن الدلالي للمحتوى. عند إدخال <a href="javascript:void(0)">Click</a>، سيقوم BS4 ببناء كائن Tag بشكل صحيح باستخدام سمة href، لكنه لن يحدد ما إذا كان البروتوكول مسموحًا به أم لا.
في معالجة المستندات، هذا الحياد له إيجابيات وسلبيات. الميزة هي أنه يمكنه التعامل مع مجموعة متنوعة من العلامات التاريخية غير المنتظمة. ويكمن الخطر في أنه إذا افترض المطورون أن "معالجة BS4" تساوي "معقمة"، فإن HTML غير المعتمد يمكن أن يتم إدخاله مباشرة في واجهة المعاينة أو تسليم الترجمة.
يتطلب التنظيف الأمني الحقيقي إستراتيجية قائمة بيضاء واضحة: احتفظ فقط بأسماء العلامات الآمنة المعروفة وأسماء السمات، وتحقق من تنسيق قيم السمات، وأزل الباقي. هذه ليست ميزة مضمنة في BS4، ولكنها بالأحرى منطق يجب على المستخدمين تراكب أنفسهم فيه.
إدخال الحدود في مثال التوليف
لتوضيح ضرورة التنظيف، يتم استخدام مجموعة من العينات الاصطناعية أدناه لتغطية نواقل الهجوم النموذجية والمحتوى المشروع. هذه المدخلات مخصصة لشروط حدود العرض التوضيحي فقط وليست إحصائيات حركة المرور الحقيقية ولا تمثل عتبات معايير الصناعة. لاختبار المستندات الحقيقية، قم أولاً بإزالة حساسية بيانات عملك لإزالة المعلومات الشخصية والروابط الحساسة.
أدخل بشكل صحيح
<p>See <a href="https://example.com/doc">reference</a>.</p>
يجب أن يترك الناتج المتوقع الفقرات والروابط سليمة، حيث أن p وa مدرجان في القائمة البيضاء، ويستخدم href بروتوكول HTTPS.
إدخال الحدود 1: معالج الأحداث
<div onclick="steal()">Safe text</div>
على الرغم من أن النص غير ضار، فإن onclick هي سمة معالج الأحداث ويجب إزالتها بالكامل، مع ترك <div>Safe text</div> فقط. إذا لم تكن div موجودة في القائمة البيضاء للعلامات، فيجب استبدال العلامة بأكملها بمحتوى نص عادي.
إدخال الحدود 2: البيانات: البروتوكول
<a href="data:text/html,<script>alert(1)</script>">Link</a>
يمكن أن تحمل عناوين URL data: محتوى قابلاً للتنفيذ. حتى إذا كانت العلامة نفسها قانونية، فيجب إفراغ href أو حذفها. لا يمكن للمنظف التحقق من أن بادئة البروتوكول هي http فحسب، بل يمكنه أيضًا التحقق من أن المحتوى الذي تم فك تشفيره يشكل سياق تنفيذ متداخل.
توضح هذه الحالات أن الحكم الأمني يحدث في مرحلة المراجعة على مستوى السمة بعد التحليل. BS4 مسؤول عن تحويل السلاسل إلى كائنات يمكن اجتيازها، ومنطق التنظيف مسؤول عن تحديد الكائنات التي يمكن الاحتفاظ بها.
تنفيذ تنظيف الذاكرة على أساس القائمة البيضاء
يوضح مثال بايثون التالي كيفية القيام بذلك في الذاكرة. هذا الكود مخصص للتدريس فقط. ولا يتعامل مع تفاصيل مثل السمات متعددة القيم، وتطبيع الحالة، وترميز الكيان، وما إلى ذلك. ويمنع منعا باتا استخدامه مباشرة في بيئة الإنتاج. يعتمد ذلك على beautifulsoup4، الذي يجب تثبيته بنفسك ويوصى بقفل الإصدار. لا يقوم الكود بإجراء طلبات الشبكة، ولا يقرأ أو يكتب إلى نظام الملفات. تعبر التأكيدات فقط عن السلوك المتوقع، وتعتمد النتائج الفعلية على بيئتك وإصدارات التبعية.
# 教学示例:演示BS4配合白名单清洗原理,非生产级实现
from bs4 import BeautifulSoup, Comment
import re
ALLOWED_TAGS = {'p', 'a', 'b', 'i', 'ul', 'li'}
ALLOWED_ATTRS = {'href'}
SAFE_URL_PATTERN = re.compile(r'^https?://', re.IGNORECASE)
def sanitize_html(raw: str) -> str:
soup = BeautifulSoup(raw, 'html.parser')
# 移除注释
for comment in soup.find_all(string=lambda t: isinstance(t, Comment)):
comment.extract()
# 遍历所有标签
for tag in soup.find_all(True):
if tag.name not in ALLOWED_TAGS:
tag.unwrap() # 保留子节点,移除标签本身
continue
# 清理属性
attrs_to_remove = [k for k in tag.attrs if k not in ALLOWED_ATTRS]
for attr in attrs_to_remove:
del tag[attr]
# 校验剩余安全属性值
if 'href' in tag.attrs:
href = tag['href']
if not isinstance(href, str) or not SAFE_URL_PATTERN.match(href.strip()):
del tag['href']
return str(soup)
# 合成测试用例(仅用于理解原理)
safe = '<p>Hello <a href="https://ok.com">link</a></p>'
unsafe_event = '<p onclick="x()">text</p>'
unsafe_uri = '<a href="javascript:alert(1)">bad</a>'
assert sanitize_html(safe) == '<p>Hello <a href="https://ok.com">link</a></p>'
assert 'onclick' not in sanitize_html(unsafe_event)
assert 'href' not in sanitize_html(unsafe_uri)
يمكن لبيئات الإنتاج التفكير في استخدام مكتبة تنقية مخصصة (مثل bleach) والاحتفاظ بتكوين القائمة البيضاء خارج التعليمات البرمجية. المفتاح هو: يجب أن يذكر منطق التنظيف صراحةً "ما هو مسموح به" بدلاً من محاولة تعداد "ما هو محظور".
معايير القبول ونقاط تفعيل المراجعة اليدوية
يمكن للتأكيدات الموجودة في الكود فقط التحقق من تنفيذ القواعد المحددة مسبقًا ولا يمكنها تغطية جميع الاستثناءات الواقعية. يسرد الجدول التالي المواقف الشائعة في المعالجة الفعلية للمستندات، بالإضافة إلى الحدود بين المعالجة التلقائية والتدخل اليدوي.
| مراقبة الظواهر | قرارات المعالجة الآلية | ما إذا كانت المراجعة اليدوية مطلوبة | ملاحظة |
|---|---|---|---|
| اسم العلامة ليس موجودًا في القائمة البيضاء ولكنه يحتوي على نص مهم | قم بفك الحفاظ على النص | لا | تأكد من عدم فقدان الدلالات |
| href هو مسار نسبي أو mailto: | إزالة سمة href | نعم | قد يكون رابطًا تجاريًا صالحًا ويحتاج إلى تأكيد يدوي. |
| JS مع ترميز كيان HTML في قيمة السمة | الرفض عن طريق مطابقة السلسلة | نعم | بحاجة إلى تأكيد ما إذا كان القتل غير العمد |
| يؤدي مستوى التداخل العميق جدًا إلى انتهاء مهلة التحليل | اقتطاع أو تخطي هذا الجزء | نعم | يمنع DoS، ولكنه قد يفقد المحتوى |
| بعد التنظيف، يتم تقليل طول النص بنسبة > 30% | وضع علامة مشبوهة | نعم | قد يزيد من المعلومات المنظمة |
"تم تمرير عرض التعليمات البرمجية" لا يساوي "التأثير الشامل ذو مصداقية". بالنسبة للعناصر التي تم وضع علامة "نعم" عليها في الجدول، يجب إيقاف العملية التلقائية مؤقتًا وتسليمها للمراجعة اليدوية. في سيناريوهات تسليم الترجمة، قد يؤدي التنظيف المفرط إلى مراجع المصطلحات المعطلة أو اصطلاحات التنسيق غير الصالحة.
📊 المقارنة الأساسية
| طريق | ما يمكن القيام به | لا يمكن استبدال أي شيء |
|---|---|---|
| تحليل حساء جميل | تحويل HTML إلى بنية شجرة قابلة للعبور والتعديل | سيتم الاحتفاظ بالأحكام والسمات والبروتوكولات الأمنية كما هي |
| طبقة تنظيف القائمة البيضاء | قم بالإعلان بوضوح عن العلامات والسمات المسموح بها، مع حذف الباقي | بالمراجعة اليدوية، لا يزال الوضع الحدودي بحاجة إلى تأكيد |
مكتبة التنقية الخاصة (مثل bleach) | مسؤول عن التنقية على مستوى الإنتاج ويدعم التكوين الخارجي | فرز وقبول القائمة البيضاء لأعمالك التجارية |
🎯 ما هي الطريقة المناسبة لك؟
إذا كنت بحاجة فقط إلى استخراج البيانات
ما عليك سوى استخدام BeautifulSoup مباشرةً، لكن لا تعرض مخرجاته كمحتوى معقم.
إذا كنت تعرض HTML خارجيًا أو قديمًا
قم أولاً بإنشاء طبقة تنظيف القائمة البيضاء، ثم اختبرها بندًا بندًا وفقًا لنموذج القبول.
إذا كنت مستعدًا للاتصال بالإنترنت للإنتاج
فكر في استخدام مكتبة مخصصة مثل bleach لإضفاء الطابع الخارجي على تكوين القائمة البيضاء والاحتفاظ بقواعد تشغيل المراجعة اليدوية.
إذا كنت تريد القيام بترجمة المستندات وتسليمها
تحقق من النص والروابط والتعليمات البرمجية والبنية بشكل منفصل، وقم بجدولة المراجعات اليدوية للعناصر المحددة في الجدول.
❓ الأسئلة الشائعة (الأسئلة الشائعة)
1. هل ستختفي التعليمات البرمجية الضارة بعد التحليل وإعادة التسلسل باستخدام BeautifulSoup؟
متعود. يوضح المثال الموجود في هذه المقالة أن <img src=x onerror=alert(1)> يظل سليمًا في الإخراج بعد التحليل والتسلسل.
2. كيفية التعامل مع العلامات والسمات خارج القائمة البيضاء؟
عندما لا تكون التسمية موجودة في القائمة البيضاء، يمكن إلغاء تغليف نصها للحفاظ عليها؛ يجب إزالة سمات معالج الأحداث مثل onclick بالكامل.
3. هل يمكن استخدام نموذج التعليمات البرمجية مباشرة في بيئة الإنتاج؟
لا أستطيع. هذا المثال مخصص فقط للتدريس التوضيحي ولا يتعامل مع تفاصيل مثل السمات متعددة القيم وتطبيع الحالة وترميز الكيان. يمكن لبيئة الإنتاج أخذ bleach في الاعتبار وتكوين القائمة البيضاء خارجيًا.
4. إذا نجح العرض التوضيحي للكود، فهل يعني ذلك أن تأثير المعالجة موثوق به؟
لا يمكن استنتاج هذا. إذا تم وضع علامة على النموذج بأنه يتطلب مراجعة يدوية، فيجب تعليق العملية التلقائية وتقديمها للمراجعة اليدوية.
5. هل يمكن اختباره مباشرة باستخدام ملفات حقيقية؟
يوصى بإزالة حساسية بيانات العمل أولاً، وإزالة المعلومات الشخصية والروابط الحساسة، ثم الاختبار وفقًا لبنود القبول.
استخدم قوائم المراجعة لترجمة المستندات
يجب معالجة النص والروابط والتعليمات البرمجية وبنية مستندات الويب بشكل منفصل. أضف الأجزاء المحمية إلى قائمة القبول، ثم قم بتقييم مدى سهولة القراءة وعرض الصفحة بعد الترجمة.
يوفر موقع OmniDoc (بوابة المنتج) بوابة لترجمة المستندات متعددة التنسيقات، ويقدم الموقع الرسمي وظائف التعرف الضوئي على الحروف (OCR) والمسرد ووظائف المقارنة ثنائية اللغة. بالنسبة للفرق التي ترغب في العمل مباشرة من الملفات، فهذا مسار يستحق التقييم باستخدام عينات من الحياة الواقعية. الرجاء استخدام الملفات غير الحساسة التي لديك إذن بتحميلها، واستخدام عناصر الاختيار في هذه المقالة لمراجعة النتائج. لا يوجد ادعاء هنا بأن OmniDoc يستخدم المكتبات مفتوحة المصدر أو الخوارزميات الداخلية المذكورة في هذه المقالة، والأمثلة ليست بديلاً عن اختبار أداء المنتج.
📝 ملخص
التحليل يجيب فقط على "كيف يبدو HTML"، ويعتمد الأمان على القائمة البيضاء والمراجعة اليدوية. قم أولاً بتشغيل المثال في بيئة تبعية مقفلة، ثم استخدم عينات غير حساسة لاختبار كل عنصر وفقًا لنموذج القبول، ثم قرر ما إذا كنت تريد الانضمام إلى العملية الرسمية.
جربه الآن: قم بتحميل المستند لبدء الترجمة، مع الاحتفاظ بالتخطيط الأصلي


