Debug School

rakesh kumar
rakesh kumar

Posted on

Tips for code optimization,performance and security issue in laravel

Route-Related Issues
SQL Query Issues
Avoiding SQL Injection and Validating Dynamic Parameters

Route-Related Issues

Security Risks

:

Unvalidated Dynamic Parameters:
Routes like /getbookings/{vehicleId} and /api/vehicles/{user_id} use dynamic parameters without validation, risking SQL/NoSQL injection or IDOR attacks.

Insecure HTTP Methods:
The addvehical route uses POST, but other routes (e.g., edit_post_submit) might use GET for data modification, exposing CSRF vulnerabilities.

Performance Issues:

Lack of Rate Limiting:
No throttling on API routes like /api/vehicles, risking DDoS attacks or excessive resource usage.

SQL Query Issues

Security Risks:

SQL Injection via DB::raw():
Raw SQL snippets like DB::raw('MAX(addvechicles.vender_ID)') expose vulnerabilities if user inputs are not escaped.

Improper Grouping:
Aggregates (MAX()) with groupBy without proper indexing can cause incorrect results or performance issues.

Performance Bottlenecks:

Unoptimized Joins:
Multiple leftJoin operations on large tables (bookings, shops) without indexes degrade performance.

Redundant Data Fetching:
Selecting all columns (e.g., DB::raw('MAX(shops.latitude)')) increases memory usage.

Solutions

Route Fixes
Parameter Validation:
Use route model binding or regex constraints:

php

Route::get('/getbookings/{vehicleId}', ...)->where('vehicleId', '[0-9]+');
Enter fullscreen mode Exit fullscreen mode

HTTP Method Correction:
Use POST/PUT for data-modifying actions:

Route::post('/edit_post_submit', ...);
Enter fullscreen mode Exit fullscreen mode

Rate Limiting:
Add throttling middleware:

Route::middleware('throttle:60,1')->group(...);
Enter fullscreen mode Exit fullscreen mode

SQL Fixes
Replace DB::raw() with Eloquent:
Use selectRaw with parameter binding:

->selectRaw('MAX(addvechicles.vender_ID) as vender_ID')
Enter fullscreen mode Exit fullscreen mode

Add Indexes:
Index columns used in WHERE, JOIN, and GROUP BY:

$table->index(['vender_ID', 'shop_id']);
Enter fullscreen mode Exit fullscreen mode

Optimize Joins:
Replace leftJoin with innerJoin where possible and use select():

->select('addvechicles.id', 'shops.partner_name')
Enter fullscreen mode Exit fullscreen mode

Paginate Results:
Avoid fetching all rows at once:

->paginate(10);
Enter fullscreen mode Exit fullscreen mode

Key Recommendations
Security: Validate all inputs, escape raw SQL, and use Laravel’s built-in CSRF protection.

Performance: Add database indexes, limit fetched columns, and avoid N+1 queries with with().

Tools: Use Laravel Debugbar to identify slow queries and Laravel Telescope for request monitoring

Avoiding SQL Injection and Validating Dynamic Parameters

To mitigate SQL injection risks and validate dynamic parameters in routes like /getbookings/{vehicleId} and /api/vehicles/{user_id}, follow the strategies below. These include examples tailored to your Laravel application.

Validate Route Parameters
Example: Validate vehicleId in /getbookings/{vehicleId}
Use Laravel's route constraints to ensure vehicleId is numeric:

Route::get('/getbookings/{vehicleId}', [BookingController::class, 'getBookings'])
    ->where('vehicleId', '[0-9]+')
    ->name('getbookings');
Enter fullscreen mode Exit fullscreen mode

Alternatively, use route model binding for automatic validation:

Route::get('/getbookings/{vehicle}', [BookingController::class, 'getBookings'])
    ->name('getbookings');
Enter fullscreen mode Exit fullscreen mode

In the BookingController, type-hint the model:

public function getBookings(addvechicles $vehicle)
{
    // The $vehicle object is automatically resolved and validated
    return response()->json($vehicle);
}
Enter fullscreen mode Exit fullscreen mode
  1. Sanitize Input in Controllers Always sanitize and validate incoming request data using Laravel's Request validation.

Example: Validate user_id in /api/vehicles/{user_id}
Update the route to pass user_id as a query parameter:

Route::get('/api/vehicles', [uploadvechiclecontroller::class, 'vechilelistofpartner']);
Enter fullscreen mode Exit fullscreen mode

In the controller, validate user_id:

public function vechilelistofpartner(Request $request)
{
    $validated = $request->validate([
        'user_id' => 'required|integer|exists:users,id',
    ]);

    $vehicles = addvechicles::where('vender_ID', $validated['user_id'])->get();
    return response()->json($vehicles);
}
Enter fullscreen mode Exit fullscreen mode
  1. Use Parameter Binding for Secure Queries Avoid raw SQL queries. Use Eloquent or query builder methods with parameter binding.

Example: Avoid Raw SQL
Vulnerable Code:

$vehicles = DB::select("SELECT * FROM addvechicles WHERE vender_ID = {$user_id}");
Enter fullscreen mode Exit fullscreen mode

Secure Code:

$vehicles = DB::table('addvechicles')
    ->where('vender_ID', $user_id)
    ->get();
Enter fullscreen mode Exit fullscreen mode

Or use Eloquent:

$vehicles = addvechicles::where('vender_ID', $user_id)->get();
Enter fullscreen mode Exit fullscreen mode
  1. Use Prepared Statements for Raw Queries If raw queries are unavoidable, use parameterized queries to prevent SQL injection.
$vehicles = DB::select("SELECT * FROM addvechicles WHERE vender_ID = ?", [$user_id]);
Enter fullscreen mode Exit fullscreen mode
  1. Limit Data Exposure Always select only the required columns to minimize sensitive data exposure.
$vehicles = addvechicles::select('id', 'brand', 'model', 'price')
    ->where('vender_ID', $user_id)
    ->get();
Enter fullscreen mode Exit fullscreen mode
  1. Add Middleware for Authorization Ensure users can only access their own data by using middleware.

Example: Middleware for Authorization
Create a middleware:

php artisan make:middleware CheckUserOwnership
Enter fullscreen mode Exit fullscreen mode

In CheckUserOwnership.php:

public function handle($request, Closure $next)
{
    $userId = $request->route('user_id');

    if (Auth::id() !== (int) $userId) {
        abort(403, 'Unauthorized action.');
    }

    return $next($request);
}
Enter fullscreen mode Exit fullscreen mode

Apply the middleware to your route:

Route::get('/api/vehicles/{user_id}', [uploadvechiclecontroller::class, 'vechilelistofpartner'])
    ->middleware('auth', 'check.user.ownership');
Enter fullscreen mode Exit fullscreen mode
  1. Use CSRF Protection Ensure all forms and state-changing requests (e.g., POST, PUT, DELETE) include CSRF tokens.

Example: Add CSRF Token in Forms
In Blade templates:

<form method="POST" action="/addvehical">
    @csrf
    <input type="text" name="vechicle" />
    <button type="submit">Submit</button>
</form>
Enter fullscreen mode Exit fullscreen mode
  1. Enable Query Logging for Debugging Enable query logging during development to identify potential vulnerabilities.
DB::enableQueryLog();
Log::info(DB::getQueryLog());
Enter fullscreen mode Exit fullscreen mode
  1. Rate Limiting on Sensitive Routes Add rate limiting to protect against brute force attacks.
Route::middleware('throttle:60,1')->group(function () {
    Route::get('/api/vehicles/{user_id}', [uploadvechiclecontroller::class, 'vechilelistofpartner']);
});
Enter fullscreen mode Exit fullscreen mode
  1. Use Laravel Policies for Fine-Grained Authorization Create policies to control access to resources.
php artisan make:policy VehiclePolicy
Enter fullscreen mode Exit fullscreen mode

In VehiclePolicy.php:

public function view(User $user, addvechicles $vehicle)
{
    return $user->id === $vehicle->vender_ID;
}
Enter fullscreen mode Exit fullscreen mode

Apply the policy in the controller:

Top comments (0)