У меня есть таблица с именем gym_sessions у нее есть user_id | Статус < /strong> столбцы.
CATST CULEN CAN CAN: 1 ==> Active; 2 ==> завершено; 3 ==> отклонено;
Условия: < /strong> < /p>
У пользователя должен быть достаточный баланс, чтобы запустить новый сеанс. 3; < /li>
< /ul>
Это мой метод создания нового сеанса для пользователя: < /p>
// Start new gym session.
public function startGymSession(Request $request){
$validator = Validator::make($request->all(),[
'gym_id' => ['required', 'exists:gyms,id'],
'payment_method_id' => ['required', 'exists:payment_methods,id'],
'gym_pricing_id' => ['required',
Rule::exists('gym_pricings', 'id')->where(function ($query) use ($request) {
$query->where('gym_id', $request->input('gym_id'));
}),
],
]);
if($validator->fails()){
return $this->sendError('Validation error!');
}
$user = Auth::user();
// Check if the user have enough balance to start a gym session.
$userbalance = $user->wallet_balance;
$gymPricing = GymPricing::find($request->gym_pricing_id)->first();
if($userbalance < $gymPricing->price){
return $this->sendError('Insufficient balance.');
}
// Check if the user have active gym sessions.
// If the user have active gym sessions, he can't start a new one.
// Prevent race condition.
/** @var \App\Models\User $user */
if($user->gymSessions()->where('status', 1)->count() > 0){
return $this->sendError('You have an active gym session.');
}
$now = Carbon::now();
// Start the gym session.
$gymSession = GymSession::create([
'user_id' => $user->id,
'gym_id' => $request->gym_id,
'payment_method_id' => $request->payment_method_id,
'gym_pricing_id' => $request->gym_pricing_id,
'entry_time' => $now,
]);
if($gymSession){
return $this->sendResponse([], 'Gym session started.');
}
return $this->sendError('Failed to start gym session.');
}
< /code>
Сценарий атаки: < /strong> (условие гонки)
Если пользователь отправил несколько запросов параллельно, система создаст множество сеансов со статусом 1. < /p>
Я хочу знать, как предотвратить эту проблему на уровне применения (с использованием ларавелей). />
laravel 11
mysql
php 8.2.8 < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... laravel-11