Modern cerrahide "Steril Saha" kavramı mutlak ve tavizsiz bir kanundur. Ameliyathanenin kapısından girdiğinizde hava pozitif basınçlı hepa filtrelerle temizlenir. Cerrah ellerini beş dakika boyunca antiseptik solüsyonla yıkar, steril eldivenlerini giyer, otoklavda 134 derecede sterilize edilmiş aletler yeşil örtünün üzerine dizilir. Şimdi bu steril ameliyat masasının başına geçen cerrahın, cebinden sokakta çamura düşmüş paslı bir tornavida çıkarıp hastanın açık batın ameliyatında organları kurcaladığını hayal edin.

O saniyede cerrahın yıkadığı ellerin, steril önlüğün, hepa filtrelerin hiçbir anlamı kalmaz; tüm ameliyathane anında "kontamine" (enfekte) kabul edilir. Dışarıdan bakan bir hasta yakını ise camın arkasından yeşil cerrahi önlüğü görüp "Burası tam teşekküllü ameliyathane, hasta nasıl enfeksiyon kaptı?" diye şaşırır.

Web güvenliği ve tarayıcı ekosisteminde de web geliştiricilerin ve site sahiplerinin en sık düştüğü, destek masalarında ise en çok kavga çıkaran sendrom tam olarak bu sterilite ihlalidir: Mixed Content (Karma İçerik) tuzağı ve kırılan yeşil kilit simgesi.

"300 Dolar Verdim, Nerede Bu Yeşil Kilit?"

Pazartesi sabahı e-ticaret sitesi sahibi hiddetle destek masasına bilet açar. Önceki gün hosting firmasından yıllık 250-300 dolar ödeyerek sektörün en prestijli, yeşil bar veren (Extended Validation - EV SSL) sertifikasını satın almıştır.

Sertifika sunucuya kusursuz bir şekilde kurulmuştur. Apache/Nginx yapılandırması tamamlanmış, RSA 2048-bit şifreleme anahtarları devreye alınmış, https://sirketadi.com.tr yazıldığında el sıkışma (TLS Handshake) başarıyla gerçekleşmektedir.

Fakat müşteri Chrome tarayıcısını açıp sitesine girdiğinde, o rüyalarını süsleyen güvenli kilit simgesi yerine korkunç bir uyarı görür:

"Bu site ile bağlantınız tam olarak güvenli değil."
(Kilit simgesinin üzerinde sarı bir üçgen veya kırmızı bir ünlem işareti belirmektedir!)

Müşterinin destek masasına yazdığı metin buram buram komplo teorisi kokar:

"Siz bana sahte sertifika sattınız! Paramı aldınız ama sitem 'Güvenli Değil' yazıyor. Müşterilerim alışveriş yapmaktan korkuyor, kredi kartı bilgilerini girmiyorlar! Derhal paramı iade edin ya da o yeşil kilidi oraya koyun, sizi mahkemeye veririm!"

Suç Mahalli: Sayfa Kaynağındaki 2015 Kalıntısı

Destek mühendisi tarayıcıda sitenin üzerine sağ tıklar, "İncele" (Inspect) der ve Console (Konsol) sekmesini açar.

Ekranda kırmızı harflerle basılmış onlarca uyarı satırı bir yangın gibi parlamaktadır:

Mixed Content: The page at 'https://sirketadi.com.tr/' was loaded over HTTPS, 
but requested an insecure element 'http://sirketadi.com.tr/images/logo.png'. 
This request was automatically upgraded to HTTPS or blocked to protect your security.
 
Mixed Content: The page at 'https://sirketadi.com.tr/' was loaded over HTTPS, 
but requested an insecure script 'http://harici-reklam.com/sayac.js'. 
This content should also be served over HTTPS.

Gerçek gün gibi ortadadır. Sunucudaki tünel (HTTPS) son derece güvenlidir, steril oda kurulmuştur. Ancak sitenin HTML kaynak kodunun içinde, ta 2015 yılında o siteyi yapan yazılımcının elle yazdığı (hardcoded) bir görsel çağrısı vardır:

<img src="http://sirketadi.com.tr/images/kampanya-banner.jpg" />
<script src="http://istatistik.net/tracker.js"></script>

Tarayıcı (Chrome, Firefox, Safari) bu durumu gördüğü an kullanıcıyı korumak için alarm zillerini çalar. Mantık basittir: "Evet, ana sayfa şifreli bir tünelden geldi ama bu sayfanın içindeki o resim veya javascript dosyası şifresiz (HTTP port 80) açık kanaldan çekiliyor. Araya giren bir korsan (Man-in-the-Middle) o şifresiz dosyayı değiştirip kullanıcıya sahte form gösterebilir!"

Tarayıcı acımasızdır; tek bir şifresiz görsel bile görse, o kutsal yeşil güven damgasını anında yırtıp atar.

İllüzyon: "Hosting Firması Sitedeki Kodu Düzeltsin"

Destek mühendisi ekran görüntülerini ekleyerek müşteriye durumu anlatır: "Ahmet Bey, satın aldığınız SSL sertifikası %100 geçerli ve aktiftir. Sorun sitenizin HTML kodlarının içinde 14 adet görselin ve harici bir sayacın hâlâ 'http://' protokolüyle çağrılmasından kaynaklanmaktadır. Bu linkleri 'https://' olarak güncellerseniz veya temanızın ayarlarından SSL zorlamasını açarsanız kilit simgeniz yemyeşil olacaktır."

İşte teknik destek ekiplerini duvara vuran o meşhur cevap gelir:

"Kardeşim ben koddan ne anlarım? Ben sizden SSL aldım, siz düzeltin o linkleri! Madem sertifika aldık, sitenin içindeki linkleri de otomatik güvenli yapması gerekmiyor mu? Niye ben uğraşıyorum?"

Müşteri, SSL sertifikasını bir sihirli değnek sanmaktadır. Zanneder ki sertifika kurulunca sunucu sitenin veritabanındaki yüz binlerce satırı, CSS dosyalarını ve JavaScript fonksiyonlarını sihirli bir el gibi tarayıp otomatik düzeltecektir.

Karma İçeriğe Karşı Cerrahi Sterilizasyon Protokolü

Mixed content hatasını çözmek ve kırık kilit simgesini tamir etmek, aslında web geliştiriciler için son derece standart ve kolay bir ameliyattır:

  1. Veritabanında Toplu Değiştirme (Search & Replace): WordPress veya özel CMS sistemlerinde veritabanına girip http://sirketadi.com geçen tüm satırları https://sirketadi.com olarak güncellemek (Örn: WP-CLI ile wp search-replace 'http://sirketadi.com' 'https://sirketadi.com').
  2. Protokolden Bağımsız Göreli URL'ler (Protocol-Relative URLs): Kodların içine mutlak adres yazmak yerine /images/logo.png şeklinde göreli (relative) adresleme kullanmak.
  3. Upgrade Insecure Requests Başlığı: Web sunucusunun HTTP yanıt başlıklarına (header) tek bir satır ekleyerek tarayıcıya sayfadaki tüm HTTP çağrılarını otomatik olarak HTTPS'e yükseltmesini emretmek:
    Content-Security-Policy: upgrade-insecure-requests;
  4. Harici Kaynakların Denetimi: Sayfaya eklenen üçüncü parti sayaçların, hava durumu widget'larının veya yazı tiplerinin (Google Fonts) HTTPS desteğinin olup olmadığını kontrol etmek; HTTPS sunmayan çağrıları siteden tamamen temizlemek.

Steril ameliyathaneye sokak çamuru sokup enfeksiyon çıktığında başhekimi suçlayamazsınız. SSL sertifikası sunucu ile ziyaretçi arasındaki köprüye çelik zırh giydirir; o köprünün üzerinden ne geçireceğiniz ise tamamen yazılımcının mimari ahlakına ve dikkatine bağlıdır. Yeşil kilit satın alınmaz; temiz kodla hak edilir.