الأسرار · فصل ٧

Leaked Secrets — مفتاح الـ API في ريبو عام

API keys in git · .env · secret scanning · rotation · NEXT_PUBLIC / VITE_ prefixes
🎯 الهدف: تمنع الأسرار من إنها توصل للـ git أو الـ frontend bundle، ولو وصلت تعرف ليه أول خطوة هي إنك تغيّرها مش تمسحها.

الفكرة في سطر

في bots بتعمل scan للريبوهات العامة على GitHub طول الوقت، وبتدوّر على أشكال المفاتيح المعروفة (AWS و Stripe و OpenAI…). المفتاح اللي يتعمله push بيتلقط في دقايق، مش أيام، وبيتستخدم في mining أو spam على حسابك.

ليه المسح مش كفاية

لو عملت commit فيه secret ومسحته في commit تاني، المفتاح لسه في الـ history. أي حد عمل clone أو fork، أو أي cache، معاه نسخة.

الوقاية

.gitignore
.env.env.*!.env.example*.pem
🔍 Scanning

فعّل secret scanning و push protection في GitHub عشان يرفض الـ push اللي فيه سر. ومحليًا أداة زي gitleaks في pre-commit hook.

🏦 Secret manager

في الـ production، الأسرار تيجي من secret manager أو متغيّرات البيئة بتاعة المنصة (GitHub Actions secrets، AWS Secrets Manager…)، مش من ملف.

الفخ بتاع الـ frontend

أي متغيّر بيدخل في الـ bundle بتاع React عام. أي حد يفتح DevTools يشوفه.

.env
# ✅ عام بطبيعته: عادي يبقى في الـ bundleVITE_API_URL=https://api.example.com# ❌ ده هيتحط في JavaScript اللي بيروح لكل زائرVITE_STRIPE_SECRET_KEY=sk_live_...# ✅ سر: يفضل على السيرفر بس، من غير prefixSTRIPE_SECRET_KEY=sk_live_...

الـ prefix زي VITE_ و NEXT_PUBLIC_ معناه “حط ده في كود المتصفح”. لو الـ frontend محتاج يكلّم خدمة بمفتاح سري، يبقى يكلّم الـ backend بتاعك، والـ backend هو اللي معاه المفتاح.

خلّصت الفصل لما

🧠 اختبر نفسك
١) عملت push لمفتاح ومسحته في commit بعدها بدقيقة. خلاص؟
لأ. المفتاح في الـ history وممكن يكون اتلقط. اعمله rotate فورًا.
٢) حطيت المفتاح في .env في مشروع Vite باسم VITE_SECRET. هو سري؟
لأ. أي حاجة بـ VITE_ بتدخل في الـ bundle.
٣) الريبو private. محتاج scanning؟
أيوه. الريبو ممكن يبقى public بعدين، أو حد عنده access يتسرب منه.