Eloquent і конструктор запитів передають значення окремо від SQL - прив'язками параметрів (prepared statements). База отримує WHERE email = ? і значення поруч, тож введення користувача ніколи не стає частиною команди.
User::where('email', $request->email)->first(); // безпечно
Де захист перестає працювати:
- Сирі методи з підставленим значенням:
User::whereRaw("email = '{$request->email}'")->first(); // ін'єкція
User::whereRaw('email = ?', [$request->email])->first(); // безпечно
Те саме для selectRaw, orderByRaw, DB::statement(), DB::raw().
- Назви колонок з введення. PDO не прив'язує назви колонок:
Post::orderBy($request->input('sort'))->get(); // небезпечно
Колонку беруть зі списку дозволених:
$sort = in_array($request->sort, ['title', 'created_at'], true) ? $request->sort : 'created_at';
- Ключі масиву в
update()з$request->all()- це вже масове присвоєння, від якого захищають$fillableіvalidated().
Правило: усе, що прийшло від користувача, - тільки значеннями через прив'язки, ніколи не частиною SQL.