BETPIXEL

26 Ağustos 2026 · 5 dk okuma

Neden SVG kabul etmiyoruz

SVG bir görsel değil, çalıştırılabilir içerik taşıyabilen bir metin dosyasıdır. Yükleme kapısında neden baytlara bakıyoruz, uzantıya değil?

Logonu SVG olarak dışa aktardın, yükleme ekranına sürükledin ve "bu format kabul edilmiyor" yazısını gördün. PNG, JPEG, WebP, GIF, AVIF geçiyor ama SVG geçmiyor. Bu keyfi bir tercih değil ve "daha sonra ekleriz" listesinde de değil.

Sebebi tek cümlede: SVG bir görsel dosyası değil, bir belge biçimidir. Diğer beşi pixel verisi taşır; SVG talimat taşır ve o talimatları çalıştıracak olan taraf biziz.

SVG aslında ne

PNG dosyasını açarsan anlamsız ikili veri görürsün. SVG dosyasını bir metin düzenleyicide açarsan okuyabildiğin etiketler görürsün:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
  <circle cx="50" cy="50" r="40" fill="#ffd700" />
</svg>

Bu bir resim değil, bir tarif: "şu merkeze, şu yarıçapta, şu renkte bir daire çiz." Resim, tarifi okuyan program tarafından üretilir.

Fark önemli, çünkü tarif dili sadece daire çizmekle sınırlı değil. SVG standardı XML üzerine kurulu ve XML'in tüm yeteneklerini miras alıyor.

Bir SVG neler içerebilir

Zararsız bir logo gibi görünen bir dosyanın içinde şunlar bulunabilir:

  • Betik. SVG <script> etiketini destekler. Dosya, işleyen ortamda kod çalıştırmayı deneyebilir.
  • Olay işleyicileri. onload, onclick gibi öznitelikler etiketlerin içine gömülebilir. Betiği silsen bile bunlar kalır.
  • Dış kaynak referansları. <image href="https://..."> ya da dış bir stil dosyası. Dosyayı işleyen sunucu, dosyanın işaret ettiği adrese kendi bağlantısını açmaya kalkabilir. Bu, bizim sunucumuzu yabancı bir adrese istek atan bir vekile dönüştürür.
  • Varlık genişletmesi. XML, bir kısaltmanın başka bir metnin yerine geçmesine izin verir. İç içe tanımlanmış kısaltmalar, birkaç kilobaytlık bir dosyanın çözülürken gigabaytlara şişmesine yol açabilir. Klasik bir hizmet kesme yöntemidir ve saldırı dosyası küçücüktür.
  • Gömülü yabancı içerik. SVG, içine başka biçimlerde belge parçaları alabilir.

Bunların hiçbiri egzotik değil; hepsi standardın normal parçaları. SVG'nin suçu yok — bu özellikler tarayıcıda etkileşimli grafik yapmak için var. Sorun, bu belgeyi tanımadığımız birinden alıp kendi sunucumuzda işlemek.

"Ama siz zaten PNG'ye çeviriyorsunuz"

Doğru: yüklenen her görsel sunucuda yeniden kodlanıyor ve PNG olarak saklanıyor. İlk bakışta bu SVG'yi de güvenli hale getirir gibi duruyor — nasıl olsa çıkan dosya düz bir PNG olacak.

Sorun, tehlikenin çıkışta değil girişte olması. SVG'yi PNG'ye çevirmek için önce onu çizmek gerekir. Çizmek için XML'i ayrıştıran, stilleri çözen, referansları takip eden ve belgeyi yorumlayan bir motor çalıştırmak gerekir. Yani yabancının gönderdiği bir belgeyi kendi makinemizde yorumlamak zorunda kalırız.

Tehlikeli olan çıktı değil, o yorumlama anı. Çıktının temiz olması, yorumlama sırasında bir şey olmadığı anlamına gelmiyor.

Rasterlanmış formatlarda bu problem yok. Bir PNG kod çalıştırmaz, ağ isteği yapmaz, kendini genişletmez. Çözücüsüne yanlış biçimli veri verip hata çıkarmaya çalışabilir — bu yüzden dosya boyutu ve çözülmüş pixel sayısı için ayrı sınırlarımız var — ama saldırı yüzeyi kıyaslanmayacak kadar dar.

Uzantıya bakmak kontrol değildir

Yükleme kapısında SVG'yi eleyen şey dosyanın adı değil. Nedeni basit: uzantıyı yükleyen kişi seçer. logo.svg dosyasının adını logo.png yapmak bir saniye sürer ve dosyanın içeriği zerre kadar değişmez.

Tarayıcının bildirdiği içerik tipi de aynı derecede güvenilmez. O bilgi de istekle birlikte gelir, yani gönderen tarafından belirlenir. Normal bir tarayıcıdan doğru gelir; kasıtlı hazırlanmış bir istekte ne yazılmışsa o gelir. Gönderenin yazdığı bir etikete bakıp "tamam, bu PNG'ymiş" demek kontrol değil, güven.

Bunun yerine dosyanın kendi baytlarına bakıyoruz. Her raster biçimin başında, türünü belirten sabit bir imza vardır:

  • PNG dosyaları \x89PNG ile başlar.
  • JPEG dosyaları \xFF\xD8\xFF ile başlar.
  • GIF dosyaları GIF87a ya da GIF89a ile başlar.
  • WebP ve AVIF, kendi konteyner yapılarında tanımlı işaretleri taşır.

SVG'nin böyle bir imzası yok, çünkü o bir metin dosyası. <svg ile de başlayabilir, bir XML bildirimiyle de, boşluklarla ve yorum satırlarıyla da. Bilinen imzaların hiçbirine uymadığı için daha hiçbir çözücüye ulaşmadan reddedilir. Kontrol, ayrıştırmadan önce yapılır — sonra değil. Sıralama burada işin özü.

Yan fayda: bu kontrol sadece SVG'yi elemiyor. Adı .png olan bir arşiv, sonuna fazladan veri eklenmiş bir JPEG, hiç görsel olmayan bir dosya — hepsi aynı kapıda duruyor.

Vektörün avantajı burada zaten yok

SVG'nin asıl gücü ölçeklenebilirlik: aynı dosya hem ikon boyutunda hem bina cephesinde keskin çıkar. Bu gerçekten değerli bir özellik — ama tuvalde karşılığı yok.

Tuval sabit: 1000 × 1000 pixel, tek bir birleşik görüntü. Senin alanın da sabit — kiraladığın blok sayısı × 10 pixel, ne bir eksik ne bir fazla. Ölçeklenecek bir şey yok. Vektör bir dosya yüklesen bile sistem onu tam o ölçüde rasterlar ve saklar.

Yani SVG kabul etseydik kazanacağın tek şey, kendi dışa aktarma adımını atlamak olurdu. Karşılığında rasterlamayı sen değil biz yapardık — ve nasıl göründüğüne sen değil bizim motorumuz karar verirdi. Küçük ölçekte bu iyi bir takas değil: 20 × 20 pixellik bir alanda hangi çizginin kalın kalacağına senin karar vermen gerekir, otomatik bir dönüştürücünün değil.

Yükleme kapısında reddedilmek bir kayıp değil

Bunu netleştirelim, çünkü karıştırılıyor: SVG'nin reddi bir moderasyon reddi değil. Dosya, bir insan bakmadan çok önce, yükleme kapısında eleniyor. Ortada bir karar, bir gerekçe, bir itiraz süreci yok — sadece kabul edilmeyen bir dosya türü.

Alanın da etkilenmiyor. Kiraladığın alan senin; doğru formatta yeni bir dosya hazırlayıp yüklersin. Kiralama sayacı görselin onaylandığı anda başladığı için, formatı düzeltmekle geçen süre senden gitmiyor.

Aynısı moderasyon reddi için de geçerli: red görseli reddeder, kiralamayı değil. İkisi arasındaki fark sadece şu — biri saniyeler içinde otomatik olur, diğerinde bir insan sana gerekçe yazar.

Sen ne yapmalısın

Tasarımını vektör olarak yapmaya devam et; sorun kaynak dosyanda değil, yüklediğin dosyada.

  1. Kiraladığın alanın pixel karşılığını hesapla: blok sayısı × 10. 2 × 2 blok aldıysan 20 × 20 pixel — 400 pixel, haftada 400 dolar. Sekiz hafta tutarsan 8 × 400 = 3.200 dolar.
  2. Tasarım programında "Dışa Aktar" ekranını aç, formatı PNG seç.
  3. Genişlik ve yükseklik alanlarına tam sayıları yaz: 20 ve 20. Ölçek yüzdesiyle uğraşma, doğrudan pixel gir.
  4. Çıkan dosyayı %100 yakınlaştırmada aç ve kontrol et. Vektörde temiz görünen ince çizgiler bu ölçekte kaybolmuş olabilir; kaybolduysa kalınlaştır ve tekrar aktar.
  5. Yükle.

Vektörden rastere geçerken en sık kaybedilen şey ince detay. 20 × 20 pixelde saç teli kalınlığındaki bir çizgi ya tamamen yok olur ya da soluk gri bir iz bırakır. Bu, SVG kabul edilseydi de değişmeyecekti — tuval sonuçta pixellerden oluşuyor.

Kısa özet

SVG'yi reddetmemizin sebebi format snobluğu değil: SVG, işleyen tarafta çalıştırılan bir belgedir ve o işleyen taraf biz oluruz. Kontrolü uzantıya değil dosyanın imzasına dayandırıyoruz, çünkü uzantıyı ve içerik tipini yükleyen kişi yazar. Sen tarafında yapılacak iş tek satır: dışa aktarırken PNG seç ve hedef pixel ölçüsünü elle gir.

Reklam kuralları neden var ve nasıl işliyor