laravel-at/laravel-image-sanitize
Laravel package to sanitize images on upload by stripping EXIF/metadata, normalizing orientation, and re-encoding to safer formats. Helps reduce privacy leaks and potential payloads while keeping image quality and integrating cleanly with Laravel apps.
Request::file(), Storage::put()) and validation pipelines, making it a natural fit for applications with user uploads (e.g., avatars, profile images, media galleries).validate() rules, file extensions whitelisting) by adding runtime sanitization, reducing reliance on static checks alone.app/Http/Middleware/SanitizeUploads.php).validate('image', 'sanitized')).sanitize-after-upload job) if real-time processing isn’t critical.exif_imread()/getimagesize() or Imagick. Ensure these are enabled in php.ini (e.g., extension=gd, extension=imagick).Illuminate\Http\Request, Illuminate\Support\Facades\Storage, or Laravel\Fortify/Jetstream for authentication.validate('image', 'mimes:jpeg,png|sanitized').Kernel.php.uploading/uploaded events for custom logic..jpg, .svg).mimes:, max:).// app/Http/Middleware/SanitizeUploads.php
public function handle(Request $request, Closure $next) {
if ($request->hasFile('image')) {
$sanitizer = new \At\ImageSanitize\Sanitizer();
$sanitizer->sanitize($request->file('image'));
}
return $next($request);
}
Kernel.php:
protected $middleware = [
// ...
\App\Http\Middleware\SanitizeUploads::class,
];
// app/Jobs/SanitizeUploadJob.php
public function handle() {
$file = Storage::path($this->path);
$sanitizer = new \At\ImageSanitize\Sanitizer();
$sanitizer->sanitize($file);
}
config/imagesanitize.php):
'allowed_extensions' => ['jpg', 'png', 'gif', 'webp'],
'scan_metadata' => true,
'max_file_size' => '10MB',
gd or imagick (for image parsing).exif (for metadata scanning).php -m | grep -E 'gd|imagick|exif'.Storage::disk('s3')->put() to ensure temporary files are handled.validate() to reject invalid file types early (reduces sanitization load).$request->validate([
'image' => 'required|file|mimes:jpeg,png|max:10240|sanitized',
]);
config/imagesanitize.php for updates (e.g., new attack vectors). Subscribe to the package’s changelog.composer why-not to track dependencies.svg with custom whitelists) via service provider bindings.\Log::info('Image sanitization', [
'path' => $file->path(),
'status' => 'blocked',
'reason' => $sanitizer->getLastError(),
]);
debugbar or laravel-logger for runtime insights.sanitize-after-upload job).memory_get_usage().How can I help you explore Laravel packages today?