43 KiB
التقرير الأمني والفني الشامل لتطبيق سيرو (Siro)
تاريخ التقرير: 12 يونيو 2026
النسخة: v1.0
الغرض: مراجعة شاملة للبنية الأمنية، الترجمة، تدفق التسجيل، ومعالجة البيانات
📋 فهرس المحتويات
- نظرة عامة على النظام
- تحليل رحلة المستخدم الكاملة
- تحقيق شامل في ملفات الترجمات (Localization)
- تحليل طبقات الأمان (Security Architecture)
- تحليل نظام التشفير الثلاثي (XR, XQCXC, XC)
- تحليل صيغ أرقام الهواتف والفورمات
- مراجعة الـ Backend والأمان
- نقاط الضعف المحتملة والمخاطر
- التوصيات والتحسينات المقترحة
نظرة عامة على النظام
المكونات الرئيسية
| المكون | التقنية | الدور |
|---|---|---|
| تطبيق الراكب (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
⚠️ مشاكل تم رصدها في الترجمات
// 1. مفاتيح غير مترجمة (بقيت بالإنجليزية)
"Siro123" → "Siro123" // لم تُترجم
"1999" → "1999" // أرقام غير مترجمة (مقبولة)
"27\\" → "27\\" // escape sequence غير مكتملة
// 2. تداخل في الأسماء
"appName" → "Siro" و "سيرو" و "Sefer" و "intaleq" // أسماء متعددة للتطبيق
// 3. مفاتيح بدون معنى واضح
"\$error" → "صار خطأ" // مفتاح من $ رمز
"\${AppInformation.appName} Wallet" → "محفظة \${AppInformation.appName}"
// 4. ترجمات حرفية غير دقيقة
"Lady 👩" → "سائقة بنات 👩" // مقبولة سياقياً
"Mashwari" → "مشاري" // كلمات محلية
🔴 مشكلة حرجة: بقاء نصوص إنجليزية بدون ترجمة
بعد فحص دقيق، تم رصد أن بعض النصوص في واجهات المستخدم تستخدم مباشرة نصوصاً إنجليزية دون المرور بملف الترجمة:
// في واجهات المستخدم - بعضها يستخدم النص الإنجليزي مباشرة
'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 نفسه |
⚠️ نقاط الضعف في نظام التشفير الثلاثي
-
Substitution Cipher وليس Encryption حقيقي
- هو مجرد استبدال أحرف (mapping) وليس تشفير حقيقي بمفتاح
- يمكن فكه بسهولة باستخدام frequency analysis إذا كان النص طويلاً
-
القيم موجودة في Env
- الـ
Envكلاس يحتوي على القيم الفعلية - إذا تمكن المهاجم من قراءة الـ
Envأو الـ.env→ النظام بأكمله منكشف
- الـ
-
نقطة الضعف في Runtime
var keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0];- في وقت التشغيل،
keyOfAppموجود كنص واضح في الذاكرة - يمكن استخراجه عبر memory dump أو Frida
- في وقت التشغيل،
-
الاعتماد على
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 |
🧪 تحليل كود التحقق من رقم الهاتف المصري
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 (تشفير). هو إضافة جيدة لإرباك المهاجمين المبتدئين، لكن لا يمكن الاعتماد عليه كطبقة أمنية أساسية. يجب دمجه مع:
- SSL Pinning لحماية الاتصالات
- Native Keychain/Keystore للمفاتيح الحقيقية
- ProGuard/R8/Flutter Obfuscation للكود بأكمله
الخلاصة النهائية
✅ نقاط القوة
- نظام متكامل متعدد الطبقات (10 طبقات أمنية)
- مصادقة قوية عبر JWT + Device Fingerprint + HMAC
- حماية من Timing Attacks و Rate Limiting
- Prepared Statements تمنع SQL Injection
- نظام تشفير AES-256-CBC متين
- Obfuscation عبر XR/XQCXC/XC يرفع من تعقيد الاختراق
- التحقق من سلامة الجهاز (Root Detection)
⚠️ نقاط الضعف الرئيسية
- غياب SSL Pinning - أخطر نقطة ضعف
- مفتاح التشفير في ملف - نقطة فشل واحدة
- عدم توحيد أرقام الهواتف - مشكلة في البيانات
- OTP بدون انتهاء صلاحية فعال - ثغرة
- بعض الترجمات غير مكتملة - تجربة مستخدم غير متسقة
🎯 الخطوات التالية المقترحة
- تطبيق SSL Pinning فوراً
- توحيد معالجة أرقام الهواتف
- تشفير مفتاح
.enckeyفي السيرفر - نقل المفاتيح الحساسة من Flutter إلى Firebase Remote Config
- اختبار اختراق شامل للتطبيقين
- توحيد المصطلحات في الترجمات
تم إعداد هذا التقرير بواسطة: Cline AI Security Analysis
لتطبيق: سيرو (Siro) - Ride Hailing Application
التاريخ: 12 يونيو 2026