فایل .env چیست و چرا نباید منتشرش کنیم؟
اگر با پروژههای Node.js، Python یا Laravel کار کرده باشید، حتماً فایلی به نام .env دیدهاید. این فایل ساده، یکی از رایجترین منابع نشت رمز در دنیای واقعی است؛ من هم هنگام بازبینی یکی از پروژههای خودم به آن برخوردم (ماجرا).
.env چیست؟
فایل متنی سادهای است که تنظیمات وابسته به محیط را بهصورت نام=مقدار نگه میدارد:
DATABASE_URL=file:./data.db
JWT_SECRET=a-long-random-string
SMS_API_KEY=your-sms-service-key
برنامه هنگام شروع آن را میخواند و مقدارها را بهعنوان «متغیر محیطی» در اختیار کد میگذارد. با این کار رمزها داخل کد نمیآیند و میشود برای هر محیط (توسعه، تست، تولید) مقدار متفاوتی داد.
چرا نباید منتشرش کنیم؟
چون معمولاً شامل چیزهایی است که هر کس داشته باشد میتواند از آنها سوءاستفاده کند: کلید API، رمز دیتابیس، کلید امضای توکنها. اگر .env داخل یک مخزن عمومی یا بستهی دانلودی بماند، رباتهایی هستند که خودکار دنبال همین فایلها میگردند. حتی روی سرور وب اگر پیکربندی اشتباه باشد، آدرس /.env ممکن است از بیرون قابلدانلود باشد؛ اسکنرهای امنیتی همین را بررسی میکنند (نمونه).
راه درست
.envرا در.gitignoreبگذارید تا هرگز وارد مخزن نشود.- یک
.env.exampleبسازید که فقط نام متغیرها (بدون مقدار واقعی) را دارد. هر کس پروژه را میگیرد میداند چه چیزهایی را باید تنظیم کند. - روی هاست، از پنل متغیرهای محیطی استفاده کنید (مثلاً بخش Environment Variables در Vercel یا Render) و فایل را آپلود نکنید.
- قبل از ساخت هر بستهی دانلودی (zip، installer) بررسی کنید
.envداخلش نیست. - مقدارهای متفاوت برای توسعه و تولید بگذارید.
اگر .env لو رفت چه کنیم؟
حذف فایل از مخزن کافی نیست؛ در تاریخچهی Git میماند و ممکن است قبلاً کپی شده باشد. باید:
- همهی کلیدهای داخل آن را فوراً عوض (rotate) کنید: کلید API، رمز دیتابیس، secret توکن.
- در پنل سرویسها بررسی کنید سوءاستفادهای شده یا نه.
- تاریخچه را در صورت لزوم پاکسازی کنید، ولی کلید قدیمی را معتبر فرض نکنید.
نکتهی برنامهنویسی
برای متغیرهای ضروری، اگر مقدار ست نشده برنامه باید با خطای واضح متوقف شود، نه اینکه با یک رمز پیشفرض ثابت کار کند. رمز پیشفرض قابلحدس یکی از اشتباههای همان بازبینی بود.
سوالات رایج
آیا .env رمزنگاری شده است؟ نه، متن ساده است؛ محافظتش فقط به این است که جایی منتشر نشود و دسترسی فایل محدود باشد.
فرانتاند هم میتواند از .env استفاده کند؟ بعضی ابزارها (مثل Vite) متغیرهای با پیشوند خاص را داخل کد فرانتاند قرار میدهند؛ چیزی که در فرانتاند میرود برای همه قابلمشاهده است، پس هیچ راز واقعی آنجا نگذارید.