الفكرة في سطر
في bots بتعمل scan للريبوهات العامة على GitHub طول الوقت، وبتدوّر على أشكال المفاتيح المعروفة (AWS و Stripe و OpenAI…). المفتاح اللي يتعمله push بيتلقط في دقايق، مش أيام، وبيتستخدم في mining أو spam على حسابك.
ليه المسح مش كفاية
لو عملت commit فيه secret ومسحته في commit تاني، المفتاح لسه في الـ history. أي حد عمل clone أو fork، أو أي cache، معاه نسخة.
الوقاية
.env.env.*!.env.example*.pemفعّل secret scanning و push protection في GitHub عشان يرفض الـ push اللي فيه سر. ومحليًا أداة زي gitleaks في pre-commit hook.
في الـ production، الأسرار تيجي من secret manager أو متغيّرات البيئة بتاعة المنصة (GitHub Actions secrets، AWS Secrets Manager…)، مش من ملف.
الفخ بتاع الـ frontend
أي متغيّر بيدخل في الـ bundle بتاع React عام. أي حد يفتح DevTools يشوفه.
# ✅ عام بطبيعته: عادي يبقى في الـ 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 بعدها بدقيقة. خلاص؟
٢) حطيت المفتاح في .env في مشروع Vite باسم VITE_SECRET. هو سري؟
VITE_ بتدخل في الـ bundle.