598 lines
43 KiB
Markdown
598 lines
43 KiB
Markdown
<div dir="rtl" lang="ar">
|
|
|
|
# التقرير الأمني والفني الشامل لتطبيق سيرو (Siro)
|
|
|
|
**تاريخ التقرير:** 12 يونيو 2026
|
|
**النسخة:** v1.0
|
|
**الغرض:** مراجعة شاملة للبنية الأمنية، الترجمة، تدفق التسجيل، ومعالجة البيانات
|
|
|
|
---
|
|
|
|
## 📋 فهرس المحتويات
|
|
|
|
1. [نظرة عامة على النظام](#نظرة-عامة-على-النظام)
|
|
2. [تحليل رحلة المستخدم الكاملة](#تحليل-رحلة-المستخدم-الكاملة)
|
|
3. [تحقيق شامل في ملفات الترجمات (Localization)](#تحقيق-شامل-في-ملفات-الترجمات)
|
|
4. [تحليل طبقات الأمان (Security Architecture)](#تحليل-طبقات-الأمان)
|
|
5. [تحليل نظام التشفير الثلاثي (XR, XQCXC, XC)](#تحليل-نظام-التشفير-الثلاثي)
|
|
6. [تحليل صيغ أرقام الهواتف والفورمات](#تحليل-صيغ-أرقام-الهواتف)
|
|
7. [مراجعة الـ Backend والأمان](#مراجعة-الباك-إند)
|
|
8. [نقاط الضعف المحتملة والمخاطر](#نقاط-الضعف-المحتملة)
|
|
9. [التوصيات والتحسينات المقترحة](#التوصيات)
|
|
|
|
---
|
|
|
|
## نظرة عامة على النظام
|
|
|
|
### المكونات الرئيسية
|
|
|
|
| المكون | التقنية | الدور |
|
|
|--------|---------|-------|
|
|
| **تطبيق الراكب (siro_rider)** | Flutter + GetX | طلب الرحلات، الدفع، التقييم |
|
|
| **تطبيق السائق (siro_driver)** | Flutter + GetX | استلام الطلبات، الملاحة، الأرباح |
|
|
| **تطبيق الإدارة (siro_admin)** | Flutter Web/PWA | لوحة تحكم، إدارة السائقين والركاب |
|
|
| **تطبيق الخدمة (siro_service)** | Flutter | تسجيل السائقين من قبل موظفي الخدمة |
|
|
| **الخادم الرئيسي (Main API)** | PHP (بدون إطار عمل) | مصادقة، إدارة حسابات، API عام |
|
|
| **خادم الرحلات (Ride Server)** | PHP | إدارة الطلبات، التوزيع، الدفع |
|
|
| **خادم المواقع (Location Server)** | PHP | تتبع GPS، بحث السائقين القريبين |
|
|
| **خادم الدفع (Payment Server)** | PHP | معالجة المدفوعات، المحافظ |
|
|
| **WebSocket (Socket)** | PHP WebSockets | الاتصال المباشر، التتبع الحي |
|
|
| **قواعد البيانات** | MySQL 8.0 مع GIS | تخزين المستخدمين، الرحلات، المدفوعات |
|
|
|
|
### مناطق التشغيل
|
|
- **سوريا** - تسجيل يدوي مع موظف خدمة + ذكاء اصطناعي
|
|
- **الأردن** - تفعيل تلقائي بعد التحقق من المستندات
|
|
- **مصر** - تفعيل تلقائي بعد التحقق من المستندات
|
|
|
|
---
|
|
|
|
## تحليل رحلة المستخدم الكاملة
|
|
|
|
### 📱 **1. تدفق تسجيل الراكب الجديد**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ رحلة الراكب الكاملة │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ 1. فتح التطبيق ← شاشة البداية (SplashScreen) │
|
|
│ 2. التحقق من وجود JWT مخزّن │
|
|
│ ├─ يوجد ← التحقق من حالة الرحلة النشطة ← الخريطة │
|
|
│ └─ لا يوجد ← شاشة الترحيب (Onboarding) │
|
|
│ 3. شاشة الترحيب (3 شرائح تعليمية) ← [متابعة] │
|
|
│ 4. شاشة تسجيل الدخول (رقم الهاتف / Google / Apple) │
|
|
│ ├─ إدخال رقم الهاتف ← إرسال OTP (واتساب أو SMS) │
|
|
│ │ └─ الرابط: $server/auth/otpmessage.php │
|
|
│ ├─ Google Sign-In ← getGoogleApi() │
|
|
│ └─ Apple Sign-In ← apple_sigin.dart │
|
|
│ 5. شاشة OTP (5 أرقام) ← تحقق ← $auth/verifyOtpMessage.php │
|
|
│ 6. شاشة إكمال التسجيل (الاسم، الإيميل اختياري) │
|
|
│ 7. ← الخريطة الرئيسية (جاهز لطلب رحلة) │
|
|
│ 8. ← اختيار الوجهة ← اختيار نوع السيارة ← تأكيد السعر │
|
|
│ 9. ← $rideServerSide/ride/rides/add.php (إنشاء طلب) │
|
|
│ 10. ← البحث عن سائق ← WebSocket للاستماع │
|
|
│ 11. ← قبول السائق ← تتبع السائق على الخريطة │
|
|
│ 12. ← بدء الرحلة ← أثناء الرحلة ← إنهاء ← تقييم ← دفع │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 🚗 **2. تدفق تسجيل السائق الجديد (النظام الجديد)**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ رحلة تسجيل السائق الكاملة (النظام الجديد) │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ 1. فتح تطبيق السائق ← شاشة البداية (SplashScreen) │
|
|
│ 2. التحقق من JWT ← لا يوجد ← شاشة ترحيب السائق │
|
|
│ 3. شاشة "إنشاء حساب سائق" ← إدخال: │
|
|
│ ├─ الاسم الأول + اسم العائلة │
|
|
│ ├─ البريد الإلكتروني │
|
|
│ ├─ كلمة المرور │
|
|
│ ├─ رقم الهاتف (مع التحقق من الصيغة حسب الدولة) │
|
|
│ └─ الموافقة على الشروط والأحكام │
|
|
│ 4. ← $authCaptin/register.php (إنشاء حساب السائق) │
|
|
│ 5. ← إرسال رمز التحقق عبر الإيميل ← التحقق │
|
|
│ 6. ← **النظام الجديد - رفع الصور دفعة واحدة**: │
|
|
│ ├─ رخصة السائق (أمامي + خلفي) │
|
|
│ ├─ الهوية الشخصية (أمامي + خلفي) │
|
|
│ ├─ رخصة المركبة (أمامي + خلفي) │
|
|
│ ├─ صحيفة الحالة الجنائية │
|
|
│ └─ صورة شخصية (كشف الوجه) │
|
|
│ 7. ← **Gemini AI** يحلل الصور مجتمعة ويستخرج البيانات: │
|
|
│ ├─ getLlama() / getChatGPT() / arabicTextExtractByVisionAndAI() │
|
|
│ ├─ استخراج: الاسم، تاريخ الميلاد، الرقم الوطني، العنوان │
|
|
│ ├─ استخراج: ماركة السيارة، الموديل، السنة، اللون، الشاسيه │
|
|
│ └─ ملء الحقول تلقائياً في النماذج │
|
|
│ 8. ← مراجعة البيانات المستخرجة والتأكيد │
|
|
│ 9. ← إرسال الطلب الكامل (نصوص + صور) │
|
|
│ │
|
|
│ ┌─── نظام التفعيل حسب الدولة: ──────────────────────────┐ │
|
|
│ │ سوريا: موظف الخدمة (siro_service) يراجع البيانات ويفعّل │ │
|
|
│ │ الأردن: تفعيل تلقائي بعد التحقق من صحة المعلومات │ │
|
|
│ │ مصر: تفعيل تلقائي بعد التحقق من صحة المعلومات │ │
|
|
│ └──────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ 10. ← تفعيل الحساب ← تسجيل الدخول ← الصفحة الرئيسية │
|
|
│ 11. ← رفع حالة السائق إلى Online ← WebSocket يشتغل │
|
|
│ 12. ← استقبال طلبات الرحلات ← قبول ← توصيل ← إنهاء ← تقييم │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### ⚠️ **3. نقاط الفشل المحتملة في رحلة التسجيل**
|
|
|
|
| النقطة | المشكلة المحتملة | التأثير | مستوى الخطورة |
|
|
|--------|-----------------|---------|--------------|
|
|
| **رقم الهاتف (مصر)** | التحقق من الصيغة `01[0125]` فقط بدون مراعاة `+2` أو `002` | رفض أرقام صحيحة | 🔴 عالي |
|
|
| **OTP عبر واتساب** | اعتماد على WhatsApp API قد يفشل أحياناً | عدم استلام رمز التحقق | 🟡 متوسط |
|
|
| **تحليل AI للصور** | دقة الاستخراج تعتمد على جودة الصورة وزاوية التصوير | بيانات ناقصة أو خاطئة | 🟡 متوسط |
|
|
| **سياق الـ OTP Resend** | الـ 5 دقائق فترة تبريد - لكن الكود الحالي لا يطبقها فعلياً | إرسال OTP متكرر | 🟢 منخفض |
|
|
| **رقم الهاتف الدولي** | بعض الدول قد لا تُضاف لها بادئة `+2` | تخزين الرقم بشكل ناقص | 🔴 عالي |
|
|
|
|
---
|
|
|
|
## تحقيق شامل في ملفات الترجمات
|
|
|
|
### 📁 موقع ملفات الترجمات
|
|
|
|
| التطبيق | مسار الملفات | الصيغة |
|
|
|---------|-------------|--------|
|
|
| **siro_driver** | `lib/controller/local/translations.dart` | GetX Translations (Dart Map) |
|
|
| **siro_driver** | `translations_ar.json` | JSON (ملفات منفصلة) |
|
|
| **siro_driver** | `translations_en.json` | JSON (ملفات منفصلة) |
|
|
| **siro_rider** | `lib/controller/local/translations.dart` | GetX Translations (Dart Map) |
|
|
| **siro_admin** | (غير مفحوص بالكامل) | - |
|
|
| **siro_service** | (غير مفحوص بالكامل) | - |
|
|
|
|
### تحليل الترجمة في تطبيق السائق (siro_driver)
|
|
|
|
- **إجمالي المفاتيح (Keys):** أكثر من 2,650 مفتاح ترجمة في تطبيق السائق
|
|
- **نسبة التغطية:** ~95% من النصوص مترجمة للعربية
|
|
- **اللغة الافتراضية:** يتم قراءة لغة الجهاز (`Get.deviceLocale!.languageCode`)
|
|
- **آلية التخزين:** `GetStorage` مع المفتاح `BoxName.lang`
|
|
|
|
### ⚠️ **مشاكل تم رصدها في الترجمات**
|
|
|
|
```dart
|
|
// 1. مفاتيح غير مترجمة (بقيت بالإنجليزية)
|
|
"Siro123" → "Siro123" // لم تُترجم
|
|
"1999" → "1999" // أرقام غير مترجمة (مقبولة)
|
|
"27\\" → "27\\" // escape sequence غير مكتملة
|
|
|
|
// 2. تداخل في الأسماء
|
|
"appName" → "Siro" و "سيرو" و "Sefer" و "intaleq" // أسماء متعددة للتطبيق
|
|
|
|
// 3. مفاتيح بدون معنى واضح
|
|
"\$error" → "صار خطأ" // مفتاح من $ رمز
|
|
"\${AppInformation.appName} Wallet" → "محفظة \${AppInformation.appName}"
|
|
|
|
// 4. ترجمات حرفية غير دقيقة
|
|
"Lady 👩" → "سائقة بنات 👩" // مقبولة سياقياً
|
|
"Mashwari" → "مشاري" // كلمات محلية
|
|
```
|
|
|
|
### 🔴 **مشكلة حرجة: بقاء نصوص إنجليزية بدون ترجمة**
|
|
|
|
بعد فحص دقيق، تم رصد أن بعض النصوص في واجهات المستخدم تستخدم مباشرة نصوصاً إنجليزية دون المرور بملف الترجمة:
|
|
|
|
```dart
|
|
// في واجهات المستخدم - بعضها يستخدم النص الإنجليزي مباشرة
|
|
'Create Account' // هذا يمكن ترجمته
|
|
'Verify Email' // وهذا أيضاً
|
|
```
|
|
|
|
### 📊 **مقارنة بين تطبيق الراكب والسائق**
|
|
|
|
| الجانب | siro_rider | siro_driver |
|
|
|--------|-----------|-------------|
|
|
| عدد مفاتيح الترجمة | ~1,000+ | 2,650+ |
|
|
| استخدام `.tr` | 🔴 مستخدم بكثافة | 🟢 مستخدم بكثافة |
|
|
| ملفات JSON منفصلة | لا | نعم (`translations_ar.json`, `translations_en.json`) |
|
|
| دعم RTL | 🟢 نعم (عبر Flutter) | 🟢 نعم (عبر Flutter) |
|
|
| ثبات المصطلحات | 🟡 متوسط | 🟡 متوسط |
|
|
|
|
---
|
|
|
|
## تحليل طبقات الأمان
|
|
|
|
### 🏗️ **1. طبقات الأمان الحالية**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ طبقات الأمان في سيرو │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ الطبقة 1: SSL/TLS (HTTPS) │
|
|
│ ├── جميع الاتصالات عبر HTTPS (قيد التحقق من SSL Pinning) │
|
|
│ └── HSTS: max-age=31536000; includeSubDomains │
|
|
│ │
|
|
│ الطبقة 2: مصادقة JWT │
|
|
│ ├── JWT مخصص مع claims: passengerId/driverId, role, audience │
|
|
│ ├── صلاحية 1 ساعة (قابلة للتجديد) │
|
|
│ ├── تجديد تلقائي عند 401 (getJWT / getJwtWallet) │
|
|
│ └── Refresh Token في FlutterSecureStorage │
|
|
│ │
|
|
│ الطبقة 3: بصمة الجهاز (Device Fingerprint) │
|
|
│ ├── توليد بصمة SHA-256 للجهاز │
|
|
│ ├── تخزين في JWT payload (claim: fingerprint_hash) │
|
|
│ ├── التحقق في كل طلب (X-Device-FP header) │
|
|
│ └── Pepper في الخادم (FP_PEPPER) │
|
|
│ │
|
|
│ الطبقة 4: التشفير AES-256-CBC │
|
|
│ ├── Backend: openssl_encrypt (PHP) │
|
|
│ ├── Flutter: encrypt package (Dart) │
|
|
│ ├── Key: 32 بايت من ملف .enckey │
|
|
│ └── IV: 16 بايت من .env (initializationVector) │
|
|
│ │
|
|
│ الطبقة 5: تشفير البيئة (Obfuscation) │
|
|
│ ├── XR/XQCXC/XC نظام التشفير الثلاثي (سيتم تحليله لاحقاً) │
|
|
│ └── secure_string_operations (مكتبة مخصصة) │
|
|
│ │
|
|
│ الطبقة 6: كشف الجذر (Root Detection) │
|
|
│ ├── MethodChannel: com.siro.siro_driver/security │
|
|
│ ├── isNativeRooted() → فحص أصلي Native │
|
|
│ └── إغلاق التطبيق تلقائياً عند كشف الاختراق │
|
|
│ │
|
|
│ الطبقة 7: حماية من الهجمات الزمنية (Timing Attack) │
|
|
│ ├── login.php: تثبيت وقت الاستجابة عند 0.1 ثانية │
|
|
│ └── usleep() لتعويض الفارق │
|
|
│ │
|
|
│ الطبقة 8: تحديد المعدل (Rate Limiting) │
|
|
│ ├── RateLimiter مع Redis │
|
|
│ ├── لكل محاولات تسجيل الدخول │
|
|
│ └── إعادة تعيين العدّاد بعد تسجيل الدخول الناجح │
|
|
│ │
|
|
│ الطبقة 9: HMAC لخادم الدفع │
|
|
│ ├── طلبات wallet مع HMAC + JWT │
|
|
│ └── postWallet() / getWallet() │
|
|
│ │
|
|
│ الطبقة 10: التحقق من الجهاز (Fingerprint Verification) │
|
|
│ ├── login.php: مقارنة fingerprint مع SHA-256 │
|
|
│ └── دعم الطريقة الجديدة والقديمة للتوافقية │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## تحليل نظام التشفير الثلاثي (XR, XQCXC, XC)
|
|
|
|
### 🤔 **ما هو هذا النظام؟**
|
|
|
|
هو نظام تشفير مبني على **three-pass substitution cipher** (استبدال بثلاث مراحل) يستخدم لـ **obfuscation** (إخفاء) القيم الحساسة في الكود المصدري. الهدف هو إخفاء المفاتيح السرية مثل `keyOfApp` و `initializationVector` من الظهور بشكل نص واضح في الكود.
|
|
|
|
### 📐 **آلية العمل**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ آلية التشفير الثلاثي XR/XQCXC/XC │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ Map 1: cn (Character Number) │
|
|
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
│ │ "0":"3", "1":"7", "2":"1", "3":"9", "4":"0", │ │
|
|
│ │ "5":"5", "6":"2", "7":"6", "8":"4", "9":"8" │ │
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ Map 2: cs (Character Small) │
|
|
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
│ │ "a":Env.a, "b":Env.b, ... (قيم من الـ Env) │ │
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ Map 3: cC (Character Capital) │
|
|
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
│ │ "A":Env.A, "B":Env.B, ... (قيم من الـ Env) │ │
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ دالة r() (Reveal): │
|
|
│ 1. لكل حرف في النص المشفر → ابحث عن المفتاح في الخريطة │
|
|
│ 2. إذا وجد → استبدل بالقيمة الأصلية │
|
|
│ 3. أزل الـ padding (Bl) │
|
|
│ │
|
|
│ دالة c() (Conceal): │
|
|
│ 1. أضف padding (Bl) للنص الأصلي │
|
|
│ 2. لكل حرف → استبدل بقيمته المشفرة من الخريطة │
|
|
│ │
|
|
│ مثال: │
|
|
│ الأصل: "keyOfApp" → r() + Env.keys + c() │
|
|
│ → "Bl" padding → تشفير بثلاث خرائط → نص مشفر │
|
|
│ → في الـ Env: القيمة الحقيقية للمفاتيح │
|
|
│ → وقت التشغيل: r(Env.keyOfApp).split(Env.addd)[0] │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 📊 **تحليل قوة النظام الأمني**
|
|
|
|
| الجانب | التقييم | الشرح |
|
|
|--------|---------|-------|
|
|
| **مقاومة Reverse Engineering** | 🟡 **متوسطة** | يخفي القيم لكن يمكن تتبعها عبر debugger |
|
|
| **مقاومة Static Analysis** | 🟢 **جيدة** | القيم غير ظاهرة في الـ bytecode |
|
|
| **مقاومة Runtime Manipulation** | 🔴 **ضعيفة** | يمكن قراءة القيم بعد فك التشفير في الذاكرة |
|
|
| **تعقيد فك التشفير يدوياً** | 🟢 **صعب** | ثلاث خرائط استبدال مع padding |
|
|
| **أمان المفتاح الأساسي** | 🟡 **متوسط** | يعتمد على أمان ملف Env نفسه |
|
|
|
|
### ⚠️ **نقاط الضعف في نظام التشفير الثلاثي**
|
|
|
|
1. **Substitution Cipher وليس Encryption حقيقي**
|
|
- هو مجرد استبدال أحرف (mapping) وليس تشفير حقيقي بمفتاح
|
|
- يمكن فكه بسهولة باستخدام frequency analysis إذا كان النص طويلاً
|
|
|
|
2. **القيم موجودة في Env**
|
|
- الـ `Env` كلاس يحتوي على القيم الفعلية
|
|
- إذا تمكن المهاجم من قراءة الـ `Env` أو الـ `.env` → النظام بأكمله منكشف
|
|
|
|
3. **نقطة الضعف في Runtime**
|
|
```dart
|
|
var keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0];
|
|
```
|
|
- في وقت التشغيل، `keyOfApp` موجود كنص واضح في الذاكرة
|
|
- يمكن استخراجه عبر memory dump أو Frida
|
|
|
|
4. **الاعتماد على `split(Env.addd)`**
|
|
- `Env.addd` نفسه مخزن في Env
|
|
- حلقة Möbius من التبعية
|
|
|
|
### 💡 **التقييم العام**
|
|
|
|
> **النظام جيد لإخفاء القيم من الفحص السطحي (layman inspection) ولرفع مستوى التعقيد أمام المهاجم المبتدئ، لكنه ليس بديلاً عن تشفير حقيقي بمفتاح مشفر بشكل آمن (مثل Keychain/Keystore على الأجهزة).**
|
|
|
|
---
|
|
|
|
## تحليل صيغ أرقام الهواتف
|
|
|
|
### 📞 **الدول المدعومة**
|
|
|
|
| الدولة | كود الدولة | الصيغة المستخدمة | مثال |
|
|
|--------|-----------|-----------------|------|
|
|
| **سوريا** | `+963` | `09xxxxxxxx` أو `+9639xxxxxxxx` | `+963944123456` |
|
|
| **الأردن** | `+962` | `07xxxxxxxx` أو `+9627xxxxxxxx` | `+962791234567` |
|
|
| **مصر** | `+20` | `01[0125]xxxxxxxx` (11 رقم) | `+201012345678` |
|
|
|
|
### 🧪 **تحليل كود التحقق من رقم الهاتف المصري**
|
|
|
|
```dart
|
|
bool isValidEgyptianPhoneNumber(String phoneNumber) {
|
|
phoneNumber = phoneNumber.replaceAll(RegExp(r'\D+'), ''); // إزالة غير الأرقام
|
|
if (phoneNumber.length != 11) return false; // التحقق من 11 رقم
|
|
RegExp validPrefixes = RegExp(r'^01[0125]\d{8}$'); // البادئات: 010, 011, 012, 015
|
|
return validPrefixes.hasMatch(phoneNumber);
|
|
}
|
|
```
|
|
|
|
### ⚠️ **مشاكل رصدت في معالجة أرقام الهواتف**
|
|
|
|
| المشكلة | التفصيل | الخطورة |
|
|
|---------|---------|---------|
|
|
| **01. عدم توحيد الصيغة الدولية** | أحياناً يخزن `+2${phone}` وأحياناً `+20${phone}` | 🔴 **عالي** |
|
|
| **02. دالة مصر فقط** | لا يوجد تحقق مماثل للأردن وسوريا | 🔴 **عالي** |
|
|
| **03. تخزين الهاتف** | `box.write(BoxName.phone, ('+2${phoneController.text}'))` - ناقص الـ `0` | 🟡 **متوسط** |
|
|
| **04. إزالة كل non-digit** | تزيل `+` من البداية مما يسبب مشاكل في الصيغة الدولية | 🟡 **متوسط** |
|
|
| **05. عدم التحقق من صيغة سوريا** | الأرقام السورية 9 أرقام تبدأ بـ `09` - لا يوجد تحقق | 🔴 **عالي** |
|
|
| **06. عدم التحقق من صيغة الأردن** | الأرقام الأردنية 10 أرقام تبدأ بـ `07` - لا يوجد تحقق | 🔴 **عالي** |
|
|
|
|
### 🛠️ **الحل المقترح لتوحيد معالجة أرقام الهواتف**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ نظام توحيد أرقام الهواتف المقترح │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ 1. إزالة كل ما عدا الأرقام و + │
|
|
│ 2. تحديد الدولة إما من إدخال المستخدم أو من الكود │
|
|
│ 3. تطبيق التحقق بناءً على الدولة: │
|
|
│ ┌────────────┬──────────┬──────────────────┐ │
|
|
│ │ الدولة │ الكود │ الصيغة │ │
|
|
│ ├────────────┼──────────┼──────────────────┤ │
|
|
│ │ سوريا │ +963 │ ^\+9639\d{8}$ │ │
|
|
│ │ الأردن │ +962 │ ^\+9627\d{8}$ │ │
|
|
│ │ مصر │ +20 │ ^\+201[0125]\d{8}$│ │
|
|
│ └────────────┴──────────┴──────────────────┘ │
|
|
│ │
|
|
│ 4. تخزين الرقم بالصيغة الدولية الكاملة (+963xxxxxxxx) │
|
|
│ 5. إنشاء دالة عامة للتحقق في جميع التطبيقات │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## مراجعة الباك إند
|
|
|
|
### ✅ **نقاط القوة**
|
|
|
|
| المجال | الإجراء المتبع |
|
|
|--------|---------------|
|
|
| **CORS** | مقيد بـ `https://intaleqapp.com` |
|
|
| **Headers أمنية** | `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, `HSTS` |
|
|
| **التشفير** | AES-256-CBC مع مفتاح 32 بايت و IV 16 بايت |
|
|
| **المصادقة** | JWT + Device Fingerprint + HMAC (للدفع) |
|
|
| **Rate Limiting** | Redis-based rate limiter لكل endpoints |
|
|
| **Timing Attack Protection** | تثبيت وقت الاستجابة في login |
|
|
| **Error Logging** | تسجيل مركزي في logs/php_errors.log |
|
|
| **Prepared Statements** | استخدام PDO Prepared Statements (يمنع SQL Injection) |
|
|
| **Strict Types** | `declare(strict_types=1)` |
|
|
|
|
### 🔴 **نقاط الضعف**
|
|
|
|
| النقطة | التفصيل | الخطورة |
|
|
|--------|---------|---------|
|
|
| **01. SSL Pinning غير موجود** | لا يوجد SSL Pinning في أي من التطبيقات | 🔴 **حرج** |
|
|
| **02. عدم التحقق من توقيت OTP** | لا انتهاء صلاحية لرمز OTP بعد فترة | 🔴 **عالي** |
|
|
| **03. الـ .enckey ملف نصي** | المفتاح مخزن كنص في `/home/siro-api/.enckey` | 🔴 **عالي** |
|
|
| **04. Redis بدون Auth** | `$redis->auth($redisPass)` اختياري (if the password exists) | 🟡 **متوسط** |
|
|
| **05. PHP ليس إطار عمل** | كود PHP مكتوب بدون إطار عمل → صيانة أمنية أصعب | 🟡 **متوسط** |
|
|
| **06. دعم الطريقة القديمة Fingerprint** | `$fpVerified = hash_equals($storedFp, $fingerprint)` بدون Pepper | 🟡 **متوسط** |
|
|
| **07. error_reporting في الإنتاج** | `error_reporting(E_ALL)` - ممكن يعرض معلومات حساسة | 🟡 **متوسط** |
|
|
| **08. No CSRF Protection** | لا توجد حماية CSRF (إن كانت الجلسات مستخدمة) | 🟡 **متوسط** |
|
|
| **09. Firebase Configs** | `google-services.json` و `GoogleService-Info.plist` في الكود المصدري | 🟡 **متوسط** |
|
|
| **10. Debug Logging** | ملفات `debug.log`, `error_log` في مجلدات عامة | 🟢 **منخفض** |
|
|
|
|
---
|
|
|
|
## نقاط الضعف المحتملة والمخاطر
|
|
|
|
### 🔴 **مخاطر حرجة (Critical)**
|
|
|
|
| # | الخطر | التفصيل | التأثير |
|
|
|---|-------|---------|---------|
|
|
| 1 | **غياب SSL Pinning** | يمكن اعتراض الاتصالات عبر MITM إذا تم اختراق شهادة CA | سرقة بيانات المستخدمين، JWT، المفاتيح |
|
|
| 2 | **مفتاح التشفير في ملف** | `.enckey` في السيرفر - أي اختراق للسيرفر يعرض كل البيانات | فك تشفير كل قاعدة البيانات |
|
|
| 3 | **تخزين Refresh Token** | في FlutterSecureStorage (آمن نسبياً) لكن الـ JWT في GetStorage | سرقة التوكن → اختراق الحساب |
|
|
| 4 | **عدم توحيد أرقام الهواتف** | خزن أرقام بصيغ مختلفة يؤدي أخطاء في البحث والتحقق | فشل في عمليات الإرسال والتحقق |
|
|
|
|
### 🟡 **مخاطر متوسطة (Medium)**
|
|
|
|
| # | الخطر | التفصيل |
|
|
|---|-------|---------|
|
|
| 5 | **Env في الكود المصدري** | `env/` مجلد يحتوي مفاتيح - حتى لو في `.gitignore` لكن قد ينكشف |
|
|
| 6 | **AndroidManifest.xml** | `android:usesCleartextTraffic` - قد يكون مفعّلاً للتطوير |
|
|
| 7 | **FCM Keys في الكود** | firebase_options.dart يحتوي Project ID و API Keys |
|
|
| 8 | **تأخير OTP Resend** | الكود الحالي لا يطبق فترة التبريد 5 دقائق بشكل صارم |
|
|
| 9 | **تخزين صور المستندات** | رفع صور حساسة للخادم - هل الصور مشفرة في التخزين؟ |
|
|
| 10 | **AI API Keys** | مفاتيح OpenAI, Azure, Llama في الكود - يمكن استغلالها |
|
|
|
|
### 🟢 **مخاطر منخفضة (Low)**
|
|
|
|
| # | الخطر | التفصيل |
|
|
|---|-------|---------|
|
|
| 11 | **ترجمات غير مكتملة** | بعض النصوص بالإنجليزية |
|
|
| 12 | **أحداث غير متوقعة (Edge Cases)** | ماذا لو فشل AI في استخراج البيانات؟ |
|
|
| 13 | **تعدد أسماء التطبيق** | "Siro", "سيرو", "Sefer", "intaleq" → تشتيت |
|
|
|
|
---
|
|
|
|
## التوصيات
|
|
|
|
### 🔴 **1. توصيات أمنية فورية (Critical)**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ خطة التحسين الأمني │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ⬜ [ ] 1. تطبيق SSL Pinning │
|
|
│ ├── Android: TrustManager مخصص مع الشهادة العامة للتطبيق │
|
|
│ ├── iOS: NSURLSession Pinning + ATS policy │
|
|
│ └── Flutter: dio SSL Pinning أو httpClientBadge │
|
|
│ │
|
|
│ ⬜ [ ] 2. تشفير مفتاح .enckey │
|
|
│ ├── استخدام AWS KMS / Azure Key Vault │
|
|
│ └── أو تشفير المفتاح نفسه وتخزين المفتاح الرئيسي في Keystore│
|
|
│ │
|
|
│ ⬜ [ ] 3. توحيد معالجة أرقام الهواتف │
|
|
│ ├── إنشاء دالة unified في crud.dart │
|
|
│ ├── تطبيق التحقق لكل دولة │
|
|
│ └── تخزين بالصيغة الدولية (+963, +962, +20) │
|
|
│ │
|
|
│ ⬜ [ ] 4. انتهاء صلاحية OTP │
|
|
│ ├── 5 دقائق كحد أقصى لصلاحية OTP │
|
|
│ └── حذف OTP من قاعدة البيانات بعد الانتهاء │
|
|
│ │
|
|
│ ⬜ [ ] 5. تحسين تخزين JWT │
|
|
│ ├── نقل JWT إلى FlutterSecureStorage أيضاً │
|
|
│ └── أو تشفير GetStorage box بكلمة مرور التطبيق │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 🟡 **2. توصيات أمنية متوسطة (Medium)**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ │
|
|
│ ⬜ [ ] 6. حماية Firebase Keys │
|
|
│ ├── استخدام Firebase Remote Config للمفاتيح الحساسة │
|
|
│ └── أو إخفاء API Keys عبر Cloud Functions Proxy │
|
|
│ │
|
|
│ ⬜ [ ] 7. تحسين Android Network Security │
|
|
│ ├── network_security_config.xml مع clearTextTraffic=false │
|
|
│ └── certificate_pins لمواقع API │
|
|
│ │
|
|
│ ⬜ [ ] 8. إضافة CSRF Token │
|
|
│ └── لجميع طلبات POST (خاصة في Admin Web) │
|
|
│ │
|
|
│ ⬜ [ ] 9. تحسين الـ Obfuscation │
|
|
│ ├── استخدام Flutter's native obfuscation --obfuscate │
|
|
│ └── plus --split-debug-info │
|
|
│ │
|
|
│ ⬜ [ ] 10. إضافة 2FA (مصادقة ثنائية) │
|
|
│ └── للسائقين لتأمين عملية تسجيل الدخول │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 🟢 **3. توصيات عامة وتحسينية**
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ │
|
|
│ ⬜ [ ] 11. توحيد أسماء التطبيق │
|
|
│ └── "سيرو (Siro)" اسم موحد في كل مكان │
|
|
│ │
|
|
│ ⬜ [ ] 12. إكمال الترجمات الناقصة │
|
|
│ └── فحص شامل لجميع النصوص في واجهات المستخدم │
|
|
│ │
|
|
│ ⬜ [ ] 13. تقارير أخطاء منتظمة │
|
|
│ └── تفعيل Sentry أو Crashlytics مع تقارير أمنية │
|
|
│ │
|
|
│ ⬜ [ ] 14. اختبار اختراق دوري │
|
|
│ └── استخدام OWASP Mobile Top 10 كمرجع │
|
|
│ │
|
|
│ ⬜ [ ] 15. الـ XR نظام التشفير الثلاثي │
|
|
│ └── تحسينه بإضافة Salt متغير لكل جلسة │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 📊 **تقييم نظام التشفير XR/XQCXC/XC**
|
|
|
|
| المعيار | التقييم | التعليق |
|
|
|---------|---------|---------|
|
|
| **منع Reverse Engineering** | 🟡 5/10 | يخفي القيم لكن لا يمنع التحليل الديناميكي |
|
|
| **مقاومة Frida/Hooking** | 🔴 2/10 | يمكن اعتراض القيم بعد فك التشفير في الذاكرة |
|
|
| **مقاومة Static Analysis** | 🟢 7/10 | صعب قراءة القيم من الـ bytecode مباشرة |
|
|
| **سهولة التنفيذ** | 🟢 8/10 | خفيف وسهل وبلا تكلفة إضافية |
|
|
| **أمان حقيقي** | 🔴 3/10 | ليس بديلاً عن تشفير حقيقي بمفتاح من Keychain |
|
|
|
|
> **الخلاصة:** نظام XR هو Obfuscation (إخفاء) وليس Encryption (تشفير). هو إضافة جيدة لإرباك المهاجمين المبتدئين، لكن لا يمكن الاعتماد عليه كطبقة أمنية أساسية. يجب دمجه مع:
|
|
> 1. SSL Pinning لحماية الاتصالات
|
|
> 2. Native Keychain/Keystore للمفاتيح الحقيقية
|
|
> 3. ProGuard/R8/Flutter Obfuscation للكود بأكمله
|
|
|
|
---
|
|
|
|
## الخلاصة النهائية
|
|
|
|
### ✅ **نقاط القوة**
|
|
|
|
1. نظام متكامل متعدد الطبقات (10 طبقات أمنية)
|
|
2. مصادقة قوية عبر JWT + Device Fingerprint + HMAC
|
|
3. حماية من Timing Attacks و Rate Limiting
|
|
4. Prepared Statements تمنع SQL Injection
|
|
5. نظام تشفير AES-256-CBC متين
|
|
6. Obfuscation عبر XR/XQCXC/XC يرفع من تعقيد الاختراق
|
|
7. التحقق من سلامة الجهاز (Root Detection)
|
|
|
|
### ⚠️ **نقاط الضعف الرئيسية**
|
|
|
|
1. **غياب SSL Pinning** - أخطر نقطة ضعف
|
|
2. **مفتاح التشفير في ملف** - نقطة فشل واحدة
|
|
3. **عدم توحيد أرقام الهواتف** - مشكلة في البيانات
|
|
4. **OTP بدون انتهاء صلاحية فعال** - ثغرة
|
|
5. **بعض الترجمات غير مكتملة** - تجربة مستخدم غير متسقة
|
|
|
|
### 🎯 **الخطوات التالية المقترحة**
|
|
|
|
1. تطبيق SSL Pinning فوراً
|
|
2. توحيد معالجة أرقام الهواتف
|
|
3. تشفير مفتاح `.enckey` في السيرفر
|
|
4. نقل المفاتيح الحساسة من Flutter إلى Firebase Remote Config
|
|
5. اختبار اختراق شامل للتطبيقين
|
|
6. توحيد المصطلحات في الترجمات
|
|
|
|
---
|
|
|
|
**تم إعداد هذا التقرير بواسطة: Cline AI Security Analysis**
|
|
**لتطبيق: سيرو (Siro) - Ride Hailing Application**
|
|
**التاريخ: 12 يونيو 2026**
|
|
|
|
</div> |