كيفية تأمين تبعيات NPM: دليل شامل لأمن سلسلة التوريد لمطوري API

Ashley Innocent

Ashley Innocent

1 أبريل 2026

كيفية تأمين تبعيات NPM: دليل شامل لأمن سلسلة التوريد لمطوري API

ملخص سريع

ارتفعت هجمات سلسلة توريد NPM إلى أكثر من 3000 حزمة ضارة في عام 2024 وحده، وأثبت اختراق Axios في مارس 2026 أن حتى الحزم العشرة الأولى ليست آمنة. يغطي هذا الدليل كل طبقة دفاع يحتاجها مطورو واجهة برمجة التطبيقات: فرض ملفات القفل (lockfile enforcement)، وحظر نصوص ما بعد التثبيت (postinstall script blocking)، والتحقق من المصدر (provenance verification)، وأدوات التحليل السلوكي (behavioral analysis tools)، والخيارات المعمارية التي تقلل من سطح الهجوم الخاص بك.

مقدمة

لم يكن هجوم سلسلة توريد Axios في 31 مارس 2026 أول اختراق لـ npm. ولن يكون الأخير. ولكن مع 83 مليون تنزيل أسبوعي ونشر أداة الوصول عن بعد (RAT) عبر حساب مشرف واحد تم اختراقه، كان هذا أقوى إنذار تلقاه نظام JavaScript البيئي.

إليك ما يجعل هذا مختلفًا عن نصيحة "تحديث تبعياتك" المعتادة: تجاوز هجوم Axios كل دفاع تقليدي. لم يكن الكود الخبيث موجودًا في Axios نفسها. بل تم حقنه عبر تبعية شبحية أطلقت خطاف ما بعد التثبيت (postinstall hook). لم تساعد ملفات القفل إذا قمت بتشغيل npm install أثناء فترة الهجوم. ولم يساعد تثبيت الإصدار إذا لم تكن قد ثبته بعد.

يتعرض مطورو واجهة برمجة التطبيقات بشكل خاص. فسكربتات الاختبار، وخطوط أنابيب CI/CD، والخوادم الوهمية (mock servers)، وعملاء HTTP كلها تسحب من npm. يمكن لحزمة واحدة مخترقة في مجموعة أدواتك أن تسرب مفاتيح API وبيانات اعتماد قاعدة البيانات ورموز السحابة من جهاز التطوير الخاص بك.

💡
يلغي Apidog أحد نواقل الهجوم الرئيسية من خلال توفير عميل HTTP مدمج لاختبار واجهة برمجة التطبيقات، لذلك لا تحتاج إلى Axios أو node-fetch أو got في مكدس الاختبار الخاص بك. قم بتنزيل Apidog مجانًا لتقليل سطح اعتماد npm الخاص بك مع اتباع استراتيجيات الدفاع أدناه.
button

يغطي هذا الدليل سبع طبقات من الحماية، من النظافة الأساسية لملفات القفل إلى التحليل السلوكي المتقدم.

الطبقة 1: فرض ملفات القفل

لماذا تهم ملفات القفل

يسجل ملف القفل (lockfile) الإصدار الدقيق لكل حزمة وتبعيتها الانتقالية في وقت التثبيت. بدون ملف قفل، يحل npm install أحدث إصدار يطابق نطاق semver الخاص بك. إذا كان package.json الخاص بك يقول "axios": "^1.14.0" ووجد إصدار خبيث 1.14.1 في السجل، فستحصل على الإصدار الخبيث.

القواعد

التزم دائمًا بملف القفل الخاص بك. سواء كان package-lock.json (npm)، أو yarn.lock (Yarn)، أو pnpm-lock.yaml (pnpm)، أو bun.lock (Bun)، فإنه ينتمي إلى التحكم في الإصدار.

استخدم التثبيتات المجمدة في CI/CD. لا تقم أبدًا بتشغيل npm install في بيئات التشغيل الآلي. استخدم ما يعادل ملف القفل المجمد:

# npm
npm ci

# yarn
yarn install --frozen-lockfile

# pnpm
pnpm install --frozen-lockfile

# bun
bun install --frozen-lockfile

يحذف npm ci مجلد node_modules ويثبت بشكل صارم من ملف القفل. إذا لم يتطابق ملف القفل مع package.json، فإنه يفشل. هذا يمنع مفاجآت الدقة.

راجع فروقات ملف القفل في طلبات السحب (pull requests). عندما يقوم طلب سحب بتعديل package-lock.json، تحقق مما تغير. أي تبعيات جديدة، أو زيادات في الإصدار، أو تغييرات في عنوان URL للسجل تستحق التدقيق. يمكن لأدوات آلية مثل Socket.dev وضع علامة على تغييرات ملف القفل المشبوهة في مراجعات طلبات السحب.

فجوة ملف القفل

تحمي ملفات القفل من حل الإصدار غير المتوقع، لكنها لا تحمي من التثبيت الأول. إذا قمت بتهيئة مشروع أو إضافة تبعية جديدة أثناء فترة الهجوم، فسيتم قفل الإصدار الخبيث. لهذا السبب تعد ملفات القفل هي الطبقة الأولى، وليست الطبقة الوحيدة.

الطبقة 2: تعطيل سكربتات ما بعد التثبيت

نقطة الهجوم الأساسية

استخدم هجوم Axios، وهجوم ua-parser-js، وهجوم event-stream، وعشرات الهجمات الأخرى نفس الآلية: سكربت postinstall يقوم بتشغيل تعليمات برمجية عشوائية أثناء npm install. يتم تنفيذ هذا الخطاف قبل تشغيل تعليمات تطبيقك البرمجية، وقبل مراجعة الحزمة، وقبل أن تتمكن أي أداة أمان في وقت التشغيل من التدخل.

حظر السكربتات عالميًا

أضف إلى ملف .npmrc الخاص بك:

ignore-scripts=true

أو قم بتعيينه عبر سطر الأوامر (CLI):

npm config set ignore-scripts true

يمنع هذا جميع سكربتات دورة الحياة (preinstall، install، postinstall، prepare) من التشغيل أثناء تثبيت الحزمة.

التعامل مع الحزم التي تحتاج إلى سكربتات

تتطلب بعض الحزم سكربتات ما بعد التثبيت للتجميع الأصلي (مثل bcrypt، sharp، أو sqlite3). لديك خياران:

الخيار 1: تشغيل السكربتات بشكل انتقائي بعد التثبيت

npm ci --ignore-scripts
npm rebuild bcrypt sharp

الخيار 2: استخدام قائمة السماح (npm 10+)

أنشئ ملف .scriptsrc.json يسمح فقط للحزم الموثوقة بتشغيل السكربتات:

{
  "allowScripts": {
    "bcrypt": true,
    "sharp": true
  }
}

الخيار 3: استخدام الثنائيات المسبقة التجميع (prebuilt binaries)

تقدم العديد من الحزم التي كانت تحتاج سابقًا إلى تجميع أصلي الآن ثنائيات مسبقة التجميع. sharp، على سبيل المثال، يشحن ثنائيات مسبقة التجميع لمعظم المنصات، مما يلغي الحاجة إلى تجميع ما بعد التثبيت. تحقق من تبعياتك؛ قد تحتاج إلى استثناءات أقل للسكربتات مما تعتقد.

تحذير PackageGate

في يناير 2026، كشف الباحثون عن ستة ثغرات أمنية من نوع "صفر يوم" تسمى "PackageGate" والتي تؤثر على npm و pnpm و vlt و Bun. أحد النتائج: يمكن أن تحمل التبعيات المستندة إلى Git ملفات تهيئة تمكن من تنفيذ التعليمات البرمجية حتى عندما تكون سكربتات دورة الحياة معطلة. إذا كان ملف package.json الخاص بك يشير إلى عناوين URL لـ Git للتبعيات، فإن ignore-scripts وحده لا يكفي. قم بتثبيت هذه التبعيات على تجزئات التزام محددة وقم بمراجعة محتويات المستودع.

الطبقة 3: تثبيت الإصدارات الدقيقة

توقف عن استخدام نطاقات SemVer

السلوك الافتراضي لـ npm install --save يضيف الحزم مع بادئة علامة الإقحام:

{
  "axios": "^1.14.0"
}

تعني علامة ^ "متوافق مع 1.14.0"، والتي تحل إلى أحدث إصدار 1.x.x. خلال هجوم Axios، كان هذا يعني الحل إلى 1.14.1.

قم بتثبيت الإصدارات الدقيقة بدلاً من ذلك:

{
  "axios": "1.14.0"
}

قم بتكوين npm لحفظ الإصدارات الدقيقة افتراضيًا:

# .npmrc
save-exact=true
save-prefix=''

استخدم التجاوزات (overrides) للتبعيات العابرة

تبعياتك المباشرة لها تبعيات خاصة بها. إذا تم اختراق تبعية عابرة، فإن تثبيت تبعيتك المباشرة لا يساعد. استخدم التجاوزات للتحكم في حل التبعيات العابرة:

{
  "overrides": {
    "axios": "1.14.0",
    "plain-crypto-js": "npm:empty-npm-package@1.0.0"
  }
}

بالنسبة لـ Yarn:

{
  "resolutions": {
    "axios": "1.14.0"
  }
}

بالنسبة لـ pnpm:

{
  "pnpm": {
    "overrides": {
      "axios": "1.14.0"
    }
  }
}

المقايضة

التثبيت الدقيق يعني أنك لن تحصل على تحديثات التصحيح التلقائية. ستحتاج إلى تحديث الإصدارات يدويًا، مما يخلق عبئًا إضافيًا للصيانة. المقايضة مقصودة: أنت تختار التحديثات المتحكم بها بدلاً من التحديثات التلقائية. بالنسبة للمشاريع الحساسة أمنيًا، تستحق هذه المقايضة العناء.

الطبقة 4: التحقق من مصدر الحزمة

ماذا يعني المصدر

تربط مصادقة مصدر npm الحزمة المنشورة بشفرة مصدرها وبيئة بنائها باستخدام توقيعات Sigstore المسجلة في سجل شفافية عام. عندما يتم نشر حزمة من خط أنابيب CI/CD مع تمكين المصدر، تتضمن الحزمة دليلاً تشفيرياً على:

كيفية التحقق من المصدر

npm audit signatures

يتحقق هذا من أن الحزم المثبتة لديها شهادات مصدر صالحة. الحزم المنشورة يدويًا من جهاز مطور لن يكون لديها مصدر.

افتقرت إصدارات Axios الخبيثة إلى ربط مصدر OIDC ولم يكن لديها التزامات GitHub مقابلة. لو كانت الفحص التلقائي للمصدر ممارسة قياسية، لكان الهجوم قد رفع الأعلام الحمراء على الفور.

تمكين المصدر لحزمك الخاصة

إذا كنت تنشر حزم npm، فقم بتمكين المصدر في CI/CD الخاص بك:

# مثال GitHub Actions
- uses: actions/setup-node@v4
  with:
    node-version: 20
    registry-url: https://registry.npmjs.org
- run: npm publish --provenance
  env:
    NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

أضف إلى ملف .npmrc الخاص بك:

provenance=true

القيود

المصدر اختياري. معظم حزم npm لا تحتوي عليه بعد. والمصدر يثبت فقط مكان بناء الحزمة. لا يثبت أن الكود المصدري آمن. يمكن لخط أنابيب CI/CD مخترق نشر حزمة ضارة بمصدر صالح.

الطبقة 5: استخدام أدوات التحليل السلوكي

ما وراء فحص الثغرات الأمنية

تتحقق الأدوات التقليدية مثل npm audit وSnyk من قواعد بيانات الثغرات الأمنية المعروفة (CVEs). إنها تكتشف المشكلات المبلغ عنها ولكنها تفوت هجمات "صفر يوم". لم يكن اختراق Axios في أي قاعدة بيانات CVEs عندما تم نشره.

تفحص أدوات التحليل السلوكي ما تفعله الحزم، وليس ما تم الإبلاغ عنه عنها.

Socket.dev

Socket يحلل سلوك الحزمة أثناء التثبيت ووقت التشغيل. يقوم بوضع علامة على:

لقطة شاشة لتقارير Socket.dev توضح سلوك الحزمة

عند الدمج مع GitHub، يعلق Socket على طلبات السحب عندما تُظهر التبعيات الجديدة سلوكيات مشبوهة. كانت تبعية plain-crypto-js لهجوم Axios قد أطلقت تنبيهات Socket متعددة: تعليمات برمجية غامضة، طلبات شبكة أثناء ما بعد التثبيت، وكتابات نظام الملفات خارج دليل الحزمة.

# تثبيت Socket CLI
npm install -g @socketsecurity/cli

# فحص مشروعك
socket scan

Snyk

Snyk يوفر إدارة الثغرات الأمنية مع درجات المخاطر، وبيانات نضج الاستغلال، وإرشادات الإصلاح. إنه أقوى للثغرات الأمنية المعروفة ولكنه أضعف في اكتشاف السلوكيات غير المعروفة (zero-day).

# تثبيت Snyk CLI
npm install -g snyk

# اختبار مشروعك
snyk test
لقطة شاشة لتقارير Snyk

نهج متعدد الطبقات

استخدم كليهما. يلتقط Socket الشذوذات السلوكية التي يفوتها Snyk. يلتقط Snyk الثغرات الأمنية المعروفة بسياق أغنى مما يوفره Socket. أضف npm audit كأساس:

# الأساس
npm audit

# التحليل السلوكي
socket scan

# إدارة الثغرات الأمنية
snyk test

قم بتشغيل الثلاثة جميعًا في CI/CD كبوابات. يجب أن يؤدي أي اكتشاف حرج إلى منع البناء.

الطبقة 6: تقليل سطح التبعية الخاص بك

السؤال الأعمق

كل حزمة في مجلد node_modules الخاص بك هي قرار ثقة. لقد اخترق هجوم Axios حزمة يتم تنزيلها 83 مليون مرة أسبوعيًا. يحتوي مشروع Node.js المتوسط على المئات من التبعيات الانتقالية. كل واحدة منها هي نقطة هجوم محتملة.

الدفاع الأكثر فعالية هو وجود عدد أقل من التبعيات للدفاع عنها.

تدقيق شجرة التبعية الخاصة بك

# عد إجمالي تبعياتك
npm ls --all | wc -l

# تحقق من التكرارات
npm ls --all | sort | uniq -c | sort -rn | head -20

اطرح هذه الأسئلة لكل تبعية:

بدائل أصلية للحزم الشائعة

الحزمة البديل الأصلي متوفر منذ
axios, node-fetch, got fetch (عام) Node.js 18
uuid crypto.randomUUID() Node.js 19
dotenv علامة --env-file Node.js 20.6
chalk util.styleText() Node.js 21.7
glob fs.glob() Node.js 22
path-to-regexp واجهة برمجة تطبيقات نمط URL الأصلية Node.js 23

لاختبار API على وجه التحديد

تعتمد سير عمل اختبار واجهة برمجة التطبيقات (API) عادةً على مكتبات عميل HTTP، ومكتبات التحقق، ومُشغلات الاختبار، والخوادم الوهمية (mock servers). كل تبعية هي سطح هجوم.

شرح بياني يوضح كيف يحل Apidog محل العديد من أدوات اختبار واجهة برمجة التطبيقات.

Apidog يحل محل المكدس بأكمله بمنصة واحدة:

إن نقل سير عمل اختبار واجهة برمجة التطبيقات الخاص بك إلى Apidog يلغي عشرات تبعيات npm من البنية التحتية للاختبار الخاصة بك. عدد أقل من التبعيات يعني قرارات ثقة أقل ونواقل هجوم أقل.

جرب Apidog مجانًا لتوحيد مكدس اختبار واجهة برمجة التطبيقات الخاص بك.

button

الطبقة 7: مراقبة الشبكة ووقت التشغيل

حظر النطاقات السيئة المعروفة

بعد أي هجوم على سلسلة التوريد، قم بحظر البنية التحتية للقيادة والتحكم على مستوى الشبكة:

# أضف إلى /etc/hosts
echo "0.0.0.0 sfrclak.com" | sudo tee -a /etc/hosts

بالنسبة لبيئات CI/CD، قم بتقييد الوصول الصادر للشبكة إلى النطاقات المعروفة بأنها جيدة. معظم عمليات البناء تحتاج فقط إلى الوصول إلى سجل npm ومضيف git الخاص بك وأهداف النشر الخاصة بك. يجب حظر أي شيء آخر بشكل افتراضي.

استخدم StepSecurity Harden-Runner لـ CI/CD

يراقب Harden-Runner من StepSecurity سير عمل GitHub Actions في الوقت الفعلي. لقد اكتشف اتصال Axios dropper بـ C2 في غضون 1.1 ثانية من بدء npm install. توفر الأداة:

# GitHub Actions
- uses: step-security/harden-runner@v2
  with:
    egress-policy: audit  # أو 'block' للوضع الصارم

مراقبة عمليات وقت التشغيل

بالنسبة لأجهزة التطوير، ضع في اعتبارك أدوات الكشف والاستجابة لنقاط النهاية (EDR) التي تضع علامة على العمليات الفرعية المشبوهة التي يولدها Node.js. لقد أطلقت أداة الوصول عن بعد (RAT) الخاصة بـ Axios برامج osascript (macOS) و cscript (Windows) و python3 (Linux) من داخل عملية تثبيت npm. يمكن اكتشاف أنماط العمليات الفرعية هذه.

تكوين .npmrc الموصى به

إليك ملف .npmrc مُحسّن أمنيًا يجمع بين الطبقات المذكورة أعلاه:

# تثبيت الإصدارات الدقيقة
save-exact=true
save-prefix=

# تعطيل سكربتات دورة الحياة
ignore-scripts=true

# تمكين المصدر للنشر
provenance=true

# استخدام السجل الرسمي
registry=https://registry.npmjs.org/

# طلب المصادقة الثنائية للنشر
auth-type=web

# مستوى تدقيق العتبة
audit-level=moderate

قم بتثبيت هذا الملف في مستودعك بحيث يستخدم كل عضو في الفريق نفس إعدادات الأمان.

مثال على مسار أمان CI/CD

إليك سير عمل GitHub Actions الذي يفرض جميع الطبقات السبع:

name: Secure Build
on: [push, pull_request]

jobs:
  security-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: step-security/harden-runner@v2
        with:
          egress-policy: audit

      - uses: actions/setup-node@v4
        with:
          node-version: 22

      # الطبقة 1+2: ملف قفل مجمد، بدون سكربتات
      - run: npm ci --ignore-scripts

      # الطبقة 3: التحقق من عدم وجود إصدارات غير متوقعة
      - run: npm ls --all > deps.txt

      # الطبقة 4: التحقق من المصدر
      - run: npm audit signatures

      # الطبقة 5: التحليل السلوكي
      - run: npx socket scan

      # الطبقة 5: فحص الثغرات الأمنية
      - run: npx snyk test

      # الطبقة 1: التدقيق الأساسي
      - run: npm audit --audit-level=moderate

      # إعادة بناء التبعيات الأصلية المسموح بها فقط
      - run: npm rebuild sharp bcrypt

ماذا سيأتي بعد ذلك لأمان npm

المصدر الإلزامي للحزم الشائعة

تناقش npm فرض مصادقة المصدر للحزم التي تتجاوز عتبة تنزيل معينة. سيمنع هذا النشر اليدوي المستند إلى الرموز المميزة الذي مكّن هجوم Axios.

الموافقة على الإصدار من شخصين

مثل المعاملات المالية التي تتطلب ترخيصًا مزدوجًا، قد تتطلب الحزم ذات التنزيلات العالية موافقة مشرف ثانٍ على الإصدارات. لن يكون حساب واحد مخترق كافيًا.

تحديد نطاق أذونات وقت التشغيل

يقوم Deno بالفعل بتقييد ما يمكن للسكربتات الوصول إليه (الشبكة، نظام الملفات، متغيرات البيئة) ما لم يتم منحها صراحةً. تستكشف Node.js نماذج أذونات مماثلة. عندما يتم شحن هذا، ستحتاج سكربتات ما بعد التثبيت إلى إذن صريح لإجراء طلبات شبكة أو الوصول إلى نظام الملفات.

تقارب مديري الحزم

يمنع نموذج العزل الصارم لـ pnpm (يمكن للحزم الوصول فقط إلى تبعياتها المعلنة) العديد من هجمات الارتباك في التبعية. مع اعتماد npm لصرامة مماثلة، يتقلص سطح الهجوم.

الأسئلة الشائعة

ما هو هجوم سلسلة التوريد في npm؟

يستهدف هجوم سلسلة التوريد في npm سلسلة تبعيات البرامج بدلاً من تطبيقك مباشرةً. يقوم المهاجمون باختراق حسابات مشرفي الحزم، أو حقن تعليمات برمجية ضارة في حزم شائعة، أو نشر حزم "typosquat" بأسماء مشابهة. عندما تقوم بتثبيت أو تحديث التبعيات، يتم تنفيذ التعليمات البرمجية الضارة على جهازك أو في خط أنابيب CI/CD الخاص بك، وسرقة بيانات الاعتماد، أو تثبيت أبواب خلفية، أو تهريب البيانات.

هل npm audit كافٍ للحماية من هجمات سلسلة التوريد؟

لا. يتحقق npm audit من قاعدة بيانات الثغرات الأمنية المعروفة (CVEs). هجمات صفر يوم مثل اختراق Axios لا توجد في أي قاعدة بيانات CVEs عندما تحدث. أنت بحاجة إلى أدوات تحليل سلوكي مثل Socket.dev التي تفحص ما تفعله الحزم، وليس ما تم الإبلاغ عنه عنها. استخدم npm audit كخط أساس، وليس دفاعك الوحيد.

هل يجب أن أتوقف عن استخدام npm بالكامل؟

لا. يظل npm أكبر نظام بيئي للحزم، ومعظم الحزم آمنة. الهدف هو تقليل تعرضك من خلال تثبيت الإصدارات الدقيقة، وفرض ملفات القفل، وحظر السكربتات، وتقليل التبعيات. فكر فيما إذا كانت كل تبعية ضرورية، واستخدم البدائل الأصلية حيثما أمكن.

كيف يساعد Apidog في تقليل مخاطر سلسلة توريد npm؟

يوفر Apidog عميل HTTP مدمج، ومُشغّل اختبار، وخادم وهمي، ومولد توثيق لتطوير واجهة برمجة التطبيقات (API). وهذا يلغي الحاجة إلى حزم npm مثل Axios، node-fetch، Jest، Express (للمحاكاة الوهمية)، وغيرها من تبعيات الاختبار. عدد أقل من تبعيات npm يعني نواقل هجوم أقل في سير عمل تطوير واجهة برمجة التطبيقات الخاص بك.

ما هو مصدر الحزمة (Package provenance) في npm؟

يستخدم مصدر الحزمة Sigstore لربط الحزمة المنشورة تشفيرياً بمستودع مصدرها وبيئة بناء CI/CD. يثبت أين وكيف تم بناء الحزمة. يمكنك التحقق من المصدر باستخدام npm audit signatures. تفتقر الحزم المنشورة يدويًا من أجهزة المطورين إلى المصدر، وهو ما يمثل علامة حمراء للحزم ذات التنزيلات العالية.

كم عدد حزم npm الخبيثة؟

حدد Snyk أكثر من 3000 حزمة npm خبيثة في عام 2024. بحلول الربع الرابع من عام 2025، منعت Sonatype 120,612 هجوم برامج ضارة في ربع واحد عبر npm و PyPI وسجلات أخرى. العدد في تزايد. معظم الحزم الضارة هي حزم "typosquats" ذات تنزيلات منخفضة، لكن الاختراقات عالية المستوى مثل Axios تثبت أن الحزم الشائعة ليست محصنة.

ما هي ثغرة PackageGate الأمنية؟

PackageGate هي مجموعة من ستة ثغرات أمنية من نوع "صفر يوم" تم الكشف عنها في يناير 2026 تؤثر على npm و pnpm و vlt و Bun. وتظهر إحدى النتائج أن التبعيات المستندة إلى Git يمكن أن تحمل ملفات تهيئة تمكن من تنفيذ التعليمات البرمجية حتى عندما تكون سكربتات دورة الحياة معطلة. وهذا يعني أن ignore-scripts وحده لا يكفي إذا كانت تبعياتك تشير إلى مستودعات Git. قم بتثبيت تبعيات Git على تجزئات التزام محددة.

النقاط الرئيسية

كل تبعية هي قرار ثقة. كلما قل عدد تبعياتك، صغر سطح هجومك. كلما زاد عدد طبقات التحقق التي تطبقها، زادت صعوبة تسلل المهاجمين. ابن دفاعاتك بعمق، وليس بمعزل.

button

ممارسة تصميم API في Apidog

اكتشف طريقة أسهل لبناء واستخدام واجهات برمجة التطبيقات

كيفية تأمين تبعيات NPM: دليل شامل لأمن سلسلة التوريد لمطوري API