Laravel Model-এ Mass Assignment থেকে সুরক্ষার দুটি পদ্ধতি — সম্পূর্ণ গাইড বাংলায়
সমস্যা: User যদি request-এ extra field পাঠায় (যেমন is_admin=true), আর আমরা create($request→all()) করি — তাহলে সেই field-ও database-এ চলে যাবে। এটাকেই Mass Assignment Vulnerability বলে।
শুধু যেগুলো দেব, সেগুলোই allow — বাকি সব block
যেগুলো দেব না, শুধু সেগুলো block — বাকি সব allow
| বিষয় | $fillable ✅ | $guarded 🛡️ |
|---|---|---|
| কাজের ধরন | Whitelist — অনুমতি দাও | Blacklist — বাধা দাও |
| নিরাপত্তা স্তর | বেশি নিরাপদ | কম নিরাপদ |
| নতুন Column যোগে | Manually add → controlled | Auto allow → risky |
| Code পরিমাণ | বেশি field = বেশি লিখতে হয় | কম field block = কম লেখা |
| Laravel best practice | ✅ Recommended | ⚠️ সতর্কতার সাথে |
| একসাথে ব্যবহার | ❌ একসাথে ব্যবহার করবেন না — conflict হয় | |
User, Post, Comment — যেখানে public input আসে এবং specific field control দরকার
Payment, Role, Permission model — যেখানে একটি extra field বিপদজনক হতে পারে
Admin panel বা internal seeder যেখানে controlled trusted input আসে
Seeder বা migration-এ সব field fill করার দরকার হলে, কিন্তু production-এ নয়
Production app-এ guard পুরো খালি রাখা বিপজ্জনক — সব field exposed থাকে
একই model-এ fillable ও guarded একসাথে দেবেন না — Laravel conflict handle করে কিন্তু confusing
created_at ও updated_at fillable-এ না রাখলেও চলবে — Laravel নিজেই manage করে।
// fillable-এ দরকার নেই
'created_at', 'updated_at'
Empty array মানে কোনো field block হবে না — সব field mass-assignable।
protected $guarded = [];
// ⚠️ সব field exposed!
forceFill() fillable/guarded দুটোই bypass করে। Trusted internal code-এ ব্যবহার করুন।
$user->forceFill([
'is_admin' => true
])->save();
Model::unguard() দিয়ে সাময়িক protection বন্ধ করা যায়। Seeder-এ উপকারী।
Model::unguard();
// ... seeding ...
Model::reguard();
FormRequest দিয়ে validate করার পর validated() দিয়ে create করলে double protection।
User::create(
$request->validated()
);
all() দিলে user-এর পাঠানো সব field যায় — extra data আসে।
// ⚠️ বিপজ্জনক
User::create($request->all());
// ✅ নিরাপদ
User::create($request->validated());
Best Practice: সবসময় $fillable + $request→validated() একসাথে ব্যবহার করুন। FormRequest validation নিশ্চিত করে শুধু valid data আসছে, আর fillable নিশ্চিত করে শুধু allowed field database-এ যাচ্ছে। দুটো মিলে double protection।
পরিস্থিতি বুঝে সঠিক পদ্ধতি বেছে নিন
| Scenario | পরামর্শ | কারণ |
|---|---|---|
| User registration form | $fillable | Public input — attacker field inject করতে পারে |
| Admin থেকে user update | $guarded | Trusted admin panel, controlled input |
| Database seeder | $guarded = [] | একবারের কাজ, trusted data |
| Payment model | $fillable | Extra field = বড় বিপদ |
| Blog post create | $fillable | Public form থেকে আসছে |
| Internal API (trusted service) | $guarded | Source verified, attack risk কম |
| Permission/Role model | $fillable | Extra field = privilege escalation risk |
fillable/guarded দুটোই উপেক্ষা করে। শুধু trusted internal code-এ ব্যবহার করুন।
$user->forceFill(['is_admin' => true])->save();
// fillable-এ না থাকলেও কাজ করবে
পুরো Model-এর protection সাময়িক বন্ধ করা যায়। Seeder-এ কাজে লাগে।
Model::unguard(); // protection off
// bulk seeding এখানে
Model::reguard(); // protection back on
কোনো field allowed কিনা programmatically check করতে পারেন।
$user->isFillable('name'); // true
$user->isFillable('is_admin'); // false
$user->isGuarded('id'); // true
সবচেয়ে নিরাপদ — validation + fillable একসাথে।
// FormRequest-এ validate করুন
// তারপর validated() দিয়ে create
User::create($request->validated());
// fillable = 2nd safety net
চূড়ান্ত পরামর্শ: নতুন Laravel project-এ সবসময় $fillable দিয়ে শুরু করুন। এটা আপনাকে explicit হতে বাধ্য করে — কোন field allow তা clearly দেখা যায়। ভবিষ্যতে নতুন column যোগ হলেও automatically exposed হয় না। $guarded শুধু সেখানে ব্যবহার করুন যেখানে আপনি data source-কে ১০০% trust করেন।