Hooks

hook secrets: اكتشف الأسرار المكتوبة مباشرة في الكود

افحص قاعدة الكود بحثًا عن بيانات الاعتماد المكتوبة مباشرة فيه، من سطر الأوامر.

ينبّه hook secrets إلى بيانات الاعتماد المضمّنة في الكود المصدري بدلًا من قراءتها من البيئة. ويعتمد على المصدر (قيمة حرفية مقابل قراءة من البيئة)، لا على محتوى القيمة، لذلك لا يحتاج إلى كتالوج شامل لبادئات المزودين ولا ينتج تقريبًا أي إيجابيات كاذبة. وهو المحرك الحتمي خلف التخصص secrets.

توقيعات صيغ المزودين، وبيانات الاعتماد في سلاسل الاتصال، والقيمة الحرفية المرتبطة بمعرّف يحمل اسم سر، كلها مستقلة عن لغة البرمجة: النص نفسه يُقرأ بالطريقة نفسها في أي ملف. أما القاعدتان التقديريتان اللتان تعتمدان على الصياغة، وهما القراءة من البيئة بقيمة افتراضية مكتوبة في الكود وتدفّق سر إلى نقطة sink للسجلات، فهما مدركتان للغة البرمجة، فلا يُقرأ console.log الخاص بـ JavaScript أبدًا في ملف Rust، ويُكتشف os.getenv("X", "default") الخاص بـ Python وحده.

التشغيل​

npx lagune read secrets # scans the whole project
npx lagune read secrets --dir src # scans a directory
npx lagune read secrets --file config.ts # scans a single file

يطبع الفحص قسمين على الأكثر. Hardcoded secrets found هو مجموعة الملاحظات (قيمة افتراضية مكتوبة في الكود لمتغير بيئة يحمل اسم سر، أو بيانات اعتماد مضمّنة في سلسلة اتصال، أو قيمة تطابق صيغة مزود منتقاة)، لذلك ينتهي hook برمز خروج غير صفري. و Secret handling to review manually مجموعة مؤشرات: قيمة حرفية عادية مرتبطة بمعرّف يحمل اسم سر (مصدرها يمكن الحسم فيه، أما كون القيمة سرًا حقيقيًا فلا)، وقيمة تحمل اسم سر تتدفق إلى نقطة sink للسجلات أو الاستجابات. والتشغيل النظيف يطبع no hardcoded secrets found.

خيارات CLI​

الخيارالقيمةالوصف
--dirدليليحصر الفحص في دليل. يتكرر ويُجمع مع --file.
--fileملفيحصر الفحص في ملف واحد. يتكرر ويُجمع مع --dir.

دون أي خيار، يفحص المشروع كله.

اختر ما يفحصه​

يستثني ما يتجاهله Git. ولاستثناء المزيد، أو لفحص ما يتجاهله Git، امنح secrets إعدادات خاصة به:

npx lagune write add --ignore test/fixtures --checker secrets
{
"checkers": {
"secrets": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

تشرح صفحة إعداد hooks كل إعداد.

تغطية اللغات​

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

الإشارةاللغات
القيمة الافتراضية للبيئةJavaScript/TypeScript, Python, Ruby, PHP, Kotlin, Java, Go (cmp.Or), Rust, C#
نقطة sink للسجلات أو الاستجاباتJavaScript/TypeScript, Python, Ruby, PHP, Java, Kotlin, Go, Rust, C, C++, C#
هل هذه مشكلة تتعلق بالسياسات؟

لا. اكتشاف صيغة السر للتحذير من أنه أُضيف إلى commit أداة دفاعية معتادة، وهي العملية نفسها التي تجريها gitleaks و trufflehog و GitHub push-protection. ويأتي hook بتوقيعات اكتشاف (صيغ رموز عامة)، ولا يأتي أبدًا بسر حقيقي، وهو يدقّق ويشرح بدلًا من تسريب البيانات.

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

يعتمد على المصدر، لا على محتوى القيمة. الصيغ عالية الثقة (رموز المزودين، والقيم الافتراضية للبيئة، وسلاسل الاتصال) ملاحظات تنتهي برمز خروج غير صفري. أما القيمة الحرفية العادية المرتبطة بمعرّف يحمل اسم سر فمؤشر للمراجعة يحتاج إلى تأكيد، والمعرّف نفسه حين يُقرأ من process.env لا يُنبَّه إليه أبدًا.