I'm always excited to take on new projects and collaborate with innovative minds.

Phone

+20 115 052 9992

Website

https://ibrahimahmed.online/

Social Links

تمرير البيانات الحساسة بأمان من Laravel إلى Inertia بدون كشفها للجميع

يا هلا بيك يا بشمهندس في مقال تقني جديد من سلسلة الشروحات اللي بتهم كل مطور ويب شغال بلغة PHP وفريم وورك Laravel مع Vue أو React عن طريق Inertia.js. تعال نتخيل

تمرير البيانات الحساسة بأمان من Laravel إلى Inertia بدون كشفها للجميع
Reading Count: 5

يا هلا بيك يا بشمهندس في مقال تقني جديد من سلسلة الشروحات اللي بتهم كل مطور ويب شغال بلغة PHP وفريم وورك Laravel مع Vue أو React عن طريق Inertia.js. تعال نتخيل السيناريو ده مع بعض: قاعد بتكتب الكود وروقان الدنيا معاك، وكتبت return Inertia::render('Profile/Edit', ['user' => $user]); والدنيا اشتغلت وزي الفل والبيانات ظهرت قدامك على الشاشة في الواجهة الأمامية (Front-end). بس استنى هنا.. هل فكرت لحظة إيه اللي اتبعت فعلاً في الـ Response للـ Browser؟

المشكلة الكبيرة إن الـ Model بتاع المستخدم (User Model) غالباً بيكون جواه حاجات حساسة جداً زي الـ password المشفر، الـ remember_token، يمكن كمان أعمدة تانية تخص صلاحيات أو فلوس زي stripe_id أو is_admin. لو رجعت الـ Model كامل، فكل البيانات دي بقت مرئية لأي شخص يدخل على الـ DevTools في المتصفح ويبص على الـ Props. دي ثغرة أمنية (Security Vulnerability) كارثية، وتعال النهاردة نعرف إزاي نقفلها بصرامة ونمرر البيانات اللي محتاجينها وبس.

إيه هي المشكلة وليه بنقع فيها؟ (The Problem with Mass Assignment & Full Models)

كتير من المطورين المبتدئين وحتى المتوسطين، بيتعاملوا مع لارافيل (Laravel) كأنها ساحرة بتعمل كل حاجة لوحدها. لما بتكتب User::all() أو تاخد الـ Instance وتبعته دايركت لـ Inertia، لارافيل بتعمله Serializing لتحويله لـ JSON. المشكلة إن الافتراضي في الـ Eloquent Models إنه بيسيب كل الأعمدة تظهر إلا لو أنت عملت لها حجب باستخدام خاصية $hidden جوه الموديل.

لكن الاعتماد الكلي على $hidden جوه الموديل مش دايماً حل كافي أو مرن. ممكن في صفحة معينة (زي لوحة التحكم - Admin Panel) تكون محتاج تشوف كل الأعمدة، لكن في صفحة الملف الشخصي العادية (Profile Page) مش محتاج غير الاسم والـ Email وصورة البروفايل بس. هنا بيجي دور التحكم الدقيق في البيانات الممررة (Data Transfer Objects / Explicit Selection).

الطريقة الأولى: استخدام الـ Accessors والموديل (Using Model Hidden & Appends)

أبسط طريقة عشان تحمي بياناتك هي إنك تدخل جوه الـ Model بتاعك وتحدد إيه اللي يختفي تماماً من على الوش. بنستخدم مصفوفة $hidden عشان نخفي الحقول الحساسة زي الباسورد ورموز إعادة تعيين كلمة المرور:


namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $hidden = [
        'password',
        'remember_token',
        'two_factor_secret',
    ];
}

بس خد بالك: الطريقة دي بتحجب الحقول دي عن كل الـ application، وده كويس للأمان، بس أحياناً بتحتاج تتحكم في الشكل اللي هتروح بيه البيانات للـ Front-end بالتحديد.

الطريقة التانية: التحديد الصارم باستخدام الـ Select والـ Map (Strict Data Selection)

عشان نكون محترفين وأماننا حديد، الأفضل دايماً إننا ما نبعتش الـ Model ككل أبداً لـ Inertia. الحل الصح هو إننا نعمل Query محددة, وناخد الحقول اللي طالبينها بس، أو نستخدم الـ API Resources.

تعال نشوف مثال عملي جوه الـ Controller:


use App\Models\User;
use Inertia\Inertia;

public function edit(User $user)
{
    // بنختار أعمدة معينة بس وبنحولها لـ Array
    $userData = $user->only([
        'id',
        'name',
        'email',
        'avatar',
        'created_at'
    ]);

    return Inertia::render('Profile/Edit', [
        'user' => $userData
    ]);
}

بالطريقة دي، استحالة أي بيانات تانية تخرج برا السيرفر. حتى لو أضفت أعمدة جديدة حساسة في المستقبل على الجدول زي is_super_admin أو wallet_balance، مش هتظهر للـ Front-end بالخطأ لأننا بنحدد بالاسم إيه اللي يخرج (Whitelist approach) مش إيه اللي يختفي (Blacklist approach).

الطريقة التالثة: استخدام الـ API Resources (Laravel API Resources)

لو المشروع كبير وفيه بيانات كتير متشعبة، أفضل تصميم هندسي (Architecture) ممكن تتبعه هو استخدام الـ API Resources. دي بتعملك طبقة عزل كاملة بين قاعدة البيانات والـ Response اللي طالع لـ Inertia.

أولاً بتعمل الـ Resource:


php artisan make:resource UserResource

وتكتب جواها الشكل اللي المفروض تطلع بيه البيانات:


namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'profile_photo_url' => $this->profile_photo_url,
            // بنتحكم في ظهور البيانات بناء على الصلاحيات مثلاً
            'is_admin' => $this->when($request->user()->isAdmin(), $this->is_admin),
        ];
    }
}
}

وفي الـ Controller بتستدعيها بكل سهولة كده:


use App\Http\Resources\UserResource;

public function show(User $user)
{
    return Inertia::render('Profile/Show', [
        'user' => new UserResource($user)
    ]);
}

الميزة هنا رهيبة؛ لأنك تقدر تستخدم الدوال الشرعية زي when عشان تظهر حقول معينة لمستخدمين معينين وتخفيها عن الباقيين، وكده ضمنت أمان تام بنسبة 100%.

خاتمة ونصيحة من أخ

الأمان مش مجرد كلمة بنحطها في السيرة الذاتية، الأمان تفاصيل صغيرة وغلطة واحدة فيها ممكن تعرض بيانات المستخدمين للخطر وتدمر سمعة التطبيق اللي شغال عليه. متستصغرش أبداً إرسال بيانات زيادة للـ Front-end بحجة "محدش هياخد باله من الـ DevTools"، لأن الهاكرز أول حاجة بيعملوها هي فتح الـ Network Tab وبص على الـ JSON Responses.

عوّد نفسك دايماً تطبق مبدأ أقل صلاحية (Principle of Least Privilege)، ابعت بس اللي الـ Component محتاجه على قد الشاشة، ولا زيادة حرف. بالتوفيق يا بشمهندس، واشوفك في مقال تقني جديد!


Share

Related posts

Aug 08, 2026 • 2 min read
Reading Count: 11
إدارة الـ WebSockets واستقبال الـ Events اللحظية داخل مكونات Inertia
Aug 07, 2026 • 2 min read
Reading Count: 4
إدارة الـ WebSockets واستقبال الـ Events اللحظية داخل مكونات Inertia: ودع الـ Reload للأبد

التصنيف: تطوير الويب (Web Development) - شروحات تقنية (Tutorials) إدارة الـ WebSockets واستقبال الـ...

Aug 07, 2026 • 2 min read
Reading Count: 8
ازاي تطبق المصادقة الثنائية Two-Factor Authentication (2FA) مع انيرشيا Inertia.js بسهولة؟

ازاي تطبق المصادقة الثنائية Two-Factor Authentication (2FA) مع انيرشيا Inertia.js بسهولة؟ يا هلا بيك...