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

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

Canonical: https://lagune.ai/ar-AE/docs/hooks/secrets
اللغة: ar-AE
الأصل: https://lagune.ai/docs/hooks/secrets
آخر تحديث: 2026-11-09

ينبّه hook `secrets` إلى **بيانات الاعتماد المضمّنة في الكود المصدري** بدلًا من قراءتها من البيئة. ويعتمد على **المصدر** (قيمة حرفية مقابل قراءة من البيئة)، لا على محتوى القيمة، لذلك لا يحتاج إلى كتالوج شامل لبادئات المزودين ولا ينتج تقريبًا أي إيجابيات كاذبة. وهو المحرك الحتمي خلف [التخصص `secrets`](https://lagune.ai/ar-AE/docs/catalog).

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

## التشغيل

```bash
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` إعدادات خاصة به:

```bash
npx lagune write add --ignore test/fixtures --checker secrets
```

```json
{
  "checkers": {
    "secrets": { "gitignore": false, "ignore": ["test/fixtures"] }
  }
}
```

تشرح صفحة [إعداد hooks](https://lagune.ai/ar-AE/docs/hooks/configure) كل إعداد.

### تغطية اللغات

تقرأ ملاحظة القيمة الافتراضية للبيئة ومؤشر نقطة 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 بتوقيعات اكتشاف (**صيغ** رموز عامة)، ولا يأتي أبدًا بسر حقيقي، وهو يدقّق ويشرح بدلًا من تسريب البيانات.

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

### كيف يتجنب hook secrets الإيجابيات الكاذبة؟

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