The Tracking-Link Bug That Breaks Signed URLs
Bir hata kodunuzda uzun süre gizlenebilir. Çoğu bağlantı için çalışır. Pazarlama bağlantıları için sessiz kalır. Ancak en önemli bağlantıları bozar.
Bu hatayı kendi aracım olan mail-history'de buldum. İmzalı URL'leri bozuyor. Bunlar, e-posta doğrulaması veya güvenli indirmeler için kullanılan bağlantılardır.
Olay şöyle gelişti.
Aracım, tıklamaları takip etmek için e-posta HTML'ini yeniden yazar. Orijinal URL'yi alır, şifreler ve bir takip bağlantısına dönüştürür. Bir kullanıcı tıkladığında, araç URL'yi çözer ve kullanıcıyı gerçek hedefe yönlendirir.
Sorun, URL'yi işlenmiş (rendered) HTML'den çektiğimde başladı.
Laravel ve Blade, HTML özniteliklerini kaçış karakterleriyle (escape) korur. Bir URL'deki ampersand (&) işareti bir HTML varlığına (entity) dönüşür. & işaretinden & işaretine dönüşür.
Standart bir bağlantı için tarayıcı bunu otomatik olarak düzeltir. Farkı asla fark etmezsiniz.
Ancak aracım bağlantıyı bir tarayıcıya göndermez. Diziyi (string) bir şifre çözme fonksiyonuna gönderir.
Eğer imzalı URL'niz şöyle görünüyorsa: https://example.com/verify?expires=123&signature=abc
HTML şöyle görünür: https://example.com/verify?expires=123&signature=abc
Aracım & içeren versiyonu şifreler. Kullanıcı tıkladığında, araç bunu çözer ve kullanıcıyı & içeren versiyona gönderir.
Laravel & işaretini görür ve imzanın yanlış olduğunu düşünür. Doğrulama başarısız olur.
Çözüm tek satırlık bir koddur. Şifreleme gerçekleşmeden önce & işaretini tekrar & işaretine dönüştürmek için html_entity_decode kullanıyorum.
Bu, çözülen URL'nin orijinal imzalı URL ile bayt bayt eşleşmesini sağlar.
Çalışmalarınız için bir ders:
- Bir fonksiyonda kullanmak üzere işlenmiş HTML'den veri çekiyorsanız, bunun kaçış karakterleriyle korunmuş (escaped) olduğunu varsayın.
- Tarayıcılar hataları affeder. Şifreleme ve imza doğrulaması affetmez.
- Tek satırlık bir çözüm kullandığınızda, onun için bir test yazın.
Özellikle & varlığını kontrol eden bir test yazdım. Eğer gelecekteki bir geliştirici temizlik yaparken çözümümü kaldırırsa, test anında başarısız olacaktır.
Kaynak: https://dev.to/nasrulhazim/the-tracking-link-bug-that-only-breaks-signed-urls-38c