كشف تسرب الخصوصية تلقائياً — فحص أمني أسبوعي في ١٥ دقيقة

المستوى: متوسطالوقت: ١٥ دقيقة إعداد، ثم يعمل تلقائياً

المشكلة

لديك مشاريع تحتوي على عشرات الملفات: مقالات ماركداون، ملفات JSON لسير العمل، نصوص Python، ملفات إعدادات. أي منها قد يحتوي بالخطأ على:

  • بريد إلكتروني حقيقي في ملف JSON خاص بسير عمل تجريبي
  • رمز pipeline مكتوب في ملف قابل للاستيراد
  • اسم عميل أو شركة في وصف مشروع
  • مفتاح API متروك في إعدادات تم رفعها
  • عنوان IP لخادم في وثائق البنية التحتية
  • → تحقق من مقارنتنا لأدوات البرمجة إذا كنت تبحث عن إعداد بيئة تطوير آمنة.

    هذه التسريبات لا تحدث بسبب الإهمال. تحدث بسبب السرعة. عندما تركز على الإنجاز، تنسى التنظيف.

    الحل: كاشف التسرب التلقائي

    سنبني سير عمل يقوم بمسح جميع ملفات مشروعك أسبوعياً ويكتشف:

  • عناوين البريد الإلكتروني
  • أرقام الهواتف
  • مفاتيح API (Amazon, Google, GitHub, OpenAI, Stripe, إلخ.)
  • رموز الوصول (tokens)
  • أسماء الشركات
  • عناوين IP الداخلية
  • أسماء المستخدمين وكلمات المرور
  • المسح لا يرسل بياناتك إلى أي مكان. يعمل محلياً بالكامل، مع تنبيهات عبر البريد الإلكتروني إذا تم العثور على شيء.

    → يحتاج فريق التصميم لديك إلى هذا أيضاً. دليل المصمم المستقل يشرح كيف.

    ما ستبنيه

    
    cron (أسبوعياً) → script.sh → scan_report.json
    
                               ↓
    
                        n8n webhook → يرسل بريداً بالنتائج
    
    

    مكونان فقط:

  • نص برمجي (bash/Python): يقوم بالمسح الفعلي — يبحث عن الأنماط، ويُخرج تقرير JSON
  • سير عمل n8n: يستقبل التقرير ويرسل بريداً إلكترونياً بالنتائج
  • الخطوة ١: نص المسح

    أنشئ ملفاً باسم `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}')
    
    "
    
    

    الخطوة ٢: جدولة cron

    
    # افتح crontab: crontab -e
    
    # أضف السطر التالي للتشغيل كل يوم إثنين الساعة ٩ صباحاً:
    
    0 9 * * 1 cd /path/to/your/project && ./scan-repo.sh >> /tmp/scan-cron.log 2>&1
    
    

    الخطوة ٣: سير عمل n8n للتنبيهات

    الخطوةالعقدةالإعدادات
    1WebhookPOST, مسار مخصص (مثلاً `/scan-alert`)
    2IF`{{ $json.findings.length > 0 }}`
    3Email (SMTP)إرسال ملخص إلى بريدك
    4Waitساعة واحدة (لمنع التكرار)

    نموذج البريد الإلكتروني:

    الموضوع: 🔴 [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
    
    

    سير العمل ذات الصلة

  • [دليل المصمم المستقل](/articles/ar/01-dalil-almusamim-almustaqil) — يحتاج المصممون الذين يتعاملون مع ملفات العملاء إلى هذا الفحص أيضاً.
  • [مقارنة أدوات البرمجة](/articles/ar/04-muqaranat-adawat-albarmaja) — أي بيئة تطوير تختار لسلامة سير العمل.
  • [الوكيل العقاري وسير عمل الذكاء الاصطناعي](/articles/ar/05-waseet-aqari) — نفس منطق الأتمتة الأسبوعية للتنبيهات.
  • [كيف يؤتمت المحاسب ٨٠% من مهامه](/articles/ar/02-kayf-yutamat-almuhasib) — المحاسبون يتعاملون مع بيانات مالية حساسة. هذا السير العمل يوضح الأتمتة مع الحفاظ على الخصوصية.
  • [توسيع نطاق التصميم](/articles/ar/07-tawsee-namet-altasmim) — مع التوسع، يصبح الأمان أمراً حاسماً. هذا الدليل يوضح كيفية بناء فحوصات آلية في سير عملك.

  • آخر اختبار: ٢٢ يونيو ٢٠٢٦. قواعد الكشف تتطور — راجع أنماطك كل ٣ أشهر.


    تحميل سير عمل n8n

    احصل على خط أنابيب العمل الكامل — مجاناً، بدون بطاقة ائتمان.

    By downloading, you agree to our سياسة الخصوصية. سنرسل لك تحديثات سير العمل — إلغ الاشتراك في أي وقت.