惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

TaoSecurity Blog
TaoSecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Secure Thoughts
美团技术团队
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
月光博客
月光博客
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recorded Future
Recorded Future
I
Intezer
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
罗磊的独立博客
V
V2EX
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
A
About on SuperTechFans
Scott Helme
Scott Helme
Vercel News
Vercel News
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
C
CERT Recently Published Vulnerability Notes
G
Google Developers Blog
B
Blog
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Jina AI
Jina AI
IT之家
IT之家
C
Cybersecurity and Infrastructure Security Agency CISA
P
Palo Alto Networks Blog
小众软件
小众软件
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
AWS News Blog
AWS News Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
حماية مفاتيح API من إضافة VS Code ضارة
Yusuf Khalid · 2026-05-21 · via DEV Community

في 20 مايو 2026، أكدت GitHub أن مهاجمين سرقوا بيانات من حوالي 3800 مستودع شيفرة داخلي. لم تكن نقطة الدخول ثغرة يوم-صفر في خوادم GitHub، بل إضافة VS Code مخترقة مثبتة على حاسوب محمول لموظف واحد. عندما تعمل الإضافة بصلاحيات المطور نفسها، يمكنها قراءة الشيفرة، ملفات التهيئة، وبيانات الاعتماد الموجودة في مساحة العمل. الدرس العملي: لا تفترض أن السحابة هي نقطة الضعف دائمًا؛ جهاز المطور والأدوات التي تعمل عليه غالبًا هي السطح الأخطر.

جرّب Apidog اليوم

TL;DR

لحماية مفاتيح API من إضافات IDE المخترقة أو المستودعات المسربة:

  • لا تضع مفاتيح حية داخل الشيفرة.
  • لا تلتزم بملفات .env.
  • لا تعتبر .gitignore تحكمًا أمنيًا.
  • افصل مفاتيح التطوير، الاختبار، والإنتاج.
  • استخدم أقل الامتيازات وأقصر مدة صلاحية ممكنة.
  • دوّر المفاتيح وفق جدول ثابت.
  • خزّن بيانات اعتماد API في متغيرات بيئة أو مدير أسرار بدل ملفات نصية داخل مساحة العمل.

تساعد أدوات مثل Apidog في تقليل التعرض عبر تخزين بيانات اعتماد API كمتغيرات بيئة بقيم محلية فقط، بدل نشرها كنص عادي في المستودع أو ملفات المشروع.

لماذا يُعد اختراق GitHub جرس إنذار لكل مطور

تبدو حادثة GitHub كهجوم سلسلة توريد عملي. المجموعة المهددة، المعروفة باسم TeamPCP، لها تاريخ في إدخال أحصنة طروادة في حزم عبر npm وPyPI وPHP. هذه المرة جاءت الحمولة الخبيثة عبر إضافة VS Code.

وفقًا لتقرير TechCrunch، سرّب المهاجمون بيانات من حوالي 3800 مستودع داخلي، ويبيعون مجموعة البيانات بأكثر من 50,000 دولار في المنتديات السرية. تقول GitHub إنه لا يوجد دليل على تأثر بيانات العملاء المخزنة خارج تلك المستودعات الداخلية، والتحقيق مستمر.

النقطة العملية للمطورين: إضافة VS Code هي كود يعمل داخل المحرر بصلاحيات المستخدم. يمكنها عادةً:

  • سرد الملفات داخل مساحة العمل.
  • فتح الملفات وقراءة محتواها.
  • مراقبة تغييرات الملفات.
  • إرسال طلبات شبكة خارجية.

هذا ليس بالضرورة خللًا في VS Code؛ إنه جزء من نموذج الإضافات. كثير من الإضافات تحتاج الوصول إلى الملفات كي تعمل. المشكلة أن إضافة خبيثة أو مخترقة تستخدم الوصول نفسه لجمع الأسرار.

في مشروع عادي، قد تجد الإضافة:

  • ملف .env في جذر المشروع.
  • ملفات مثل config/secrets.yml.
  • توكن مؤقت داخل سكريبت اختبار.
  • بيانات AWS في ~/.aws/credentials.
  • ملف .npmrc يحتوي رمز مصادقة.
  • مفاتيح SSH.
  • رموز CI/CD أو أدوات ذكاء اصطناعي.

هذا النمط مشابه لما ناقشناه في دروس أمان API من اختراق Vercel، ويتقاطع مع آليات سلسلة التوريد التي غطيناها في دليل أمان سلسلة توريد npm.

السؤال العملي الذي يجب أن تطرحه الآن:

إذا عملت إضافة خبيثة داخل محررك اليوم، ما الأسرار التي ستجدها؟

المفاتيح المبرمجة ثابتًا وملفات .env الملتزم بها مشكلة دائمة

معظم تسريبات بيانات الاعتماد لا تحتاج هجومًا معقدًا. غالبًا تبدأ بأحد هذين الخطأين:

  1. مطور يلصق مفتاحًا داخل الشيفرة "مؤقتًا".
  2. ملف .env يدخل في commit بالخطأ.

مثال واضح على الخطأ الأول:

import requests

# Quick test of the payments endpoint
STRIPE_KEY = "sk_live_51Qk2mNExampleKeyDoNotShipThis"

response = requests.post(
    "https://api.stripe.com/v1/charges",
    auth=(STRIPE_KEY, ""),
    data={"amount": 2000, "currency": "usd", "source": "tok_visa"},
)

print(response.json())

Enter fullscreen mode Exit fullscreen mode

هذا المفتاح أصبح الآن:

  • موجودًا كنص عادي داخل الملف.
  • قابلًا للقراءة من أي إضافة أو أداة محلية.
  • جزءًا من سجل Git إذا تم الالتزام بالملف.
  • قابلًا للاسترجاع حتى لو حذفت السطر في commit لاحق.

هل يحل .env المشكلة؟

ملف .env أفضل من hardcoding، لكنه ليس حلًا كاملًا. مثال:

# .env  (loaded at runtime, never meant to ship)
DATABASE_URL=postgres://app_user:Zk7%2BqN9wLx@db.internal:5432/payments
STRIPE_SECRET_KEY=sk_live_51Qk2mNExampleKeyDoNotShipThis
OPENAI_API_KEY=sk-proj-aB3dEf9hKlMnOpQrStUvWxYz1234567890
AWS_ACCESS_KEY_ID=AKIA4EXAMPLE7QRSTUVW
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
JWT_SIGNING_SECRET=8f2a91c4e7b6d3508f2a91c4e7b6d350

Enter fullscreen mode Exit fullscreen mode

هذا النمط يحل مشكلة واحدة فقط: إبقاء الأسرار خارج الشيفرة إذا لم يتم الالتزام بالملف أبدًا.

لكنه لا يحل مشكلة الأداة المحلية المخترقة. بالنسبة لإضافة خبيثة، لا يوجد فرق كبير بين:

  • app.py
  • .env
  • config/secrets.yml

كلها ملفات نصية يمكن قراءتها من نظام الملفات.

إذا تم الالتزام بملف .env مرة واحدة، فالمفتاح أصبح في سجل Git. حتى بعد حذفه لاحقًا، تبقى القيمة في التاريخ. ناقشنا زاوية تسرب المستودعات بتفصيل أكبر في مقال توثيق API وأمان مستودع Git.

.gitignore ليس تحكمًا أمنيًا

إضافة .env إلى .gitignore خطوة جيدة، لكنها ليست دفاعًا أمنيًا. هي فقط تعليمات لـ Git كي يتجاهل ملفات غير متعقبة عند git add.

لها ثلاث نقاط فشل مهمة.

1. لا تؤثر على الملفات المتعقبة مسبقًا

إذا تم الالتزام بـ .env قبل إضافته إلى .gitignore، سيستمر Git في تتبعه.

تحتاج إلى:

git rm --cached .env
git commit -m "Stop tracking .env"

Enter fullscreen mode Exit fullscreen mode

لكن هذا لا يزيل السر من التاريخ السابق.

2. لا تحمي الملف الموجود على القرص

حتى لو تجاهله Git، يبقى .env في مساحة العمل كنص عادي. إضافة VS Code خبيثة لا تحتاج فهرس Git؛ يمكنها قراءة الملف مباشرة.

3. يمكن تجاوزها بسهولة

يمكن تجاوز القاعدة عبر:

git add -f .env

Enter fullscreen mode Exit fullscreen mode

أو عبر واجهة تحكم مصدر داخل محرر، أو عبر قواعد .gitignore غير متسقة في مجلدات فرعية.

كيف تفحص سجل Git بحثًا عن .env

ابدأ بهذه الأوامر:

# اعرض كل commit لمس ملف .env
git log --all --full-history --oneline -- .env

# ابحث عن قيم حساسة داخل التاريخ
git log -p --all -- .env | grep -iE "key|secret|token|password"

Enter fullscreen mode Exit fullscreen mode

إذا ظهر أي شيء، تعامل مع السر على أنه مكشوف.

الإجراء الصحيح:

  1. دوّر المفتاح فورًا.
  2. أوقف القيمة القديمة.
  3. نظّف السجل باستخدام أداة مثل git filter-repo.
  4. ادفع التاريخ النظيف بعد التنسيق مع الفريق.
  5. انقل الأسرار إلى مكان لا يكون ملفًا نصيًا داخل مساحة العمل.

أربع عادات تقلل أثر التسريب

لا يمكنك ضمان عدم تسرب أي مفتاح أبدًا. لكن يمكنك جعل المفتاح المسرب قليل القيمة.

1. حدّد نطاق كل سر حسب البيئة

لا تستخدم المفتاح نفسه في:

  • التطوير
  • الاختبار
  • الإنتاج

بدلًا من ذلك:

البيئة نوع المفتاح البيانات
Development مفتاح تطوير بيانات اختبار
Staging مفتاح اختبار بيانات شبه حقيقية أو معزولة
Production مفتاح إنتاج بيانات حية

إذا تسرب مفتاح التطوير، يجب أن يصل المهاجم إلى بيئة تجريبية فقط، لا إلى بيانات العملاء.

2. افصل البيئات فعليًا

الفصل لا يعني فقط أسماء مفاتيح مختلفة. يجب أن تكون الموارد نفسها منفصلة:

  • قاعدة بيانات التطوير ليست نسخة إنتاج حية.
  • مزود الدفع في الاختبار يستخدم sandbox.
  • إعدادات التطوير لا يمكنها الوصول إلى بيانات الإنتاج بتغيير متغير واحد.
  • مفاتيح الإنتاج لا تُنسخ إلى أجهزة المطورين.

هدفك أن يكون سؤال "من أي بيئة جاء هذا المفتاح؟" قابلًا للإجابة فورًا.

3. استخدم أقل الامتيازات وأقصر مدة صلاحية

كل مفتاح يجب أن يمتلك أقل صلاحيات ممكنة.

مثال:

  • واجهة أمامية تقرأ كتالوج منتجات عام: مفتاح قراءة فقط.
  • سكريبت CI ينشر توثيقًا: صلاحية النشر المطلوبة فقط.
  • خدمة دفع: صلاحيات محددة لنطاق الدفع، لا صلاحيات إدارية عامة.

إذا كان مزود API يدعم رموزًا قصيرة الأجل أو OAuth، ففضّلها على المفاتيح الثابتة. راجع مقارنة مفاتيح API مقابل OAuth لمعرفة متى تكون الرموز قصيرة الأجل أفضل.

قاعدة عملية:

  • مفتاح ينتهي خلال ساعة: ضرره محدود.
  • مفتاح يعيش إلى الأبد: يظل صالحًا حتى يلاحظه أحد، وقد يستغرق ذلك شهورًا.

4. دوّر المفاتيح وفق جدول ثابت

لا تنتظر حادثًا كي تتعلم تدوير المفاتيح.

ضع جدولًا واضحًا:

  • مفاتيح إنتاج عالية الامتيازات: شهريًا.
  • مفاتيح أقل خطورة: ربع سنويًا.
  • مفاتيح مؤقتة أو تجريبية: أقصر ما يمكن.

التدوير المنتظم يحقق فائدتين:

  1. يقلل عمر أي تسريب غير مكتشف.
  2. يجعل عملية التدوير إجراءً معتادًا لا حالة طوارئ.

لإدارة أوسع، راجع أدوات إدارة مفاتيح API.

احتفظ ببيانات الاعتماد في متغيرات بيئة Apidog بدل نشرها في مساحة العمل

تقدم Apidog إضافة VS Code وخادم MCP. الهدف هنا ليس الادعاء بأن أي أداة عميل محصنة ضد هجمات سلسلة التوريد. لا توجد أداة من جانب العميل محصنة بالكامل.

النقطة العملية هي: أين تعيش أسرارك؟

عند بناء واختبار API، تحتاج غالبًا إلى:

  • bearer token
  • API key
  • base URL
  • database connection string
  • credentials للاختبار

الحل السريع المعتاد هو وضعها في .env أو سكريبت محلي. هذا يضع الأسرار الحية في ملفات نصية داخل مساحة العمل، وهي بالضبط الملفات التي تستهدفها الإضافات الخبيثة.

استخدم متغيرات البيئة بدل النصوص الصريحة

في Apidog، يمكنك تخزين بيانات الاعتماد كـ متغيرات بيئة.

بدل كتابة التوكن مباشرة:

Authorization: Bearer sk-proj-aB3dEf9hKlMnOpQrStUvWxYz

Enter fullscreen mode Exit fullscreen mode

اكتب:

Authorization: Bearer {{access_token}}

Enter fullscreen mode Exit fullscreen mode

ويقوم Apidog بحل القيمة وقت الإرسال.

الميزة العملية: تعريف الطلب لا يحتوي السر الحرفي. السر لا يجلس داخل .env في جذر المشروع ولا داخل ملف قابل للالتزام.

استخدم القيم المحلية للأسرار

يميز Apidog بين نوعين من القيم لكل متغير:

  • قيمة مشتركة أو أولية: يمكن أن تتزامن وتكون مرئية للفريق.
  • قيمة محلية أو حالية: تبقى على جهازك ولا يتم تحميلها.

للأسرار مثل التوكنات وكلمات المرور، استخدم القيمة المحلية فقط.

النتيجة:

  • يرى الفريق اسم المتغير مثل access_token.
  • لا يرى الفريق القيمة السرية الخاصة بك.
  • كل مطور يملأ قيمته المحلية.
  • لا تنتقل مفاتيح الإنتاج عبر بيانات المشروع المتزامنة.

افصل البيئات داخل Apidog

تستند إدارة بيئة Apidog إلى فكرة العزل.

يمكنك تعريف بيئات مثل:

  • Development
  • Staging
  • Production

كل بيئة تحتوي:

  • base_url
  • access_token
  • payment_api_key
  • أي متغيرات أخرى خاصة بها

مثال عملي:

Development:
  base_url = https://dev.example.com
  payment_api_key = sandbox_key

Production:
  base_url = https://api.example.com
  payment_api_key = production_key

Enter fullscreen mode Exit fullscreen mode

عند التبديل بين البيئات، تتبدل مجموعة القيم بالكامل. لا تحتاج إلى تعديل الطلب نفسه.

هذا يقلل أخطاء مثل:

  • استخدام مفتاح إنتاج في طلب تطوير.
  • إرسال طلب اختباري إلى API إنتاجي.
  • تخزين سر إنتاجي داخل مساحة عمل تطوير محلية.

للفرق التي تحتاج حدودًا أقوى: Vault Secret

إذا كان فريقك لا يريد أن تلمس أسرار الإنتاج عميل API أصلًا، تضيف خطة Apidog Enterprise ميزة Vault Secret.

تسمح هذه الميزة بجلب الأسرار من:

  • HashiCorp Vault
  • Azure Key Vault
  • AWS Secrets Manager

في هذا النمط، يخزن Apidog مسار السر والبيانات الوصفية فقط. يتم جلب القيم عند الطلب، وتبقى إدارة السر في مدير الأسرار المخصص.

لتجربة سير العمل الأساسي، قم بتنزيل Apidog، أنشئ مشروعًا، افتح إدارة البيئة، وأضف بيانات اعتمادك كمتغيرات بيئة بقيم محلية فقط.

تحذير مهم: نقل الأسرار إلى Apidog يقلل عدد الأسرار النصية داخل المستودع ومساحة العمل، لكنه لا يجعل جهازك محصنًا. لا يزال عليك تدقيق الإضافات، تقليل صلاحيات المفاتيح، وتدويرها بانتظام.

قائمة تنفيذ سريعة

استخدم هذه القائمة على مستودعك الحالي.

1. ابحث عن أسرار داخل الملفات

grep -RniE "api[_-]?key|secret|token|password|authorization|bearer" .

Enter fullscreen mode Exit fullscreen mode

استثنِ مجلدات مثل node_modules عند الحاجة:

grep -RniE "api[_-]?key|secret|token|password|authorization|bearer" . \
  --exclude-dir=node_modules \
  --exclude-dir=.git

Enter fullscreen mode Exit fullscreen mode

2. افحص سجل Git

git log -p --all | grep -iE "api[_-]?key|secret|token|password|authorization|bearer"

Enter fullscreen mode Exit fullscreen mode

3. تحقق من الملفات الحساسة المتعقبة

git ls-files | grep -E "\.env|secrets|credentials|\.npmrc|\.pypirc"

Enter fullscreen mode Exit fullscreen mode

4. أضف قواعد تجاهل مناسبة

.env
.env.*
!.env.example

*.pem
*.key
*.p12

.aws/
.npmrc
.pypirc

Enter fullscreen mode Exit fullscreen mode

تذكر: هذا يمنع أخطاء مستقبلية، لكنه لا يحمي ملفًا موجودًا على القرص ولا ينظف التاريخ.

5. أنشئ ملف مثال آمن

بدل مشاركة .env حقيقي، شارك .env.example بلا أسرار:

DATABASE_URL=
STRIPE_SECRET_KEY=
OPENAI_API_KEY=
JWT_SIGNING_SECRET=

Enter fullscreen mode Exit fullscreen mode

6. دوّر أي مفتاح ظهر في الشيفرة أو التاريخ

لا تكتفِ بحذف السطر. إذا ظهر المفتاح في Git، اعتبره مكشوفًا.

الخلاصة

اختراق GitHub يوضح اتجاهًا واضحًا: جهاز المطور هدف جذاب لأنه يحتوي أدوات موثوقة وملفات تهيئة وأسرارًا بنص عادي.

ابدأ بخطوات عملية:

  1. ابحث عن key وsecret وtoken وpassword في مستودعاتك.
  2. افحص سجل Git لملفات .env والأسرار القديمة.
  3. دوّر أي قيمة ظهرت في الشيفرة أو التاريخ.
  4. افصل مفاتيح التطوير والاختبار والإنتاج.
  5. استخدم أقل الامتيازات وأقصر مدة صلاحية.
  6. انقل بيانات اعتماد API إلى متغيرات بيئة أو مدير أسرار.

يمكنك تنزيل Apidog واستخدام متغيرات البيئة بقيم محلية بدل تخزين بيانات الاعتماد في ملف نصي داخل المشروع.

للمتابعة، اقرأ أيضًا أدوات API المستضافة ذاتيًا بعد اختراق GitHub وأدوات إدارة مفاتيح API.

الأسئلة الشائعة

هل يمكن لإضافة VS Code قراءة ملف .env ومفاتيح API؟

نعم. تعمل إضافة VS Code بصلاحيات المستخدم داخل المحرر. يمكنها قراءة الملفات في مساحة العمل، بما في ذلك .env وملفات التهيئة وملفات بيانات الاعتماد مثل ~/.aws/credentials. هذا جزء طبيعي من نموذج الإضافات، لكنه يصبح خطرًا عندما تكون الإضافة خبيثة أو مخترقة.

هل يكفي إضافة .env إلى .gitignore؟

لا. .gitignore يمنع Git من إضافة الملفات غير المتعقبة تلقائيًا، لكنه لا:

  • يحذف أسرارًا موجودة في سجل Git.
  • يحمي الملف الموجود على القرص.
  • يمنع أداة محلية من قراءة الملف.
  • يمنع استخدام git add -f.

استخدمه كوسيلة نظافة، لا كحد أمني.

ماذا أفعل إذا وجدت مفتاح API في سجل Git؟

تعامل معه كمفتاح مكشوف:

  1. دوّر المفتاح فورًا.
  2. عطّل القيمة القديمة.
  3. نظّف سجل Git باستخدام أداة مثل git filter-repo.
  4. نسّق مع الفريق قبل force-push.
  5. انقل السر إلى مدير أسرار أو متغيرات بيئة لا تُلتزم بالمستودع.

كيف يقلل Apidog تعرض مفاتيح API للخطر؟

يسمح Apidog بتخزين بيانات الاعتماد كمتغيرات بيئة والإشارة إليها بالاسم داخل الطلبات، مثل {{access_token}}. كما يدعم القيم المحلية التي تبقى على جهازك ولا تتزامن مع الفريق. هذا يقلل وجود الأسرار كنص عادي داخل ملفات المشروع، لكنه لا يلغي الحاجة إلى أقل الامتيازات، التدوير، وتدقيق الأدوات المحلية.

هل وجود إضافة Apidog لـ VS Code يمثل خطرًا؟

أي إضافة عميل يمكن أن تكون جزءًا من سطح الهجوم إذا اختُرقت. الهدف ليس افتراض أن أداة معينة محصنة، بل تقليل عدد الأسرار النصية الموجودة في مساحة العمل. احتفظ بالأسرار في متغيرات محلية أو مدير أسرار، وراجع الإضافات التي تثبتها، ودوّر المفاتيح بانتظام.

ما الفرق بين تحديد النطاق والتدوير؟

تحديد النطاق يحدد ما يمكن للمفتاح فعله وأين يعمل. مثال: مفتاح تطوير لا يصل إلى الإنتاج، ومفتاح قراءة فقط لا يستطيع الكتابة.

التدوير يغير قيمة المفتاح بحيث تتوقف القيمة القديمة عن العمل.

تحتاج الاثنين معًا: النطاق يقلل الضرر، والتدوير يقلل مدة صلاحية المفتاح المسرب.

كم مرة يجب تدوير مفاتيح API؟

ابدأ بقاعدة عملية:

  • مفاتيح الإنتاج عالية الامتيازات: شهريًا.
  • المفاتيح الأقل خطورة: ربع سنويًا.
  • الرموز المؤقتة: أقصر مدة ممكنة.

عدّل الجدول حسب مستوى المخاطر ومتطلبات الامتثال.

هل يجب أن تكون مفاتيح الإنتاج على جهاز المطور؟

يفضل ألا تكون كذلك. يجب أن تبقى بيانات اعتماد الإنتاج في مدير أسرار وبيئات التشغيل الإنتاجية فقط. يجب أن يعمل المطورون بمفاتيح تطوير أو اختبار محددة النطاق. إذا اختُرق جهاز مطور، يجب أن يصل المهاجم إلى sandbox فقط، لا إلى أنظمة العملاء الحية.