Tüm makaleler

String Escape: aynı metnin neden farklı şekilde kaçırılması gerekir

Türkçenin ünlü "nokta sorunu" regex ile de ilgilidir: büyük "I" harfinin küçüğü Türkçede noktasız "ı", büyük "İ" harfinin küçüğü ise noktalı "i"dir — İngilizcedeki I/i eşleşmesinden farklı. Türkçe metin işleyen bir regex'te [a-zA-Z] gibi bir karakter sınıfı "ı", "ğ", "ş", "ç", "ö", "ü" harflerini kapsamaz; bu yüzden kullanıcı girdisini büyük/küçük harf duyarsız eşleştirmek isteyen kod, yerel ayar (locale) farkını hesaba katmazsa Türkçe karakterlerde sessizce yanlış sonuç üretebilir.

JavaScript/JSON string içinde kaçış (escaping)

JS string literallerinde ve JSON'da özel karakterler ters eğik çizgiyle kaçırılır: tırnak işareti için \", yeni satır için \n, ters eğik çizginin kendisi için \\. JSON ayrıca tüm string'lerin çift tırnak kullanmasını şart koşar — tek tırnağa da izin veren JS'den farklı olarak.

Shell komutlarında kaçış

Komut satırında boşluk, tırnak işaretleri, dolar işareti, yıldız gibi karakterler özel karakterlerdir — shell için özel bir anlam taşırlar. Bir komut argümanı içindeki boşluk ya kaçırılmalı ya da tüm argüman tırnak içine alınmalı, aksi halde shell onu iki ayrı argümana böler.

Düzenli ifadelerde (regex) kaçış

Düzenli ifadelerde nokta, yıldız veya parantez gibi karakterlerin özel bir anlamı vardır (herhangi bir karakter, bir niceleyici, bir grup). Bunları metakarakter olarak değil harfiyen eşleştirmek için önlerine ters eğik çizgi konur: \. "herhangi bir karakter" değil, gerçek bir nokta ile eşleşir.

Her bağlamın neden kendi kaçışına ihtiyacı var

"Çifte kaçış" veya "eksik kaçış" hataları, kullanıcı metnini (örneğin boşluk içeren bir dosya yolunu) bir komuta veya string'e eklerken kodun bozulmasının en yaygın nedenlerinden biridir. Doğru kaçış, metnin kendisine değil, tam olarak nereye eklendiğine bağlıdır.

Ne işe yarar

  • ı, ğ, ş, ç, ö, ü gibi Türkçe karakterler içeren kullanıcı metnini bir JSON isteğine güvenle eklemek için hazırlamak.
  • Komut enjeksiyonu riski olmadan dinamik argümanlı bir shell komutu oluşturmak.
  • Metni bir düzenli ifadede harfi harfine bir desen olarak kullanmadan önce özel karakterleri kaçırmak.

İç içe bağlamlarda çifte kaçış

Metin art arda iki bağlamdan geçtiğinde — örneğin bir string JSON'a gömülür ve bu JSON bir shell komutunun argümanı olarak geçirilir — kaçış doğru sırayla uygulanmalıdır: önce iç bağlam (JSON), sonra dış bağlam (shell). Sıranın karışması ya da bir katmanın atlanması, "doğru kaçırılmış" bir string'in pratikte yine de bozuk çıkmasının yaygın bir nedenidir.

Aracı dene