Bu eşittir (=) işaretleri de ne böyle?
(lars.ingebrigtsen.no)- Kısa süre önce Twitter’da eski e-posta alıntıları yayılırken, cümle sonlarında görülen eşittir (=) işaretlerinin neden ortaya çıktığına dair sorular gündeme geldi
- Bu işaret, ‘quoted-printable’ kodlama sürecinde oluşur ve uzun satırlar zorla bölündüğünde satırın devam ettiğini göstermek için kullanılır
- E-posta iletiminde satır sonu olarak CRLF (carriage return + line feed) kullanılır; bu yapı Unix’in NL biçimine dönüştürülürken çözme algoritması yanlış çalışırsa eşittir işaretleri kalabilir ya da karakter kaybı yaşanabilir
- Eşittir işareti yalnızca satır sonları için değil, ASCII dışı karakterleri (ör. =C2=A0) göstermek için de kullanılır; hatalı çözücüler bunu basit bir ikame olarak ele alıp hataya yol açar
- Sorunun kaynağı, hatalı çözme mantığı ve uygunsuz dönüştürme işlemleri olup, e-postayı işleyen kişinin teknik olarak yetersiz olduğunu gösterir
E-posta alıntılarındaki eşittir (=) işaretinin aslı
-
Son birkaç gündür Twitter’da çok sayıda eski e-posta alıntısı paylaşılırken, cümle sonlarındaki eşittir işaretleri dikkat çekti
- Yazar, bunun kod ya da OCR (optik karakter tanıma) hatası olduğu yönündeki iddialara karşı çıkıyor
- Gerçekte bu durum, e-postayı daha okunur hale getirme sürecinde ortaya çıkan bir kodlama işleme hatası
-
E-postalar geçmişte yalın metinden ibaretti; ancak uzun satırları ve özel karakterleri işlemek için ‘quoted-printable’ kodlama kullanılmaya başlandı
- Uzun satırlar bölünürken satır sonuna eşittir (=) eklenerek “bu satır devam ediyor” anlamı verilir
- Bu durumda eşittir işaretini CRLF (carriage return + line feed) izler
Satır sonu kodlaması ve çözme hataları
-
E-posta sunucuları standart olarak CRLF satır sonunu kullanır, ancak Unix sistemleri yalnızca NL kullanır
- Dönüştürme sürecinde bir bayt eksilir; çözücü bunu yanlış ele alırsa eşittir işareti kalabilir ya da karakterler kaybolabilir
- Örneğin “non- =CRLF cloven” yanlış işlendiğinde, “non- loven” gibi
charfi kaybolabilir
-
Bazı uygulamalar satır sonundaki eşittir işaretini gördüğünde iki karakteri silerek işlem yapar
- Bu algoritma Unix biçimli dosyalarda hatalı çalıştığı için eşittir işaretinin olduğu gibi kalması gibi bir sonuç doğar
Eşittir işaretinin bir başka kullanımı: ASCII dışı karakter kodlaması
-
Eşittir işareti, satır sonlarının dışında ASCII dışı karakter kodlamasında da kullanılır
- Örneğin
=C2=A0, non-breaking space (satır sonu olmayan boşluk) anlamına gelir - E-posta gövdesinde girinti veya özel karakter gösteriminde sıkça görülür
- Örneğin
-
Yazar, bazı dönüştürücülerin =C2, =A0 gibi dizileri yalnızca basit bir arama-değiştirme ile işlediğini ve doğru bir çözücü kullanmadığını tahmin ediyor
Teknik arka plan ve standart
-
RFC 2045 standardı, quoted-printable kodlamayı iletim (transport) amaçlı olarak tanımlar
- Alındıktan sonra çözülüp temiz metin olarak saklanması esastır
- Ancak pratikte bu adım atlandığı için satır sonu işleme hataları sık görülür
-
Örnek kodda
(quoted-printable-decode-string "he=\nllo")ifadesi normal biçimde"hello"sonucunu verir- Bunun nedeni, SMTP sunucusu bağlamında CRLF varsayan algoritmanın yeniden kullanılmış olmasıdır
- Windows tabanlı dosyalarda doğru çalışsa da Unix tabanlı ortamlarda başarısız olur
Sonuç
- E-posta alıntılarındaki eşittir işaretleri, quoted-printable kodlamanın kalıntısıdır ve
satır sonu işleme ile ASCII dışı karakter çözümlemesindeki kusurların birleşik sonucudur - Sorunun temel nedeni, hatalı çözücü uygulaması ve kodlama dönüştürme yanlışlarıdır
- Yazar bunu “teknik bir sorun ve hatalı işlemenin sonucu” olarak özetlerken,
e-posta dönüştürme sürecinde standartlara titizlikle uyulması gerektiğini vurguluyor
1 yorum
Hacker News görüşleri
Bu yazının baş kahramanı, Emacs’in e-posta/Usenet okuyucu paketi Gnus’un kılavuzunu yazan Lars Ingebrigtsen. Kılavuzu hem nükteli hem bilgilendirici ve e-posta ayrıştırma konusunda çoğu insandan çok daha derin bir anlayışa sahip. Kılavuza buradan bakılabilir, başka bir sürümü de bu bağlantıda yer alıyor.
Bu olay, “tehlikeli derecede bilgili biri”nin tipik bir örneği. E-postanın basit metin olmadığını biliyordu ama quoted-printable çözmeyi basit bir değiştirme işlemi gibi ele almamanız gerektiğini bilmiyordu. Bu, HTML’i doğrudan regex ile ayrıştıran hatalarla aynı türden; başta çalışıyor gibi görünüyor, sonra da kongre delillerinde bir sürü ‘=’ işareti kalıyor.
“Mail sunucuları neden uzun satırlardan hoşlanmıyor?” diye bir soru vardı.
HELO,MAIL FROM,RCPT TO,DATAgibi komutlarla çalışan yapıyı açıklıyor.İlk başta bu yazının
= == === .=. <== ==> <<== ==>> (==) => =~=gibi operatör anlamları hakkında olacağını sanmıştım.Ben de kişisel olarak kendi e-posta arşivleme yazılımımı yazdım. 20 yılı aşkın birikmiş .eml dosyalarındaki uç durumları ele almak en zor kısımdı. Kavram basit görünse de e-posta şaşırtıcı derecede karmaşık.
Bana ilginç gelen, ‘=’ işaretinin kendisinden çok onun çevresindeki karakterlerin kaybolması oldu. Bu, bir off-by-one hatası gibi; sanki ‘=’ silineceğine gerçek metnin bir kısmı silinmiş. Muhtemelen CRLF/LF dönüşümüyle ilgili olabilir.
Bu sorunun neden şimdi ortaya çıktığını merak etmiştim. Son birkaç gündür insanlar eski e-postaları Twitter’da paylaşıyor; nedenini merak ettim.
Bazı kişiler, sorunun kaynağının Gmail değil arada dönüşüm yapan bir sunucu olabileceğini öne sürüyor. CRLF→LF dönüşümüne ek olarak quoted-printable iki kez uygulanırsa ‘=’ işaretleri kalabilir; yani işin içinde iki posta sunucusu olmuş olabilir.
archive.today üzerindeki makale de aynı quoted-printable bozulması sorununu gösteriyor. İlgili bağlantılar pastes.io/correspond ve HN başlığı.
Outlook’tan indirilen e-postaları görüntülerken quoted-printable’ı otomatik çözen bir .eml görüntüleyicisi olsa iyi olurdu.