حماية رموزك ومفاتيح API وأسرارك
عام؟ خاص؟ إيه؟
متى يجب حماية رموزك؟
تأمين مفاتيح API والرموز أمر بالغ الأهمية!
خطأ واحد قد يؤدي إلى فقدان السيطرة على خادمك وبياناتك لصالح المخترقين!
لا ينبغي أن يكون من الصعب تحديد ما إذا كان يجب إخفاء رمز معين - حتى بناءً على الوثائق الرسمية!
غالبًا ما يزداد الأمر سوءًا بسبب خليط المصطلحات ذات الصلة التي ستواجهها: الرموز، المفاتيح، بيانات الاعتماد، الأسرار، الخاصة، و_العامة_.
دعنا نعيد صياغة هذا على أنه بين سري وغير سري.
- 🔒
المفاتيح السريةيجب أن تبقى مخفية. بشكل عام، لا ينبغي أبدًا أن تغادر خادمك الخاص (أو الخدمة - مثل heroku أو netlify أو travis-ci). - 🌍
المفاتيح غير السريةتصف سلاسل يمكن مشاركتها بحرية وتضمينها في طلبات المتصفح.
🔒 المفاتيح السرية
** ‼️ مهم:** المفاتيح السرية يجب أن يتجاهلها Git و تُحذف من جميع أكواد المتصفح. كيفية استخدام dotenv
كيف تعرف أنك تتعامل مع مفتاح سري؟
👍 قاعدة عامة: الخوادم التي تُرجع أخطاء CORS تفتقر إلى دعم المتصفح. هذا يشير بقوة إلى أنك يجب أن تُمرر الخدمة عبر وسيط (proxy)، وتتعامل معها كما لو كانت سرية.
👍 قاعدة عامة: الخدمات المكلفة يجب (دائمًا تقريبًا) أن تُمرر عبر وسيط أو تُخفى.
👍 قاعدة عامة: إذا كنت تُجري عملية كتابة (رفع ملف، إدراج صف في قاعدة بيانات)، فقد تتعامل مع مفاتيح سرية.
حالات الاستخدام والميزات: المفاتيح السرية
- تفويض طويل الأمد (بيانات الاعتماد، رموز الوصول، رموز JSON Web Tokens)
- تفويض قصير الأمد (رموز OAuth، مخزن الجلسات)
- الوصول إلى الخدمات المدفوعة/الباهظة (للمصادقة، الترميز الجغرافي، تخزين الملفات، إلخ)
- الجزء الخاص من الزوج العام/الخاص (RECAPTCHA، Stripe، Auth0)
- بيانات اعتماد الخدمة (البريد الإلكتروني/SMTP، LDAP/خدمات الدليل)
- تشفير البيانات والتحقق من التكامل
قائمة التحقق: التعامل الآمن مع المفاتيح السرية
نظرة عامة سريعة
أكمل الخطوات التالية لإزالة المفاتيح السرية من الكود الخاص بك:
- استبدل المفاتيح المكتوبة بشكل ثابت بمتغيرات البيئة. مثال:
process.env.API_SECRET - استخدم مكتبة مثل
dotenvمع ملف.env. أضف مفاتيحك السرية التي كانت مكتوبة بشكل ثابت سابقًا إلى ملف.env. - أضف سطرًا
.envفي ملف.gitignoreالخاص بك!
لا تقم بإنشاء ملف
.envعلى الخوادم المنشورة. استخدم أداة إدارة متغيرات البيئة التي توفرها خدمة الاستضافة الخاصة بك (مثل Heroku، Netlify، AWS EC2): مثل لوحة التحكم أو سطر الأوامر.
مقال ذو صلة: استخدام dotenv بأمان في NodeJS
🌍 المفاتيح غير السرية
👍 قاعدة عامة: عندما يجب إرسال مفتاح إلى المتصفح في الكود أو بشكل مضمّن (مثلًا عبر وسم <script src="https://my-api/?apiKey=123-abc-456">)، فهو بالتأكيد غير سري. مثال شائع هو خرائط Google.
حالات الاستخدام والميزات: المفاتيح غير السرية
- وصول قصير المدى (معرفات جلسة المستخدم، رموز JSON Web Tokens)
- تقييد الوصول إلى API حسب التطبيق/المطور (للمصادقة، الترميز الجغرافي، إلخ)
- الجزء العام من زوج عام/خاص (RECAPTCHA، Stripe، Auth0)
- معرفات التحليلات
✅ التعامل مع المفاتيح غير السرية:
من الآمن ترميز المفاتيح غير السرية (العامة) بشكل ثابت في الكود!
اجعل هذا أسهل في الإدارة على المدى الطويل باستخدام ملف config.js مشترك لتطبيقك.
مثال:
module.exports = { googleMapsKey: '123-abc'};const config = require('./config.js');const key = config.googleMapsKey;const src = `//maps.googleapis.com/maps/api/js?key=${key}`;// ...ملاحظة: هناك حالات استخدام أخرى لمتغيرات البيئة. بعضها لم أتطرق إليه: CI/CD والاختبار، أعلام الميزات، وإعدادات وقت التشغيل للبيئات الخاصة!