
خطاف أمان قبل الكتابة مستقل عن المضيف لعامل الترميز: يكتشف أنماط إدخال المستخدم عبر Semgrep ويصدر إرشادات أمان حتمية بدون LLM.
نقطة تفتيش أمنية لأدوات البرمجة بالذكاء الاصطناعي. تفحص كل ملف يكتبه مساعد الذكاء الاصطناعي، وتوقف الملفات الخطيرة قبل وصولها إلى القرص.
مساعدات البرمجة بالذكاء الاصطناعي (Claude Code, Codex, …) تكتب الأكواد بسرعة — بما في ذلك أكواد تتعامل مع أشياء مثل كلمات المرور، عناوين البريد الإلكتروني، مفاتيح الAPI، أو مدخلات المستخدم الخام. من السهل على المساعد أن يغذي تلك البيانات مباشرةً في استعلام قاعدة بيانات، أمر شل، أو استجابة HTTP دون التفكير في الأمان.
VibeGate يجلس بين المساعد ونظام الملفات الخاص بك. في كل مرة يحاول المساعد كتابة أو تعديل ملف، يقوم VibeGate بفحص الكود الجديد أولاً:
لا يوجد أي LLM مشارك في التحليل نفسه — إنه تحليل ثابت سريع وحتمي، لذلك لا يختلق أبدًا ولا يكلفك رموزًا (tokens).
فيما يلي كل ما يتحقق منه VibeGate حاليًا:
| الفحص | ما يكتشفه | النتيجة |
|---|---|---|
| حقن الأوامر | مدخلات غير منقاة تصل إلى أمر شل | يمنع |
| حقن SQL | مدخلات غير منقاة تصل إلى استعلام قاعدة بيانات | يمنع |
| حقن NoSQL | يُستخدم نص الطلب مباشرةً كعامل تصفية لقاعدة البيانات | يمنع |
| حقن القوالب (SSTI) | مصدر القالب نفسه، وليس بياناته فقط، يأتي من إدخال المستخدم | يمنع |
| إلغاء التسلسل غير الآمن | بيانات غير موثوقة تصل إلى أداة إلغاء تسلسل غير آمنة (pickle, YAML غير آمن، ...) | يمنع |
| اجتياز المسار | مدخلات غير منقاة تصل إلى قراءة/كتابة/حذف ملف | يمنع |
| XXE | يتم تحليل XML غير موثوق به مع تمكين الكيانات الخارجية | يمنع |
| XSS | يتم عرض مدخلات غير منقاة كـ HTML خام | يمنع |
| رفع ملف غير مقيد | يُستخدم اسم الملف المرفوع نفسه لبناء مسار الحفظ | يمنع |
| SSRF | يقوم الخادم بجلب رابط غير مُثبت في الكود الثابت | يحذر |
| إعادة توجيه مفتوحة | هدف إعادة توجيه غير مُثبت في الكود الثابت | يحذر |
| إسناد جماعي | يُمرر نص الطلب بالكامل إلى مُنشئ نموذج أو تحديثه | يحذر |
| بيانات حساسة في نص الطلب | رسائل بريد إلكتروني، كلمات مرور، رموز مميزة، إلخ. مقروءة من نص الطلب | يحذر |
| بيانات حساسة في رابط/استعلام | رسائل بريد إلكتروني، كلمات مرور، رموز مميزة، إلخ. مقروءة من سلسلة الاستعلام | يحذر |
| بيانات حساسة في الرؤوس | رسائل بريد إلكتروني، كلمات مرور، رموز مميزة، إلخ. مقروءة من رؤوس الطلب | يحذر |
| مسار ملف من إدخال المستخدم | يُستخدم متغير، وليس سلسلة ثابتة، كمسار ملف | يحذر |
| وسائط سطر الأوامر | تأتي البيانات من وسائط سطر الأوامر | يحذر |
| الإدخال القياسي | تأتي البيانات من stdin | يحذر |
| متغيرات البيئة | تأتي البيانات من متغير بيئة | يحذر |
| إجراء GitHub غير مثبت | يستخدم سير العمل علامة قابلة للتغيير (@v4) بدلاً من SHA للالتزام | يحذر |
pull_request_target غير آمن | يستخدم سير العمل مشغل pull_request_target | يحذر |
القائمة الكاملة الحالية موجودة في guidance.TECHNICAL_RISKS و formatter.BLOCKING_CATEGORIES، في حالة ابتعاد هذا الجدول عن الدقة.
┌───────────────────────────────┐
│ تطلب من Claude Code أن │
│ يكتب أو يعدل ملفًا │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ يحاول Claude Code حفظ │
│ الملف (أداة Write/Edit) │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ خطاف VibeGate │
│ (يعمل تلقائيًا، │
│ قبل حفظ الملف) │
└───────────────┬───────────────┘
│
يفحص الكود الجديد باستخدام Semgrep
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌────────────────────┐ ┌────────────────────┐ ┌──────────────────────┐
│ لم يتم العثور │ │ مدخل خطير، │ │ مدخل خطير يصل │
│ على مدخل خطير │ │ لكن خطر أقل │ │ إلى مصدر حاسم │
│ │ │ (مثل العرض في │ │ (SQL/أمر/RCE، │
│ │ │ رد HTTP) │ │ حقن القالب) │
└─────────┬──────────┘ └─────────┬──────────┘ └───────────┬──────────┘
│ │ │
▼ ▼ ▼
يتم حفظ الملف، يتم حفظ الملف، لا يتم حفظ الملف.
لا يظهر شيء. بالإضافة إلى تحذير يرى Claude Code
في الطرفية مع سبب المنع
الخطر وكيفية إصلاحه. ويُقال له ما يجب
إصلاحه.
باختصار: الكود الآمن يمر دون تغيير، الكود الخطير لكن قابل للبقاء يُحفظ مع تحذير مرفق، والكود الذي يفصله خطوة واحدة عن أشياء مثل حقن SQL أو حقن الأوامر أو تنفيذ التعليمات البرمجية عن بُعد يُوقف قبل وصوله إلى القرص على الإطلاق.
إذا واجه VibeGate خطأً غير متوقع، فإنه يسمح دائمًا بالكتابة — فلا ينبغي أبدًا أن يكون وجود خلل في الخطاف هو السبب في منع عملك.
يحمل كل تحذير ومنع أيضًا تعليمات صريحة تطلب من Claude Code ذكر النتيجة لك في ردوده، وليس فقط إصلاحها بصمت. هذا ما يجعل نشاط VibeGate مرئيًا في المحادثة، وليس فقط في سجل طرفية تحتاج إلى البحث عنه.
| ما يراه VibeGate | ما يحدث |
|---|---|
| لا يوجد إدخال مستخدم، أو لغة لا يدعمها بعد | يُحفظ الملف بشكل طبيعي، لا يظهر شيء |
| تم العثور على إدخال مستخدم، لكن الخطر متوسط (مثل إعادة التوجيه المفتوحة، الإسناد الجماعي) | يُحفظ الملف، تظهر في الطرفية تحذير + إرشادات |
| يتدفق إدخال المستخدم غير المنقى إلى مصدر حاسم (استعلام SQL/NoSQL، أمر شل، محرك قوالب، أداة إلغاء تسلسل، محلل XML، مسار ملف، اسم ملف مرفوع، أو مخرجات HTML خام) | لا يتم حفظ الملف — يُخبر Claude Code بسبب المنع |
انظر الجدول في "ما المشكلة التي تحلها هذه الأداة؟" أعلاه للاطلاع على التفصيل الكامل لكل فحص: ما يمنع مقابل ما يحذر فقط.
اليوم يدعم VibeGate Python، JavaScript/TypeScript، Go، Java، PHP، و Ruby، ويتصل بـ Claude Code و Codex. يمكن إضافة المزيد من اللغات والأدوات دون الحاجة إلى تعديل المنطق الأساسي.
كما يفحص ملفات سير عمل GitHub Actions لخطأين شائعين في سلسلة توريد CI/CD: الإجراءات المثبتة بعلامة قابلة للتغيير (@v4) بدلاً من SHA للالتزام، والمحفز غير الآمن pull_request_target. كلاهما يحذر بدلاً من المنع، لأنهما فحوصات تقوية وليس دليلاً على استغلال فعال.
هذا تسجيل حقيقي لـ Claude Code وهو يبني تطبيق قارئ خلاصات RSS من البداية، مع تشغيل VibeGate طوال الوقت. لاحظ اللحظات التي يتوقف فيها Claude Code ويذكر بوضوح ما أشار إليه VibeGate، ولماذا، قبل المتابعة — بما في ذلك خطر حقيقي لـ SSRF في كود جلب الخلاصة يعمل على إصلاحه في الحال.
هذا مثال ثانٍ، كصورة ثابتة: Claude Code يبني تطبيقًا يسمح للأشخاص برفع صورة ورؤية تفاصيلها. يلاحظ VibeGate أن اسم الملف وتفاصيل أخرى عن الملف سيتم عرضها لاحقًا على الشاشة، ويحذر من أن هذا يمكن استخدامه لحقن كود ضار في الصفحة (وهذا يُسمى XSS). يقوم Claude Code بتعديل الكود بحيث تُعرض المعلومات بأمان.
في كلتا الحالتين، لم يتم منع أي شيء دون سبب، ولم يضطر أحد لقراءة الكود سطرًا سطرًا لاكتشاف المشكلة. اكتشفها VibeGate في لحظة كتابة الملف، وأصلحها الذكاء الاصطناعي في الحال.
هناك طريقتان لجعل مساعد الذكاء الاصطناعي يكتب كودًا أكثر أمانًا. الأولى هي تحميل مجموعة كبيرة من التعليمات حول البرمجة الآمنة في المحادثة قبل البدء، مثل قائمة مرجعية تغطي حقن SQL، XSS، التعامل مع كلمات المرور، رفع الملفات، وغيرها. الطريقة الأخرى هي ما يفعله VibeGate: فحص الكود تلقائيًا، عند كتابة الملف، ولا يتحدث إلا عند وجود خطأ فعلي.
الطريقة الأولى تكلف رموزًا (tokens) في كل رسالة، سواء كانت ضرورية أم لا. قائمة مرجعية نموذجية للبرمجة الآمنة تغطي عدة فئات من المخاطر يمكن أن تضيف بسهولة بضعة آلاف من الرموز. إذا كتب مساعد ذكاء اصطناعي 50 ملفًا في جلسة واحدة، وتم إعادة تحميل تلك القائمة المرجعية أو الاحتفاظ بها في السياق في كل مرة، فقد تدفع مقابل أكثر من مائة ألف رمز من النصائح التي، في معظم الأوقات، لا تنطبق على الملف الذي يُكتب حاليًا. صفحة تسجيل وملف ثابت بلون بسيط لا يحتاجان إلى نفس التحذيرات، لكن القائمة المرجعية المحملة لا تستطيع التمييز بينهما مسبقًا.
VibeGate يعكس هذا الأمر. يظل صامتًا، ولا يكلف شيئًا إضافيًا، لكل ملف لا يحتوي على نمط خطير. فقط عندما يجد شيئًا، مثل تدفق إدخال المستخدم إلى استعلام قاعدة بيانات، يضيف ملاحظة قصيرة ومحددة حول تلك المشكلة الواحدة، عادةً جزء صغير من حجم القائمة المرجعية الكاملة. لذا بدلاً من دفع تكلفة ثابتة من الرموز على كل ملف بغض النظر، تدفع تكلفة صغيرة فقط على الملفات التي تحتاج فعلاً إلى الاهتمام، وتكون تلك التكلفة موجهة بدقة إلى المشكلة التي تم العثور عليها، وليس محاضرة عامة عن الأمان.
هذا أيضًا يجعل التوجيه أكثر موثوقية. مساعد الذكاء الاصطناعي المطلوب منه "مراعاة الأمان" أثناء كتابة مئات الأسطر من الكود يمكنه ببساطة أن يفوت سطرًا خطيرًا بين الكثير. البوابة لا تتعب ولا تشتت انتباهها: تفحص كل كتابة، في كل مرة، باستخدام نفس القواعد الثابتة.
قم بتثبيته مرة واحدة — هذا أيضًا يسحب Semgrep، الذي يعتمد عليه VibeGate:
pipx install git+https://github.com/theMiddleBlue/vibegate
ثم قم بتفعيله داخل المشروع الذي تريد حمايته:
cd your-project
vibegate on # تفعيل هنا (أعد تحميل Claude Code بعد ذلك)
vibegate status # تحقق مما إذا كان مفعلاً لهذا المشروع
vibegate off # إيقاف هنا
vibegate on يضيف خطاف PreToolUse لـ Write|Edit|MultiEdit إلى ملف .claude/settings.local.json الخاص بالمشروع. النطاق لكل مشروع، لذا فإن تفعيله في مستودع واحد لا يؤثر على أي مستودع آخر.
يقوم Claude Code بتشغيل الخطاف كـ vibegate run --host claude_code — لا توجد مسارات مطلقة متضمنة، لذا يظل يعمل حتى إذا أعدت التثبيت أو نقلت الأشياء.
vibegate status يعرض أيضًا سجلًا جاريًا لما التقطه VibeGate بالفعل في هذا المشروع — كل تحذير ومنع، مع الملف والسطر والفئة — حتى تتمكن من رؤية نشاطه بمرور الوقت بدلاً من مجرد معرفة ما إذا كان مفعلاً:
$ vibegate status
█ █ █████ ████ █████ ████ ███ █████ █████
...
● VibeGate مفعّل في .claude/settings.local.json
النشاط الأخير (آخر 2 من أصل 2 مسجل، الأحدث أولاً):
2026-07-02T17:35:48+00:00 ⛔ تم المنع server.py:3 EXEC_INPUT (FREE_TEXT)
2026-07-02T17:35:46+00:00 ⚠ تم التحذير app.py:2 HTTP_BODY (EMAIL)
هذا السجل موجود في .vibegate/activity.jsonl في جذر المشروع — أضفه إلى .gitignore الخاص بك، إنها حالة مطور محلية، وليست شيئًا يجب الالتزام به.
يقوم VibeGate بتحديد المضيف الذي يتحدث إليه بهذا الترتيب: علامة صريحة --host <name>، ثم متغير البيئة VIBEGATE_HOST، ثم الكشف التلقائي من البيانات الواردة، مع الرجوع إلى claude_code.
إذا قام VibeGate بوضع علامة على شيء قررت عمدًا أنه آمن، أضف تعليق vibegate-ignore على نفس السطر — يعمل مع أي صيغة تعليق (#, //, …)، لأن VibeGate يبحث فقط عن النص:
query = f"SELECT * FROM users WHERE id = {user_id}" # vibegate-ignore
لقمع فئات محددة فقط بدلاً من كل شيء على هذا السطر، اذكرها بعد نقطتين (تطابق إما الفئة التقنية أو النوع الدلالي، مفصولة بفواصل، غير حساسة لحالة الأحرف):
query = f"SELECT * FROM users WHERE id = {user_id}" # vibegate-ignore: DB_QUERY
src/vibegate/
├── hook.py # نقطة الدخول
├── cli.py # أوامر التشغيل/الإيقاف/الحالة + الشعار ASCII
├── activity_log.py # يحفظ التحذيرات/المنع في .vibegate/activity.jsonl
├── colors.py # رموز ألوان ANSI مشتركة (التقرير + شعار CLI)
├── core.py # خط أنابيب مستقل عن المضيف
├── models.py # InputEvent / ClassifiedFinding / AnalysisResult
├── semgrep_runner.py # تشغيل Semgrep كعملية فرعية (آمن من الفشل)
├── classifier.py # يربط قاعدة Semgrep ← فئة، اسم متغير ← نوع بيانات
├── guidance.py # التقارير الثابتة للمخاطر/الإصلاح
├── formatter.py # يحول النتائج إلى تقرير طرفية + سياق المضيف
├── adapters/ # القاعدة، claude_code، codex + سجل صغير
└── rules/ # قواعد Semgrep — ملف واحد لكل لغة (Python، JS/TS،
# Go، Java، PHP، Ruby) بالإضافة إلى عنصر نائب عام
خط الأنابيب نفسه (core.py) لا يتحدث أبدًا مباشرة إلى مضيف معين — جميع المدخلات/المخرجات الخاصة بالمضيف موجودة في adapters/، لذا فإن إضافة مضيف جديد لا يتطلب لمس منطق التحليل.
semgrep --validate --config src/vibegate/rules/ # تحقق من صحة القواعد
pytest tests/ # اختبارات الوحدة + التكامل
لرؤيته يعمل من البداية إلى النهاية بدون Claude Code:
python3 -c 'import json; print(json.dumps({"tool_name":"Write","tool_input":{"file_path":"/tmp/t.py","new_content":"email = request.json.get(\"email\")"}}))' \
| python3 src/vibegate/hook.py --host claude_code
rules/<lang>-user-input.yaml، سجّل معرفات القاعدة الجديدة في classifier.RULE_TO_TECHNICAL، واربط امتداد الملف في core.EXT_TO_LANGUAGE.classifier.VARNAME_TO_SEMANTIC ووصفًا في guidance.SEMANTIC_GUIDANCE.RULE_TO_TECHNICAL، وبطاقة في guidance.TECHNICAL_RISKS.adapters/ وسجله في adapters/__init__.py.codex هو تعيين مبكر بأفضل جهد. تحقق من عقد الحدث الخاص به مقابل إصدار Codex الخاص بك قبل الاعتماد عليه لمنع أي شيء."requires login" بدلاً من السطر المطابق الفعلي، لذلك يعيد المصنف بناء المقتطف بنفسه من محتوى الملف باستخدام أرقام الأسطر.Edit/MultiEdit، يعيد محول claude_code بناء الملف الكامل بعد التعديل من القرص بحيث يظل المصدر الملوث والمصدر الحاسم الذي تم إدخاله من خلال تعديلات منفصلة متصلين — ولكن يتم الإبلاغ فقط عن النتائج على الأسطر التي لمستها التعديلات بالفعل. إذا كان المصدر الحاسم موجودًا بالفعل وأضاف تعديل لاحق المصدر الملوث الذي يصل إليه فقط، فلن يتم اكتشاف ذلك (لم يكن سطر المصدر الحاسم جزءًا من التعديل الجديد). هذه إعادة البناء خاصة بـ Claude-Code؛ محول codex لا يفعل ذلك بعد.| تسجيل بيانات الاعتماد |
يتم تمرير كلمة مرور أو مفتاح API أو رمز مميز إلى print/console.log/أداة تسجيل |
| يحذر |
| سر مخزَّن في الكود الثابت | متغير يُسمى مثل سر يُعطى قيمة حرفية تبدو حقيقية | يحذر |