لديك مشاريع تحتوي على عشرات الملفات: مقالات ماركداون، ملفات JSON لسير العمل، نصوص Python، ملفات إعدادات. أي منها قد يحتوي بالخطأ على:
هذه التسريبات لا تحدث بسبب الإهمال. تحدث بسبب السرعة. عندما تركز على الإنجاز، تنسى التنظيف.
سنبني سير عمل يقوم بمسح جميع ملفات مشروعك أسبوعياً ويكتشف:
المسح لا يرسل بياناتك إلى أي مكان. يعمل محلياً بالكامل، مع تنبيهات عبر البريد الإلكتروني إذا تم العثور على شيء.
→ يحتاج فريق التصميم لديك إلى هذا أيضاً. دليل المصمم المستقل يشرح كيف.
cron (أسبوعياً) → script.sh → scan_report.json
↓
n8n webhook → يرسل بريداً بالنتائج
مكونان فقط:
أنشئ ملفاً باسم `scan-repo.sh` في جذر مشروعك:
#!/usr/bin/env bash
# scan-repo.sh — امسح المستودع بحثاً عن تسريبات محتملة
# الاستخدام: ./scan-repo.sh /path/to/project
TARGET="${1:-.}"
REPORT="/tmp/scan-$(date +%Y%m%d).json"
RESULTS='{"scan_date":"'$(date -Iseconds)'","target":"'$TARGET'","findings":[]}'
echo "$RESULTS" > "$REPORT"
add_finding() {
local severity="$1" category="$2" file="$3" line="$4" match="$5"
python3 -c "
import json
with open('$REPORT') as f: r = json.load(f)
r['findings'].append({'severity':'$severity','category':'$category','file':'$file','line':$line,'match':'$match'})
with open('$REPORT','w') as f: json.dump(r, f, indent=2)
"
}
echo "🔍 Scanning $TARGET ..."
# 1. عناوين البريد (محتملة — تجاهل npm/yarn/pip cache)
grep -rnI --include='*.py' --include='*.js' --include='*.ts' --include='*.json' \
--include='*.md' --include='*.yml' --include='*.yaml' --include='*.env' \
--include='*.config.*' --include='*.txt' \
-E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' "$TARGET" \
2>/dev/null | grep -vE '(node_modules|vendor|__pycache__|\.git|package-lock|yarn\.lock)' \
| grep -vE '@types|@babel|@eslint|@testing-library|examples?\.com|domain\.com|your@email|test@' \
| while IFS=: read -r file line match; do
add_finding "low" "email" "$file" "$line" "$match"
done
# 2. مفاتيح API — Amazon, Google, GitHub, OpenAI, Stripe, Slack
grep -rnI --include='*.py' --include='*.js' --include='*.ts' --include='*.json' \
--include='*.yml' --include='*.yaml' --include='*.env' --include='*.config.*' \
-E '(AKIA[0-9A-Z]{16}|sk-[a-zA-Z0-9]{32,}|gh[pousr]_[a-zA-Z0-9]{36,}|AIza[0-9A-Za-z_-]{35}|whsec_[a-zA-Z0-9]{32,}|xox[baprs]-[0-9a-zA-Z-]{10,}|sk_live_[a-zA-Z0-9]{24,})' "$TARGET" \
2>/dev/null | grep -vE '(node_modules|vendor|__pycache__|\.git)' \
| while IFS=: read -r file line match; do
add_finding "critical" "api_key" "$file" "$line" "$match"
done
# 3. أرقام هواتف (أنماط دولية)
grep -rnI --include='*.py' --include='*.js' --include='*.json' --include='*.md' \
--include='*.txt' --include='*.yml' \
-E '\+[0-9]{1,3}[0-9]{6,14}' "$TARGET" \
2>/dev/null | grep -vE '(node_modules|vendor|__pycache__|\.git)' \
| grep -vE '\+[0-9]{1,3}[0\*]{6,}' \
| while IFS=: read -r file line match; do
add_finding "medium" "phone" "$file" "$line" "$match"
done
# 4. عناوين IP داخلية
grep -rnI --include='*.py' --include='*.js' --include='*.json' --include='*.yml' \
--include='*.yaml' --include='*.env' --include='*.md' \
-E '\b(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.)[0-9]{1,3}\.[0-9]{1,3}\b' "$TARGET" \
2>/dev/null | grep -vE '(node_modules|vendor|__pycache__|\.git)' \
| grep -vE '(example\.|0\.0\.0\.0|127\.0\.0)' \
| while IFS=: read -r file line match; do
add_finding "medium" "internal_ip" "$file" "$line" "$match"
done
# 5. أسماء الشركات (قائمة مخصصة)
COMPANIES=("Acme Corp" "Example Inc" "Test Company" "Client Name")
for company in "${COMPANIES[@]}"; do
grep -rnI --include='*.py' --include='*.js' --include='*.json' --include='*.md' \
--include='*.yml' --include='*.yaml' --include='*.txt' \
-F "$company" "$TARGET" 2>/dev/null \
| grep -vE '(node_modules|vendor|__pycache__|\.git)' \
| while IFS=: read -r file line match; do
add_finding "low" "company_name" "$file" "$line" "$match"
done
done
echo "✅ Scan complete. Report: $REPORT"
python3 -c "
import json
with open('$REPORT') as f: r = json.load(f)
print(f' Total findings: {len(r[\"findings\"])}')
for level in ['critical','medium','low']:
count = sum(1 for f in r['findings'] if f['severity']==level)
if count: print(f' {level}: {count}')
"
# افتح crontab: crontab -e
# أضف السطر التالي للتشغيل كل يوم إثنين الساعة ٩ صباحاً:
0 9 * * 1 cd /path/to/your/project && ./scan-repo.sh >> /tmp/scan-cron.log 2>&1
| الخطوة | العقدة | الإعدادات |
| 1 | Webhook | POST, مسار مخصص (مثلاً `/scan-alert`) |
| 2 | IF | `{{ $json.findings.length > 0 }}` |
| 3 | Email (SMTP) | إرسال ملخص إلى بريدك |
| 4 | Wait | ساعة واحدة (لمنع التكرار) |
نموذج البريد الإلكتروني:
الموضوع: 🔴 [FlowForge Scan] تم العثور على {{ findings.length }} مشكلة في {{ target }}
النص:
تم العثور على نتائج في الفحص الأمني الأسبوعي.
الملخص:
- حرجة (مفاتيح API): X
- متوسطة (عناوين IP/هواتف): Y
- منخفضة (بريد/أسماء شركات): Z
أهم الاكتشافات:
1. [حرجة] مفتاح API في {file}:{line}
2. [متوسطة] IP داخلي في {file}:{line}
3. [منخفضة] بريد إلكتروني في {file}:{line}
عرض التقرير الكامل: /tmp/scan-YYYYMMDD.json
إذا كنت تستخدم مفاتيح API عبر مكتبات مثل `python-dotenv`، أضف هذا الفحص الإضافي:
#!/usr/bin/env python3
"""scan-references.py — ابحث عن أسماء متغيرات سرية في الكود."""
import re, json, os, sys
from pathlib import Path
SECRET_PATTERNS = [
r'(api[_-]?key|apikey)\s*[=:]\s*["\'][^"\']+["\']',
r'(secret|token|password|passwd)\s*[=:]\s*["\'][^"\']+["\']',
r'(access[_-]?key|secret[_-]?key)\s*[=:]\s*["\'][^"\']+["\']',
]
def scan_file(filepath):
findings = []
try:
text = filepath.read_text(encoding='utf-8', errors='ignore')
for i, line in enumerate(text.split('\n'), 1):
for pattern in SECRET_PATTERNS:
if re.search(pattern, line, re.IGNORECASE):
findings.append({'file': str(filepath), 'line': i, 'match': line.strip()[:80]})
except Exception:
pass
return findings
if __name__ == '__main__':
root = Path(sys.argv[1]) if len(sys.argv) > 1 else Path('.')
all_findings = []
for ext in ['*.py', '*.js', '*.ts', '*.yml', '*.yaml', '*.env', '*.config.*', '*.json', '*.sh']:
for f in root.rglob(ext):
if any(ign in str(f) for ign in ['node_modules', 'vendor', '__pycache__', '.git']):
continue
all_findings.extend(scan_file(f))
report = {'scan_date': os.popen('date -Iseconds').read().strip(), 'findings': all_findings}
print(json.dumps(report, indent=2))
الجمعة ٩ صباحاً
↓
cron يشغّل scan-repo.sh
↓
النتائج تُكتب إلى /tmp/scan-YYYYMMDD.json
↓
webhook n8n يُفعّل ← يقرأ التقرير
↓
إذا وجد نتائج ← إرسال بريد إلكتروني + إشعار
إذا لا يوجد ← سكون (لا إشعار = لا مشكلة)
↓
تنتهي العملية في دقيقتين
هل هذا يبطئ مشروعي؟
لا. المسح على ملفات المصدر فقط ويستغرق ثوانٍ للمشاريع العادية.
ماذا لو كانت النتائج إيجابية كاذبة؟
أضف الأنماط إلى أمر grep -v لاستثنائها. النظام مبني على البساطة — أنت تتحكم بالقواعد.
هل يعمل على مستودعات متعددة؟
نعم. غيّر `TARGET` في cron إلى Each project folder، أو أنشئ حلقة `for`:
for repo in ~/projects/*/; do
cd "$repo" && ./scan-repo.sh
done
آخر اختبار: ٢٢ يونيو ٢٠٢٦. قواعد الكشف تتطور — راجع أنماطك كل ٣ أشهر.
احصل على خط أنابيب العمل الكامل — مجاناً، بدون بطاقة ائتمان.
By downloading, you agree to our سياسة الخصوصية. سنرسل لك تحديثات سير العمل — إلغ الاشتراك في أي وقت.