
Engagement Manager هو تطبيق ويب لتتبع مهام الأمن الهجومي. يتميز بواجهة مستخدم حديثة، مبنية باستخدام Next.js وPrisma وPostgreSQL.
مدير المهام هو تطبيق ويب لتتبع مهام الأمن الهجومي. يتميز بواجهة مستخدم حديثة، مبنية باستخدام Next.js وPrisma وPostgreSQL. يتضمن التطبيق تقويمًا، ومهامًا، وعملاء، وجهات اتصال، ونتائج، ومشغلين.

تقتصر الصادرات على 2 ميغابايت و500 نتيجة لكل استيراد، مع حدود معدل المعاينة والتأكيد لكل مستخدم. يقبل التطبيق ما لا يزيد عن 10,000 نتيجة إجمالاً و500 لمهمة واحدة عبر الإنشاء اليدوي والقوالب واستيرادات الماسحات الضوئية. تحمّل قائمة Findings العامة 100 صف لكل صفحة، وتُحدَّد استعلامات نتائج المهمة/التقرير بنفس الحد لكل مهمة. تفشل التخطيطات غير المعروفة بشكل مرئي بدلاً من معاملتها بصمت كاستيراد ناجح. خطورات الماسح الضوئي هي اقتراحات: راجع سياقها قبل الموافقة. لا يتم جلب أو تنفيذ عناوين URL المشار إليها أو HTML أو الصور البعيدة المضمنة.
تسمح التقارير بـ 1–100 نتيجة، وما يصل إلى 100 صورة دليل (5 ميغابايت لكل منها، 20 ميغابايت إجمالي الإدخال)، و500 صفحة و25 ميغابايت إخراج. يقتصر الإصدار على 50 نسخة لكل مهمة و1 غيغابايت من ملفات PDF الصادرة عبر التطبيق. للمعاينة والإصدار حدود معدل لكل مستخدم، ويُقبل عرض PDF واحد فقط لكل عملية تطبيق في المرة الواحدة. تحتفظ النتائج بما لا يزيد عن 1000 مراجعة و500 تعليق؛ والوصول إلى الحد يفشل دون الكتابة فوق السجل. خطوط DejaVu وترخيص إعادة توزيعها مضمنة في assets/fonts؛ ويجب أن تحتفظ عمليات النشر بهذه الأصول (يتضمن تتبع مخرجات Next.js هذه الأصول).
تشترك إجراءات خادم Next.js في حد حجم جسم واحد 25mb (المحدد في next.config.ts) لتحميلات الأدلة. يستخدم تسجيل الدخول مسارًا مخصصًا بنفس الأصل بترميز URL مع حد بث 4 كيلوبايت قبل المصادقة أو العمل على قاعدة البيانات.
يحافظ هذا على مساحة العمل المشتركة الموثّقة الحالية، وليس نموذجًا جديدًا لتعدد المستأجرين لكل عميل. تتحقق جميع الصفحات والإجراءات وتنزيلات PDF الجديدة من جلسة حالية مدعومة بقاعدة البيانات. تُحدَّد المسودات لمالكها؛ وتُفرض أذونات المراجعة والموافقة على القوالب والإصدار من جانب الخادم. استجابات PDF السرية خاصة/بدون تخزين. تحتوي ملفات PDF النهائية فقط على قائمة سماح صريحة لحقول التقرير، ولا تحتوي أبدًا على مسودات خاصة أو تعليقات مراجعة أو مهام غير ذات صلة.
يستخدم التنفيذ قائمة التحقق OWASP Top 10:2025: فحوصات الوصول (A01)، والاستجابات الخاصة وضوابط CSP/CSRF الحالية (A02)، والتبعيات المثبتة وCI (A03)، وحمايات الجلسة/الأسرار الحالية بالإضافة إلى فحوصات سلامة التقرير (A04/A08)، وMarkdown/XML الخامل والوصول إلى قاعدة البيانات ذي المعاملات (A05)، والمعالجة المحدودة والمراجعة المستقلة (A06)، وفحوصات الجلسة الحية (A07)، وأحداث التدقيق الخالية من المحتوى (A09)، والتغييرات المعاملاتية مع التنظيف عند الفشل (A10). يكشف الملخص عن التلف العرضي؛ وهو ليس توقيعًا رقميًا أو حماية من مسؤول قاعدة البيانات. هذا ليس شهادة امتثال. لا يزال الإنتاج يتطلب HTTPS، وتخزين قاعدة البيانات/النسخ الاحتياطي المحمي، والمراقبة التشغيلية لمخرجات التدقيق.
قبل نشر هذا الترقية، خذ نسخة احتياطية عادية للتطبيق وطبّق الترحيلات الإضافية 20260904221808_reporting_workflow و20260906194500_add_revocable_sessions باستخدام npm run db:migrate، ثم أعد إنشاء Prisma Client وأعد البناء. تبدأ النتائج الحالية كمسودة في الإصدار 1، ويجب أن تسجل ملفات تعريف ارتباط المتصفح الحالية الدخول مرة أخرى حتى تتلقى معرف جلسة مدعومًا من الخادم. لا تعد تعيين قاعدة بيانات موجودة. تتضمن النسخ الاحتياطية الجداول الجديدة وملفات PDF الصادرة عبر تصدير قاعدة البيانات الكامل الحالي.
npm test npm run lint npx tsc --noEmit --noUnusedLocals --noUnusedParameters npm run build npm audit
يستخدم `npm test` وضع الاختبار غير المعزول في Node مع `tsx` بحيث تُنفَّذ حالات اختبار TypeScript الفردية فعليًا، بدلًا من مجرد الإبلاغ عن نجاح العملية الفرعية للملف. أبقِ إجماليات التأكيدات الصريحة ظاهرة في CI.
تتطلب اختبارات الانحدار لقاعدة البيانات والمتصفح **قاعدة بيانات محلية مخصصة باسم `reporting_tests`**، مع تطبيق الترحيلات. فهي تنشئ صفوف بياناتها التجريبية وتحذفها بنفسها؛ لا توجّه هذه الاختبارات أبدًا إلى قاعدة بيانات تطبيقية. اضبط `REPORTING_TEST_DATABASE_URL` على قاعدة بيانات الاختبار تلك، ثم شغّل:```bash
DATABASE_URL="$REPORTING_TEST_DATABASE_URL" npx prisma migrate deploy
npm run test:reporting
npx playwright install chromium
npm run test:browser
يبدأ جناح المتصفح خادم تطوير خاص به على واجهة الاسترجاع المحلية (loopback) على المنفذ 3317 مع سر جلسة مخصص للاختبار فقط؛ ويرفض إعادة استخدام خادم موجود. اضبط REPORTING_TEST_BROWSER على ملف تنفيذي لـ Chromium مثبّت إذا رغبت في ذلك. يختبر خصوصية المسودة، والتعديلات المتعارضة، ورفع الأدلة، والمراجعة المستقلة، وأذونات PDF/عدم قابليته للتغيير، وإنشاء القوالب بدون JavaScript، والاستيرادات الانتقائية منزوعة التكرار. تمارس اختبارات التكامل تعارضات المعاملات الفعلية والتراجع. لا تحل هذه الأجنحة محل التحقق من شبكة LAN البعيدة أو Safari أو النشر في بيئة الإنتاج.
صُمم هذا التطبيق ليعمل على Ubuntu، ويتطلب ما يلي:```bash sudo apt update && sudo apt install -y nodejs npm postgresql postgresql-client postgresql-contrib zip
`postgresql-client` يوفر `pg_dump` و`pg_restore` و`psql`؛ بينما `zip` ينشئ أرشيفات النسخ الاحتياطي. تتم معالجة استخراج الاستعادة بواسطة التطبيق مع التحقق الصارم من المدخلات والأحجام.
تثبيت الحزم لا يضمن دائمًا بقاء PostgreSQL قيد التشغيل. ابدأ الخدمة وفعّل التشغيل التلقائي لها قبل إنشاء الأدوار أو تشغيل التطبيق:```bash
sudo systemctl enable --now postgresql
sudo systemctl status postgresql --no-pager
إذا فشل التطبيق لاحقًا مع Can't reach database server at 127.0.0.1:5432، فشغّل sudo systemctl start postgresql وتأكد باستخدام pg_isready -h 127.0.0.1 -p 5432.
يتطلب التطبيق Node.js ^22.12.0 أو >=24.0.0 (انظر engines في package.json). إذا كانت حزمة نظام التشغيل أقدم، فثبّت إصدارًا مدعومًا من مصدر حزم موثوق تتحقق من توقيعاته قبل تشغيل setup.sh.
أنشئ ملف .env في جذر المشروع قبل تشغيل Prisma أو التطبيق:```bash
cat > .env << 'EOF'
DATABASE_URL="postgresql://em_admin:em_pass@localhost:5432/engagement_manager?schema=public"
JWT_SECRET="replace-with-a-long-random-secret-at-least-32-characters"
EOF
chmod 600 .env
| المتغير | مطلوب | ملاحظات |
|----------|----------|-------|
| `DATABASE_URL` | نعم | سلسلة اتصال PostgreSQL. يستخدم Prisma معامل الاستعلام `schema=public`. تستخدم النسخ الاحتياطي والاستعادة ملف pgpass مؤقتًا مخصصًا للمالك فقط حتى لا تُوضع كلمة المرور في وسائط العمليات الفرعية. |
| `JWT_SECRET` | نعم في بيئة الإنتاج | يجب أن يكون بطول **32 حرفًا** على الأقل. يرفض التطبيق بدء التشغيل في بيئة الإنتاج بدونه. يؤدي تدويره إلى إبطال جميع الجلسات الحالية. |
| `TRUST_PROXY` | لا | اضبطه على `1` (أو `true`) فقط عندما يكون التطبيق خلف وكيل عكسي **يستبدل** `X-Forwarded-For` / `X-Real-IP` و `X-Forwarded-Host`. تستخدم فحوصات أصل تسجيل الدخول `X-Forwarded-Host` عند وجوده في هذا الوضع؛ ويجب أن يحتوي على مضيف عام واحد، بما في ذلك منفذ غير افتراضي عند استخدامه. وإلا فيجب أن يحافظ الوكيل على ترويسة `Host` العامة. هذه هي البنية المطلوبة في بيئة الإنتاج لحدود تسجيل الدخول الدقيقة لكل مصدر. عند عدم ضبطه، يتم تجاهل الترويسات لمنع الانتحال، ويستخدم تسجيل الدخول ميزانية احتياطية مشتركة أعلى مدتها دقيقة واحدة حتى لا يتمكن عميل واحد من فرض قفل عام لمدة 15 دقيقة. |
| `ALLOWED_DEV_ORIGINS` | لا | **للتطوير فقط.** أسماء مضيفين إضافية مسموح لها بتحميل أصول `/_next` (مفصولة بفواصل). تُسمح عناوين IPv4 الحالية للشبكة المحلية للخادم تلقائيًا. استخدم هذا لاسم DNS ثابت. تتجاهل إصدارات الإنتاج هذا. |
أنشئ سرًا قويًا:```bash
openssl rand -base64 32
تأكد من تشغيل PostgreSQL أولاً (انظر المتطلبات الأساسية). يقوم ./setup.sh الآلي بتشغيل الخدمة نيابةً عنك؛ تفترض الخطوات اليدوية أدناه أنها قيد التشغيل بالفعل.
نفّذ الأوامر التالية لإنشاء قاعدة بيانات PostgreSQL والمستخدم:```bash sudo -u postgres createuser --pwprompt em_admin sudo -u postgres psql -c "ALTER USER em_admin CREATEDB;" sudo -u postgres createdb --owner=em_admin engagement_manager sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE engagement_manager TO em_admin;"
### الإنتاج
استخدم مستخدم قاعدة بيانات مخصصًا بأقل صلاحيات ممكنة — لا تمنح صلاحيات `CREATEDB` أو حقوق المستخدم الخارق:```bash
sudo -u postgres createuser --pwprompt em_app
sudo -u postgres createdb --owner=em_app engagement_manager
قم بتعيين DATABASE_URL لاستخدام em_app (أو اسم المستخدم الذي اخترته). يتم تشغيل الترحيلات باسم هذا المستخدم عبر npm run db:migrate.
ملاحظة: يتم تخزين ملفات قاعدة البيانات في دليل بيانات PostgreSQL (عادةً
/var/lib/postgresql/<version>/main/).
من جذر المستودع، شغّل:```bash chmod +x setup.sh ./setup.sh
يقوم السكربت بتثبيت المتطلبات الأساسية، وبدء خدمة PostgreSQL وتمكينها، ويطلب اسم مستخدم وكلمة مرور لقاعدة البيانات، ويكتب ملف `.env` بصلاحيات `chmod 600`، وينشئ دور PostgreSQL وقاعدة البيانات، ويطبّق الترحيلات، ويزرع حساب المسؤول الافتراضي. كما يُكمل وضع الإنتاج `npm run build` ويطبع فقط أمر بدء الإنتاج. وهو لا يثبّت Node.js من سكربت shell عن بُعد؛ ثبّت إصدار Node.js مدعومًا أولًا.
للاستخدام بدون واجهة أو في CI:```bash
sudo install -d -m 700 -o "$USER" /secure
openssl rand -base64 24 > /secure/db-password
chmod 600 /secure/db-password
./setup.sh -y --db-user=em_admin --db-pass-file=/secure/db-password
شغّل ./setup.sh --help لعرض جميع الخيارات.
--db-pass=... لأن أسرار سطر الأوامر تكون مرئية للعمليات الأخرى. ضع كلمة المرور في ملف مخصص للمالك فقط واستبدل الوسيط القديم بـ --db-pass-file=/secure/db-password؛ مثال الإعداد الآلي أعلاه جاهز للنسخ واللصق.setup.sh يثبّت Node.js. ثبّت إصدار Node.js مدعومًا (^22.12.0 أو >=24.0.0) من مصدر حزم موثوق قبل تشغيله.npm ci، لذا يجب أن يكون package-lock.json موجودًا ومتزامنًا مع package.json..sql. قبل إيقاف خادم قديم، قم بترقيته إلى إصدار يمكنه إنشاء نسخة احتياطية منظمة للتطبيق وإعادة تصدير البيانات بصيغة .zip.من دليل المشروع، يقوم أمر واحد بتثبيت تحديثات الحزم، وتشغيل PostgreSQL إذا كان متوقفًا، وبدء التطبيق:```bash ./run.sh
اترك تلك النافذة مفتوحة. استخدم عنوان Local أو Network الذي يطبعه.
لبدء تشغيله بنفسك بدلاً من ذلك: يجب أن يكون PostgreSQL قيد التشغيل (`sudo systemctl start postgresql` إذا لزم الأمر). ثم ابدأ خادم التطوير:```bash
npm run dev
تطبع عملية بدء التشغيل كلاً من عنوان URL للاسترجاع وعنوان LAN لهذا الجهاز:```
`npm run dev` و `npm start` يربطان `0.0.0.0` بحيث يعمل عنوان URL للشبكة على LAN. تعامل مع الوصول عبر LAN كوصول مختبري فقط على شبكة موثوقة. وضع التطوير غير مُحصَّن للإنترنت العام.
إذا فتحت التطبيق عبر **اسم المضيف** (وليس IP) وكان المتصفح البعيد يعرض صفحة بيضاء فارغة، فأضف ذلك الاسم إلى `.env` وأعد التشغيل:```bash
ALLOWED_DEV_ORIGINS=dev.office.example
^22.12.0 أو >=24.0.0 (انظر engines في package.json)Secure في بيئة الإنتاج.uploads/ (لقطات شاشة الثغرات)استنسخ المستودع وثبّت التبعيات: ```bash npm ci
أنشئ ملف .env بقيم الإنتاج (DATABASE_URL، JWT_SECRET بطول 32 حرفًا على الأقل).
طبّق ترحيلات قاعدة البيانات: ```bash npm run db:migrate
تشغيل فحوصات ما قبل النشر: ```bash npm run audit npm run typecheck npm run build
ابدأ التطبيق باستخدام NODE_ENV=production: ```bash
NODE_ENV=production npm run start
بالنسبة لخادم حقيقي، شغّل هذا تحت مدير عمليات (systemd، PM2، إلخ) وضع وكيلاً عكسياً في المقدمة لإنهاء TLS.
JWT_SECRET لا يقل عن 32 حرفاً وغير مُودَع في gitNODE_ENV=production مضبوط للعملية قيد التشغيلCREATEDB أو صلاحيات المستخدم الخارقuploads/ على قرص دائم ومضمّن في النسخ الاحتياطيةbackups/ على قرص دائم إذا استخدم المسؤولون النسخ الاحتياطيpg_dump وpg_restore وzip متاحة إذا سيستخدم المسؤولون النسخ الاحتياطي/الاستعادةبعد بذر قاعدة البيانات، يمكنك تسجيل الدخول باستخدام حساب المسؤول المؤقت المُنشأ:
admininitial-admin-credentials.txt المخصص للمالك فقط بواسطة npx prisma db seed / npm run db:seedملاحظة: سيُطلب منك تغيير كلمة المرور المؤقتة هذه عند أول تسجيل دخول. احذف
initial-admin-credentials.txtفوراً بعد ذلك. يجب أن تكون جميع كلمات المرور 16 حرفاً على الأقل وأن تتضمن حرفاً كبيراً وحرفاً صغيراً ورقماً ورمزاً.
/dashboard/users).في Admin، تُظهر لوحة Database أزرار Backup وRestore وReset. تسرد لوحة Users الحسابات وتوفر زر New User لإضافة مستخدمين. تتيح لوحة Appearance للمسؤول اختيار لون التمييز على مستوى التطبيق.
يتطلب Backup كلمة مرور المسؤول، ثم يحفظ ملف .zip باسم em-backup-YYYY-MM-DD-HHMM.zip في backups/ في دليل التطبيق (engagement-mgr/backups/). بعد تصدير ناجح، استخدم Download في صفحة Admin. يُحتفظ بمنحة موقّعة قصيرة الأجل في ملف تعريف ارتباط HttpOnly وتعمل فقط للمسؤول الذي أنشأ النسخة الاحتياطية.
em-backup-2026-06-02-1430.zip.| المسار | المحتويات |
|---|---|
engagement-manager-backup/database.dump | تفريغ PostgreSQL كامل بالتنسيق المخصص (المخطط، الجداول، البيانات، التعدادات، العلاقات) من pg_dump |
engagement-manager-backup/uploads/ | ملفات لقطات شاشة النتائج المشار إليها في قاعدة البيانات |
.zip أنشأه Backup ويستبدل قاعدة البيانات الحالية ومجلد uploads/. تقتصر الاستعادة عبر المتصفح على 8 ميغابايت حتى لا تتمكن إزالة الضغط من احتكار عملية الويب. لأرشيف أكبر، أوقف التطبيق وشغّل npm run db:restore -- /absolute/path/to/em-backup.zip كمستخدم التطبيق. يحمّل الأمر دون اتصال .env من دليل العمل ويتطلب DATABASE_URL غير فارغ في .env أو البيئة. يقبل الملفات العادية حتى 500 ميغابايت ويمرر كل مدخل أرشيف عبر حد حجمه الموسّع. تعمل استعادة قاعدة البيانات في معاملة واحدة؛ يتم التحقق من أعداد مدخلات الأرشيف والمسارات ونسب الضغط والأحجام الموسّعة قبل تثبيت الملفات. تتشارك النسخة الاحتياطية والاستعادة وإعادة الضبط وتغييرات ملفات لقطات الشاشة قفل صيانة حصرياً بحيث لا يمكن تداخل عمليات إيداع قاعدة البيانات وتبديل نظام الملفات. يتطلب كلمة مرور المسؤول للتأكيد.admin. يتطلب كتابة RESET وإعادة إدخال كلمة المرور الحالية للمسؤول المؤكِّد. تصبح كلمة المرور تلك كلمة المرور المؤقتة للحساب المُعاد إنشاؤه ويجب تغييرها عند أول تسجيل دخول.الخادم القديم
.zip وانسخه إلى الخادم الجديد (على سبيل المثال باستخدام scp أو rsync): ```bash
scp em-backup-2026-06-02-1430.zip user@new-server:/path/to/
خادم جديد
.env يحتوي على DATABASE_URL و JWT_SECRET (انظر إعداد البيئة).npm ci.admin باستخدام ملف initial-admin-credentials.txt المخصص للمالك فقط، وغيّر كلمة المرور المؤقتة، واحذف ملف بيانات الاعتماد./dashboard/users)، وانقر على Restore (ضمن Database)، واختر ملف .zip من الخادم القديم، وأدخل كلمة مرور المسؤول، وأكّد.ملاحظات
uploads/.git clone (أو انشر نفس المراجعة) على الخادم الجديد حتى يتطابق التطبيق مع المخطط الذي يتوقعه النسخ الاحتياطي. إذا كان الخادم القديم يعمل بمخطط أحدث من الكود المستنسخ، فقم بمحاذاة الإصدارات قبل الاستيراد.يوثّق هذا القسم البنية المعمارية، ومخطط قاعدة البيانات، والتدابير الأمنية، ومراحل التطوير المكتملة لتطبيق Engagement Manager.
Modal.tsx و.modal-panel في globals.css.إضافات التقارير: يخزّن Finding أيضًا version وreviewStatus وauthorId وreviewerId وtemplateId وimportFingerprint؛ ويخزّن Screenshot الحقل sortOrder. يحتفظ FindingTemplate بصياغة قابلة لإعادة الاستخدام تمت مراجعتها؛ ويحتفظ FindingRevision بمراجعات نصية غير قابلة للتغيير؛ ويحتفظ FindingDraft بمسودات خاصة لكل مستخدم مع إصدارات التعارض؛ ويسجّل FindingComment مناقشات المراجعة؛ ويحتفظ EngagementReport بعنوان التقرير والملخص التنفيذي ومعرّفات النتائج المرتّبة؛ ويخزّن IssuedReport ملف PDF غير قابل للتغيير ولقطة محتوى وملخص SHA-256 لكل إصدار صادر. تستخدم علاقات المؤلف/المراجع للمستخدم SetNull؛ وتُحذف المسودات الخاصة عند حذف مستخدمها. تتبع سجلات التقارير دورة حياة engagement/finding الأب الخاص بها.
id، username، passwordHash، role (Admin، User)، lastPasswordChange، lastLogin، sessions، createdAt، updatedAt.id، userId، expiresAt، createdAt — تجعل السجلات من جانب الخادم كل جلسة تسجيل دخول موقّعة قابلة للإلغاء بشكل فردي عند تسجيل الخروج.key، count، — حجوزات ذرّية لمحاولات المصدر وتأكيد كلمة المرور. كما أن للتحقق من كلمة المرور حدّ تزامن محدود.لإضافة حقل جديد إلى نموذج موجود (على سبيل المثال، focus في Engagement):
prisma/schema.prisma وأضف الحقل إلى النموذج المطلوب: ```prisma
model Engagement {
id String @id @default(uuid())
codeName String
focus String? // new field
...
}
prisma/schema.prisma بما يلي: ```bash
npx prisma migrate dev --name describe_your_change
هذا ينشئ ترحيلاً، ويحدّث قاعدة البيانات، ويعيد توليد أنواع Prisma Client.
admin الافتراضي عبر Prisma seed. تتمتع أدوار Admin بصلاحية إنشاء/تعديل/حذف كاملة لجميع السجلات. يمكن لأدوار User إنشاء وتعديل وحذف النتائج ولقطات الشاشة؛ بينما تكون جميع الكيانات الأخرى (المهام، العملاء، جهات الاتصال، المشغلون) للقراءة فقط بالنسبة للمستخدمين. تقوم كل صفحة من صفحات لوحة التحكم بتحديث الجلسة مقابل قاعدة البيانات قبل قراءة البيانات السرية. يمكن للمشرفين فقط الوصول إلى صفحة الإدارة (/dashboard/users)، وإدارة الحسابات، وتغيير لون التمييز على مستوى التطبيق، وإجراء النسخ الاحتياطي أو الاستعادة أو إعادة تعيين قاعدة البيانات. تتطلب عمليات النسخ الاحتياطي والاستعادة وإعادة التعيين إعادة تأكيد كلمة المرور. إنشاء نسخة احتياطية هو Server Action؛ ويستخدم تنزيل المتصفح GET /api/db/backup?file=… مع جلسة Admin ومنحة موقّعة لمدة خمس دقائق في ملف تعريف ارتباط HttpOnly.jose مخزّنة في ملفات تعريف ارتباط HttpOnly وSameSite=Lax مع صف Session مطابق على جانب الخادم يُبطله تسجيل الخروج. تم حذف انتهاء صلاحية ملف تعريف الارتباط عمداً للحفاظ على سلوك جلسة المتصفح؛ تنتهي صلاحية كل من الرمز الموقّع وسجل قاعدة البيانات بعد يوم واحد. يحتفظ القبول المعاملاتي بعشر جلسات نشطة كحد أقصى لكل حساب.| عائلة الماسح/التصدير | التصدير المقبول |
|---|
| Burp Suite | Issues XML، بما في ذلك DTD المخطط الداخلي الخامل |
| Nessus / Tenable | Nessus v2 XML (.nessus) |
| Nmap | XML؛ تصبح المنافذ المفتوحة ومخرجات نصوصها البرمجية ملاحظات إعلامية، وليست ثغرات مستنتجة |
| OpenVAS / Greenbone | تقرير XML أصلي أو GMP get_reports_response |
| OWASP ZAP | تقرير JSON التقليدي مع المواقع والتنبيهات |
| Nuclei | JSON Lines (-jsonl) |
| Qualys | XML لنتائج الفحص (بنية SCAN/IP)، وليس تنسيق واجهة برمجة اكتشاف المضيف المنفصل |
| Semgrep / CodeQL ومنتجات SARIF الأخرى | تشغيلات SARIF JSON والقواعد والنتائج |
resetAthighlightColor (Red، Blue، Teal، Green، Purple، أو Amber) وupdatedAt.id، codeName، clientId، chargeCode، status (Prep، Recon، Testing، Reporting، Complete)، focus، type (AI، Code_Review، Firewall، Multi، Pentest، Phishing، Physical، Purple_Team، Red_Team، USB_Drop، Vishing، Web_App، Wireless)، location (Internal، External)، startPrep، endPrep، startRecon، endRecon، startTesting، endTesting، startReporting، endReporting، outbrief، objectives، targets، exclusions، notes، operators (M:N)، contacts/trustedAgents (M:N مع Contact)، findings، findingContexts، createdAt، updatedAt.id، company (عمود قاعدة البيانات: companyName)، address، city، state، zip، phone (عمود قاعدة البيانات: phoneNumber)، website، notes، contacts، engagements، createdAt، updatedAt.id، clientId، name، title، email، phone (عمود قاعدة البيانات: phoneNumber)، notes، assignedEngagements، trustedEngagements، createdAt، updatedAt.id، engagementId (اختياري)، title، category، severity، background، remediation، supportingData (عمود قاعدة البيانات: supportingLinks)، screenshots، engagementContext، createdAt، updatedAt.id، engagementId، findingId، observation، affectedHosts، createdAt، updatedAt.id، findingId، filePath، description، createdAt.id، name، title، email، phoneNumber، discord، github، notes، engagements (M:N)، createdAt، updatedAt.src/proxy.ts) فحوصات الجلسة وتدوير كلمة المرور كل 90 يوماً عبر جميع المسارات المحمية./api/uploads الموثّق IDOR ويعيد استجابات no-store.