چطور کلیدهای API را در اپ امن نگه داریم
برای امن نگه داشتن کلیدهای API، آنها را بهعنوان راز یا متغیر محیطی روی میزبانتان ذخیره کنید، فقط در کد سمت سرور استفاده کنید و هرگز آنها را در گفتوگو، فایلهای کد، تصویر صفحه یا مخزن Git نچسبانید. به هر کلید کمترین دسترسی لازم را بدهید، سقف هزینه را در ارائهدهنده تنظیم کنید و اگر کلیدی لو رفت، آن را عوض کنید — یک کلید جدید بسازید و قدیمی را حذف کنید — نه اینکه فقط مخفی کنید که کجا ظاهر شده.
کلید API یک رمز عبور برای یک سرویس است. کلید OpenAI شما اجازه میدهد کسی پول شما را برای هوش مصنوعی خرج کند؛ کلید مخفی Stripe اجازه میدهد کسی بازپرداخت صادر کند؛ کلید ارائهدهنده ایمیل اجازه میدهد کسی به اسم شما ایمیل بفرستد. ساختدهندههای اپ با هوش مصنوعی در وصل کردن اینها خوب هستند، اما همیشه مراقب نیستند که کلیدها کجا میروند. پس این راهنما نشان میدهد چطور آنها را امن نگه دارید و چطور بررسی کنید.
کلیدهای عمومی در برابر کلیدهای مخفی
هر کلیدی مخفی نیست. فرق آنها را بدانید تا برای کلید اشتباه نگران نشوید و کلید درست را نادیده نگیرید.
| نوع | نمونهها | آیا میتواند در مرورگر باشد؟ |
|---|---|---|
| کلیدهای قابلانتشار / عمومی | کلید Stripe با پیشوند pk_…، کلید نقشه محدود به دامنه شما، برخی شناسههای آنالیتیکس | بله — برای این طراحی شدهاند |
| کلیدهای مخفی | sk_… در Stripe، کلیدهای OpenAI و Anthropic، کلیدهای ارائهدهنده ایمیل، رمز پایگاه داده | هرگز |
| کلیدهای سرویس/مدیر | کلیدهایی که قوانین دسترسی یک پایگاه داده میزبانیشده را دور میزنند | هرگز — حساسترین نوع |
اگر مطمئن نیستید کدام نوع است، مستندات ارائهدهنده را بررسی کنید. در شک، آن را مخفی فرض کنید.
قدم ۱: کلیدها را بهعنوان راز ذخیره کنید، نه در کد
کلیدها باید در متغیرهای محیطی یا تنظیمات راز میزبانتان باشند. کد شما آنها را در زمان اجرا با نام میخواند (برای مثال process.env.OPENAI_API_KEY)، پس مقدار هرگز در فایلهایتان دیده نمیشود. برای زمینه، متغیرهای محیطی و راز چیست را ببینید.
هر کلید API را از کد بیرون ببر و در متغیرهای محیطی بگذار. فهرست کن هر کلیدی که پیدا کردی در کدام فایل بود و چه نام متغیری استفاده کردی. مقدارها را نشانم نده.
بعد بررسی کن چیزی باقی نمانده:
کل پروژه را جستوجو کن، از جمله فایلهای تنظیمات و هر فایل .env، برای هر چیزی که شبیه کلید API یا رمز عبور است. فایل و شماره خط را گزارش کن، نه مقدار را.
قدم ۲: کلیدهای مخفی را فقط روی سرور استفاده کنید
این مهمترین قانون است. هر چیزی که مرورگر دریافت کند، بازدیدکننده میتواند بخواند — سورس صفحه و فایلهای JavaScript همه در ابزارهای توسعهدهنده دیده میشوند.
پس اگر اپ باید OpenAI را صدا بزند، مرورگر باید سرور شما را صدا بزند و سرور شما با کلید از OpenAI درخواست بگیرد. کلید هرگز سرور را ترک نمیکند.
قابلیت چت مستقیم از مرورگر OpenAI را صدا میزند. آن فراخوانی را به یک مسیر API سمت سرور منتقل کن که OPENAI_API_KEY را از محیط میخواند. مرورگر فقط باید مسیر ما را صدا بزند. این مسیر را فقط برای کاربران واردشده در دسترس قرار بده.
یک تله رایج در فریمورکهای فرانتاند را مراقب باشید: متغیرهایی با پیشوند عمومی — VITE_ در Vite، NEXT_PUBLIC_ در Next.js — عمداً داخل کد مرورگر ساخته میشوند. کلید مخفی با یکی از این پیشوندها لو رفته است، حتی اگر «در یک متغیر محیطی» باشد.
قدم ۳: آزمایش کنید که چیزی لو نمیرود
فقط به اینکه کار کرده اعتماد نکنید — سایت زنده را بررسی کنید:
- اپ منتشرشده را در مرورگر باز کنید.
- ابزارهای توسعهدهنده را باز کنید، بعد تب Sources یا Network.
- در همه فایلها، اولین کاراکترهای هر کلید مخفی را جستوجو کنید (مثلاً
sk_یاsk-). - درخواستهای شبکهای که اپ میفرستد را بررسی کنید. درخواستی که مستقیم از مرورگر به یک ارائهدهنده پولی هوش مصنوعی میرود، هشدار است.
اگر کلید مخفی پیدا کردید، آن را به سرور منتقل کنید (قدم ۲) و عوضش کنید (قدم ۶)، چون از قبل عمومی شده بود.
قدم ۴: محدود کنید هر کلید چه کاری میتواند بکند
بسیاری از ارائهدهندگان اجازه میدهند کلید را محدود کنید:
- کلیدهای محدود (scoped) که فقط کارهایی را انجام دهند که اپ لازم دارد. برای مثال Stripe کلیدهای محدود با دسترسی مشخص دارد.
- محدودیت دامنه یا IP برای کلیدهایی که باید عمومی باشند، مثل کلیدهای نقشه.
- کلیدهای جدا برای هر اپ و هر محیط، تا یک نشت همهچیز را لو ندهد و باطل کردن یکی بقیه را خراب نکند.
- کلیدهای آزمایشی هنگام ساخت، و کلیدهای واقعی فقط در اپ منتشرشده.
قدم ۵: سقف برای آسیب بگذارید
حتی یک کلید خوب محافظتشده ممکن است از طریق خود اپتان سوءاستفاده شود — مثلاً کسی قابلیت هوش مصنوعی شما را هزاران بار با اسکریپت صدا بزند.
- سقف یا هشدار هزینه در هر ارائهدهنده پولی تنظیم کنید.
- برای هر قابلیتی که هزینهاش به ازای هر فراخوانی است، ورود لازم کنید.
- یک محدودیت نرخ برای هر کاربر اضافه کنید. محدودیت نرخ چیست را ببینید.
یک محدودیت ۳۰ درخواست هوش مصنوعی در ساعت برای هر کاربر روی /api/chat اضافه کن. وقتی محدودیت پر شد، پیام واضح برگردان. درخواستهای کاربرانی که وارد نشدهاند را رد کن.
قدم ۶: کلیدهایی که لو رفتهاند را عوض کنید
اگر یک کلید مخفی جایی ظاهر شد که نباید — در پیام گفتوگو، کامیت، تصویر صفحه، تیکت پشتیبانی، کد مرورگر — فرض کنید به خطر افتاده.
- یک کلید جدید در ارائهدهنده بسازید.
- راز را در تنظیمات اپ بهروز کنید.
- دوباره استقرار دهید یا منتشر کنید تا اپ زنده از کلید جدید استفاده کند.
- کلید قدیمی را در ارائهدهنده حذف کنید.
- گزارش مصرف ارائهدهنده را برای فعالیتی که نمیشناسید بررسی کنید.
پاک کردن پیام گفتوگو یا کامیت Git کافی نیست. تاریخچه Git نسخههای قدیمی را نگه میدارد و هر چیزی که عمومی بوده ممکن است از قبل کپی شده باشد.
اشتباههای رایج
- چسباندن کلید در پرامپت. حالا در تاریخچه گفتوگو است. بهجای آن از فرم راز استفاده کنید.
- پیشوند عمومی روی متغیر مخفی.
VITE_OPENAI_API_KEYکلید را برای هر بازدیدکننده میفرستد. - کامیت کردن فایل
.env. قبل از اولین push مطمئن شوید در.gitignoreاست. - یک کلید برای همهجا. کلیدهای جدا برای آزمایشی و واقعی، و برای هر اپ.
- نبود سقف هزینه. کلید لو رفته یا سوءاستفادهشده بدون سقف، ممکن است قبل از متوجه شدنتان صورتحساب بزرگی بسازد.
- مخفی کردن بهجای عوض کردن. وقتی کلیدی لو رفت، فقط یک کلید جدید مشکل را حل میکند.
- کلید در تصویر صفحه. قبل از فرستادن برای کمک، صفحه تنظیمات را برش دهید یا محو کنید.
چکلیست
- هر کلید بهعنوان راز یا متغیر محیطی ذخیره شده، نه در کد.
- هیچ فایل
.envیا کلیدی در Git کامیت نشده. - کلیدهای مخفی فقط در کد سمت سرور استفاده میشوند.
- هیچ متغیر مخفیای پیشوند عمومی مثل
VITE_یاNEXT_PUBLIC_ندارد. - جاوااسکریپت سایت زنده را برای پیشوند هر کلید جستوجو کردهام و چیزی پیدا نشده.
- کلیدها در جایی که ارائهدهنده اجازه میدهد محدود شدهاند.
- کلیدهای آزمایشی و واقعی جدا هستند.
- قابلیتهای پولی ورود لازم دارند و محدودیت برای هر کاربر دارند.
- هر ارائهدهنده پولی سقف یا هشدار هزینه دارد.
- میدانم چطور هر کلید را عوض کنم و هر کلیدی که لو رفته، عوض شده است.
نگه داشتن کلیدها امن در Mythex
Mythex کلیدها را به دو روش از کد و گفتوگو بیرون نگه میدارد:
- کارت درخواست راز. وقتی عامل به یک کلید نیاز دارد، کارتی در گفتوگو نشان میدهد که مقدار را در فیلدهای فرم وارد میکنید، نه در کادر پیام، و بهعنوان راز پروژه ذخیره میشود. راز در گفتوگو را ببینید.
- تنظیمات پروژه ← راز، یا
/secretsدر گفتوگو، برای افزودن یا تغییر کلیدها خودتان. متغیرهای محیطی و راز را ببینید.
بعد از تغییر یک راز برای اپ منتشرشده، دوباره منتشر کنید تا اپ زنده آن را بگیرد. پروژههای خروجیگرفتهشده رازها را شامل نمیشوند، پس هر جا کد را اجرا میکنید دوباره آنها را اضافه کنید. اگر کلیدی هرگز در گفتوگو ظاهر شد، آن را نزد ارائهدهنده عوض کنید.
برای بقیه بررسی امنیتی قبل از لانچ، چکلیست امنیتی برای اپهای ساختهشده با هوش مصنوعی را دنبال کنید. اگر قابلیتهای هوش مصنوعی اضافه میکنید، چطور از API های LLM استفاده کنیم کلیدها و هزینهها را عمیقتر توضیح میدهد.
پرسشها
آیا گذاشتن کلید API در کد فرانتاند امن است؟
فقط اگر ارائهدهنده آن کلید را عمومی طراحی کرده باشد، مثل کلید قابلانتشار Stripe یا کلید نقشهای که به دامنه شما محدود شده. هر کلیدی که میتواند هزینه بسازد یا داده خصوصی بخواند باید روی سرور بماند، چون هر چیزی که به مرورگر برسد را هر کسی میتواند بخواند.
اگر کلید API را در یک گفتوگو یا مخزن عمومی گذاشتم چه کنم؟
عوضش کنید: یک کلید جدید در ارائهدهنده بسازید، راز اپ را بهروز کنید، دوباره منتشر کنید و بعد کلید قدیمی را حذف کنید. پاک کردن پیام یا کامیت کافی نیست، چون ممکن است نسخههایی از آن از قبل وجود داشته باشد.
کلیدهای API را کجا باید ذخیره کنم؟
در متغیرهای محیطی یا تنظیمات راز میزبانتان، که کد سمت سرور در زمان اجرا میخواند. نباید در فایلهای سورس نوشته شوند، در Git کامیت شوند یا در تصویر صفحهها بیایند.
چطور بفهمم کلید API من در وبسایتم لو رفته؟
سایت زندهتان را باز کنید، سورس صفحه و فایلهای JavaScript را در ابزارهای توسعهدهنده مرورگر ببینید و اول کلید را جستوجو کنید. اگر پیدا شد، لو رفته و باید به سرور منتقل و عوض شود.