Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Laravel’de Görüntü Yüklemelerini Temizleme: Resim Dosyaları Üzerinden PHP Yük Enjeksiyonunu Engelleme
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Laravel’de Görüntü Yüklemelerini Temizleme: Resim Dosyaları Üzerinden PHP Yük Enjeksiyonunu Engelleme

Yazılım

Laravel’de Görüntü Yüklemelerini Temizleme: Resim Dosyaları Üzerinden PHP Yük Enjeksiyonunu Engelleme

teknomers
Son güncelleme: 2 Temmuz 2026 16:10
teknomers
Paylaş
Paylaş



Özet

Görüntü yüklemeleri sadece resim değildir. Bir JPEG, EXIF yorumlarında bir PHP web shell taşıyabilir ve MIME kontrollerini, uzantı kontrollerini ve hatta getimagesize() kontrolünü geçebilir. Eğer bu dosya bir şekilde çalıştırılabilir bir yere ulaşırsa – yanlış yapılandırılmış bir public/uploads, bir .htaccess ayarı, birbirine bağlı LFI – uzaktan kod çalıştırmanız mümkün olabilir.

laravel-at/laravel-image-sanitize, yüklenen görüntülerde yük işaretlerini (, phar) tarayan küçük bir middleware'dir ve şüpheli olan her şeyi Intervention Image aracılığıyla yeniden kodlar, yükleme sürecinde kontrolcünüz dosyayı görmeden önce yük işaretlerini temizler.

composer require laravel-at/laravel-image-sanitize
Fullscreen moduna geç
Fullscreen modundan çık

Bu, doğrulamanın bir yerine geçmez. Yine de neden buna ihtiyacınız olduğunu ve nasıl çalıştığını açıklayalım.



Sorun: sadece görüntü olmayan görüntüler

Geçerli bir görüntü dosyası, bilinen bir başlığın doğal verileridir. O başlığın sonuna keyfi metin eklemenizi engelleyen bir şey yoktur. Görüntü yine de tarayıcıda düzgün render edilir - görüntü kod çözücüler sonraki gereksiz verileri dikkate almaz.

Bu, "GIFAR" / poliglot numarasının klasik örneğidir, 2026'da hâlâ geçerlidir:

exiftool -Comment='' shell.jpg
Fullscreen moduna geç
Fullscreen modundan çık

Bu dosya:

  • Gerçek bir JPEG başlığı vardır. file shell.jpg JPEG image data der.

  • getimagesize() kontrolünü geçer. PHP başlığı okur, yorumu değil.

  • $request->file('avatar')->isValid() ve 'image' doğrulama kurallarını geçer.

  • etiketlerinde normal olarak render edilir.

  • EXIF verilerinde çalışan bir PHP yükü içerir.

Eğer bir saldırgan bu dosyayı bir .php uzantısıyla ulaşılabilir bir yere yazdırabilirse - ayrı bir yol geçiş açığı, yanlış yapılandırılmış bir yeniden adlandırma veya .jpg.php dosyasını çalıştıran bir sunucu aracılığıyla - kod çalıştırma elde edebilir. Birçok gerçek dünyadaki ihlal, tam olarak bu: "ilişiksiz" bir yükleme hatası ve esnek bir depolama yolu.



Neden MIME ve uzantı kontrolleri yeterli değil

Laravel standart doğrulaması:

$request->validate([
    'avatar' => 'required|image|mimes:jpg,png,gif|max:2048',
]);
Fullscreen moduna geç
Fullscreen modundan çık

Bu kapsayıcıyı değil, içeriği kontrol eder. mimes: dosya uzantısına ve bir büyücü byte kontrolüne bakar. image ise bir resim olarak kod çözüldüğünü doğrular. Hiçbiri, geçerli görüntü verisi ile birlikte dosya içinde başka nelerin olduğunu incelemez.

MIME sniffing, "Bu teknik olarak bir görüntü mü?" sorusunu sorar. "Bu görüntü gömülü kod içermiyor mu?" şeklinde bir soruya yanıt vermez. Bu iki farklı sorudur ve çoğu yükleme akışı yalnızca birincisini sorar.



Çözüm: tespit et ve yeniden kodla

laravel-image-sanitize, ikinci soruyu soran bir katman ekler. Akış dört adımdan oluşur:

  1. MIME türü ile filtrele. Middleware, yalnızca izin verilen dosyaları (geçerli olarak varsayılan olarak JPEG, PNG, GIF, BMP, WebP) denetler.

  2. Yük işaretlerini tarayın. Dosya içeriği, yapılandırılmış desenlere göre kontrol edilir - varsayılan olarak ve phar kontrol edilir.

  3. Eşleşme durumunda yeniden kodlayın. Bir işaretçi bulunursa, görüntü sıfırdan çözülüp yeniden kodlanır. Çözüm yalnızca piksel verisini okur; gerçek görüntü akışı dışındaki her şey yeniden kodlamada düşer.

  4. Kontrolcü çalışmadan önce değiştirin. Yeniden yazılan baytlar orijinal yükleme içeriğinin yerine geçer. Kontrolcünüz, doğrulama kurallarınız, depolama mantığınız - hiçbirisi değişmez.

Temel anlayış: gerçek bir görüntü kod çözücü, EXIF yorumunu çalıştırılabilir olarak okumaz. Yeniden kodlama, dosyayı yalnızca piksel verilerinden yeniden inşa eder, bu nedenle görüntü akışının sonundaki her şey - PHP yükünüz - çıktıda yer almaz.



Middleware kullanımı

Bunu doğrudan yükleme yollarına ekleyin:

use App\Http\Controllers\FileController;
use LaravelAt\ImageSanitize\ImageSanitizeMiddleware;

Route::post('/files', [FileController::class, 'upload'])
    ->name('file.upload')
    ->middleware(ImageSanitizeMiddleware::class);
Fullscreen moduna geç
Fullscreen modundan çık

Ya da bootstrap/app.php içinde okunabilir bir takma ad kaydedin (Laravel 12/13):

use Illuminate\Foundation\Configuration\Middleware;
use LaravelAt\ImageSanitize\ImageSanitizeMiddleware;

->withMiddleware(function (Middleware $middleware): void {
    $middleware->alias([
        'image-sanitize' => ImageSanitizeMiddleware::class,
    ]);
})
Fullscreen moduna geç
Fullscreen modundan çık
Route::post('/files', [FileController::class, ])
    ->name()
    ->middleware();
Fullscreen moduna geç
Fullscreen modundan çık



Middleware dışında doğrudan kullanım

Bir işte, API istemcisinde veya CLI ithalatında ham görüntü baytları ile mi işlem yapıyorsunuz? Sanitizer'ı doğrudan çağırın:

if (ImageSanitize::detect($contents)) {
    $contents = (string) ImageSanitize::sanitize($contents);
}
Fullscreen moduna geç
Fullscreen modundan çık

detect(), desen taramasını çalıştırır; sanitize() yeniden kodlama işlemini yapar. Dosyanın bir HTTP rotasından geçmediği durumlar için yararlıdır.



Yapılandırma

Varsayılanları değiştirmek istediğinizde yapılandırmayı yayınlayabilirsiniz:

php artisan vendor:publish --tag=image-sanitize-config
Fullscreen moduna geç
Fullscreen modundan çık

Varsayılanlar:

return [
    'allowed_mime_types' => [
        'image/jpeg',
        'image/png',
        'image/gif',
        'image/bmp',
        'image/webp',
    ],

    'patterns' => [
        '',
        'phar',
    ],

    'driver' => \Intervention\Image\Drivers\Gd\Driver::class,
    'quality' => 100,
    'auto_orientation' => true,
    'decode_animation' => true,
    'strip_metadata' => true,
];
Fullscreen moduna geç
Fullscreen modundan çık

Birkaç not:

  • quality => 100 ayarı, JPEG yeniden kodlamasının kayıpsız olmasını sağlar; daha küçük dosyalar istiyorsanız bunu düşürün.

  • strip_metadata => true ayarı, yeniden kodlamada EXIF verilerini kaldırarak gizlilik açısından da kazanç sağlar (telefon yüklemelerinden GPS koordinatlarının sızmasını önler).

  • decode_animation => true ayarı, animasyonlu GIF/WebP'yi tek bir çerçeveye düzleştirmek yerine doğru bir şekilde işler.

  • SVG, izin verilenler listesinde yoktur. SVG, aktif içerik taşıyabilir (, olaya yanıt veren işleyiciler) ve raster yeniden kodlamasıyla çözmesine göre farklı bir tehdit modeli gerektirir. Kendi sanitizasyonunuz olmadan bunu eklemeyin.



Bu nedir yapmaz

Bu paket:

  • mimes:/image doğrulama kurallarının yerini almaz - onları koruyun.

  • Yetkilendirme, hız sınırlama veya virüs taraması yapmaz.

  • Yüklemeleri halka açık, çalıştırılabilir bir dizinde depolamanızı güvenli hale getirmez. Yüklenmiş dosyaları public/ çalıştırılabilir yolların dışına yerleştirin.

  • SVG, PDF veya görüntü dışındaki yüklemeleri kapsamaz.

Bu, belirli bir boşluğu kapatan bir katmandır: aksi takdirde geçerli görüntü baytları içinde gizlenen kod. Bunu uygun depolama izolasyonu ile (yüklenen dosyaların çalıştırılamayan disklerde depolanması, imzalı URL'lerle veya bir kontrolcü aracılığıyla sunulması - doğrudan web kökü erişimi olmadan) birleştirerek, poliglot dosyanın geçmesini anlamlı şekilde azaltmış olabilirsiniz.

Gereksinimler: Laravel ^12.0 | ^13.0, PHP ^8.3, MIT lisanslı.



SSS (Sık Sorulan Sorular)

Bu, Laravel'in image doğrulama kuralının yerini alır mı? Hayır. Her ikisini de çalıştırın. Doğrulama, dosyanın yapı açısından geçerli bir resim olduğunu doğrular; temizleyici, gömülü yük işaretlerini kontrol eder ve bulursa yeniden kodlar. Farklı hata modlarını kapsar.

Yeniden kodlama resimlerimi bozar mı? Kalite varsayılan olarak 100'dür, bu nedenle JPEG kaybı minimaldir. PNG/GIF/WebP yeniden kodlaması, tipik kullanım için kayıpsızdır. Daha küçük çıktıya ihtiyacınız varsa, yapılandırmadaki quality değerini düşürün.

Neden SVG desteklenmiyor? SVG XML'dir ve bazı render etme bağlamlarında çalışan etiketleri veya olaya yanıt veren işleyiciler içerebilir. Raster bir görüntü yeniden kodlama işlemi, işaretleme dillerini "temizleme" anlamına gelmez - SVG, kendi temizleyicisine (örneğin, script/event-handler düğümlerini silme) ihtiyaç duyar ve bu, burada dışarıda kalır.

Bu, her yükleme tabanlı saldırıyı durdurur mu? Tek bir paket her şeyi yapmaz. Bu, özel olarak "görüntü baytları içinde gömülü PHP/PHAR" boşluğunu kapar. Bunu depolama izolasyonu, sıkı MIME/uzantı doğrulaması ve yükleme dizinlerinden PHP çalıştırmamayı birleştirerek destekleyin.



Tartışmaya katıl

  • Gördüğünüz en kötü yükleme tabanlı istismar, bir depolama yanlış yapılandırması ile nasıl zincirlenmişti?

  • quality => 100 varsayılan olarak - akıllıca, yoksa varsayılan olarak dosya boyutumunu optimize etmelimi? Aşağıda fikirlerinizi paylaşın.

  • SVG hijyeni için ihtiyacınız olduğunu düşündüğünüz bir durumu yaşadınız mı? Bunu göndermeyi engelleyen neydi?



Kaynaklar

Kaynak: Orijinal Makale

Contents
  • Özet
  • Sorun: sadece görüntü olmayan görüntüler
  • Neden MIME ve uzantı kontrolleri yeterli değil
  • Çözüm: tespit et ve yeniden kodla
  • Middleware kullanımı
  • Middleware dışında doğrudan kullanım
  • Yapılandırma
  • Bu nedir yapmaz
  • SSS (Sık Sorulan Sorular)
  • Tartışmaya katıl
  • Kaynaklar
Filament Ustalığı: 2025’e Kişisel Bir Bakış – Bir Yıl Değerlendirmesi
Yeniden Yazımın Kötü Yanları: 5 Yaşındaki Bir Arka Uç Kod Tabanını Nasıl Geliştirdim (Ve Neden Siz de Kodu Yeniden Yazmamalısınız)
WhatsApp, uygulamanın kendisinde iş aramalarını ikiye katlıyor
MediTrack Geliştirmekten Edindiğim Laravel Hakkında 3 Öneri
Laravel Politikaları: Yetkilendirmeyi Merkezi Hale Getirin ve Kontrolcülerinizin Temiz Kalmasını Sağlayın
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Amerika’nın Bayramını Kutlayan PGA Tour 2K25’in Şaşırtıcı Teması
Sonraki Makale Acil! Microsoft, Outlook’taki Copilot Düğmelerini Yeniden Getirdi

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Nintendo Fiziksel Oyun Dünyasının Liderliğini Ele Geçirebilir
Oyun
Tesla’nın Q2 Satışları Yüzde 25 Arttı
Liste
ABD hükümeti yeniden siber saldırıya uğradı
Genel
Supermicro, Tayvan yetkililerinin ofislerini basmadığını açıkladı
Donanım
Tekrar Oynanabilirlikten Ödün Vermeyen Stuntman Hollywood Fark Yaratiyor
Oyun
Acil: ToddyCat-Linked Umbrij Zararlısı Gmail’i OAuth ile Tehdit Ediyor
Siber Güvenlik
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?