جارٍ التحميل...
الفحص والجودة
ثمانية فحوصات تقرأ ملفات مشروعك بحثاً عن الثغرات الشائعة، بأربعة مستويات خطورة ودرجة أمان من 100.
| الفحص | الخطورة | ما يبحث عنه | الإصلاح |
|---|---|---|---|
exposed-secret | حرِج | مفتاح أو كلمة سر مكتوبة داخل الكود خارج ملف .env | انقل القيمة إلى .env واقرأها من متغيرات البيئة |
sql-injection | حرِج | استعلام SQL مبني بـ template literal يحقن متغيراً في نص الاستعلام | استخدم استعلامات ذات معاملات أو Prisma |
eval-usage | عالٍ | استدعاء eval() — يسمح بتنفيذ كود عشوائي | استبدله بـ JSON.parse أو منطق صريح |
xss-risk | عالٍ | استخدام innerHTML في ملف يتعامل مع مدخلات المستخدم | استخدم textContent أو نظّف المدخلات |
public-secret | عالٍ | متغير يحمل SECRET أو KEY ببادئة NEXT_PUBLIC_ في .env | أزل البادئة — أي متغير بها يُرسل إلى المتصفح |
insecure-http | متوسط | روابط http:// غير مشفّرة (عدا localhost) | حوّلها إلى https:// |
dangerous-html | متوسط | استخدام dangerouslySetInnerHTML | نظّف المحتوى قبل حقنه أو تجنّب HTML الخام |
no-csrf | منخفض | مسار API يستقبل POST بلا أي إشارة إلى رمز حماية | أضف تحقّق CSRF أو رمز مصادقة |
كل نتيجة تحمل اسم الملف، ورقم السطر في الفحوصات التي تعمل سطراً بسطر مثل exposed-secret.
| الخطورة | الخصم لكل مشكلة |
|---|---|
| حرِج | 25 |
| عالٍ | 15 |
| متوسط | 8 |
| منخفض | 3 |
هذا النمط هو ما تمسكه قاعدة exposed-secret:
// ❌ المفتاح مكتوب في الكود ويُرفع مع المشروع
const apiKey = "sk_live_9f2c8ab41d7e5063";
والشكل الصحيح:
// ✅ القيمة في .env ولا تغادر الخادم
const apiKey = process.env.PAYMENT_API_KEY;
مع التنبّه إلى أن نقل المفتاح إلى .env لا يكفي وحده إذا كان قد رُفع من قبل إلى Git — المفتاح المكشوف مرة واحدة يجب تدويره، لا إخفاؤه.
للتهيئة لمحركات البحث راجع فاحص SEO، وللحجم وسرعة التحميل راجع فاحص الأداء. وإن كان مشروعك يتعامل مع بيانات حسّاسة، فخدمة الأمن السيبراني تغطي ما لا يصل إليه فاحص آلي.
تبدأ من 100 ويُخصم 25 لكل مشكلة حرجة، و15 لكل مشكلة عالية، و8 لكل متوسطة، و3 لكل منخفضة. مشكلتان حرجتان وحدهما تنزلان الدرجة إلى 50.
لا. الفاحص يقرأ الكود بحثاً عن أنماط معروفة، فهو يمسك الأخطاء الشائعة بسرعة لكنه لا يفهم منطق تطبيقك ولا يختبره وهو يعمل. للأنظمة التي تتعامل مع مدفوعات أو بيانات شخصية تلزم مراجعة بشرية.
بعض القواعد تعتمد على أنماط نصية وقد تنتج إنذاراً كاذباً، مثل dangerouslySetInnerHTML مع محتوى مُنظَّف مسبقاً. راجع الحالة وتجاهلها بوعي؛ الأهم ألا تتجاهل الحرِج والعالي.
لأن Next.js يستبدل كل متغير ببادئة NEXT_PUBLIC_ داخل حزمة المتصفح وقت البناء. المتغير السري بهذه البادئة يصبح مقروءاً لأي زائر يفتح أدوات المطوّر.