XSS saldırılarından htmlspecialchars ile korunmak ne kadar güvenli?

Merhabalar,

Bu yazıda developer’ların htmlspecialchars’a duyduğu aşırı güveni biraz boşa çıkartacağız. Uzatmadan konuya girelim. XSS’ten korunmak için genelde htmlspecialchars fonksiyonu kullanılır. Zira Google’da “protected xss” diye aratıldığında çıkacak ilk StackOverflow sorusunun en çok oy alan yorumunda bile htmlspecialchars kullanılması gerektiğinden bahsediliyor. Peki ne yapar bu htmlspecialchars?

htmlspecialchars fonksiyonun php.net sayfası şu; https://php.net/manual/tr/function.htmlspecialchars.php

Doğrudan alıntı yapıyorum;

  • ‘&’ (ve imi) ‘&’ haline gelir.
  • ‘”‘ (çift tırnak) ENT_NOQUOTES belirtilmişse ‘"’ haline gelir.
  • ”’ (tek tırnak) ENT_QUOTES belirtilmişse ‘'’ haline gelir.
  • ‘<‘ (küçüktür) ‘&lt;’ haline gelir
  • ‘>’ (büyüktür) ‘&gt;’ haline gelir

Php manuel sayfasında birşey hatalı galiba, yada ben idrak edemedim. htmlspecialchars içerisinde ENT_NOQUOTES belirtilmiş ise çift tırnağı encode edeceği yazılmış ancak ENT_NOQUOTES’i belirtilmezse bile çift tırnağı encode ediyor. Sıkıntımız şurada; ENT_QUOTES’i belirtmediğiniz sürece tek tırnağı encode etmiyor. Çalışan haline birde aşağıdaki resimlerden bakalım.

htmlspecialchars

htmlspecialchars fonksiyonunu geliştiren developer muhtemelen php developer’ın clean code developer olduğunu varsayarak tek tırnağı isteğe başlı olarak encode etme tarafını seçmiş. Eğer clean code yazılacaksa örnek bir a tag’ini aşağıdaki gibi yazmanız beklenir;

<a href="<?php echo htmlspecialchars($variable); ?>">test</a>

Gerçi yukarıdaki koda pekte clean code denmez; bildiğin spaghetti code. Zaten asıl tehlike de bu ya; spaghetti code yazan developerlar yukarıdaki kodu aşağıdaki gibi yazmakta bir sakınca görmeyeceklerdir.

<a href='<?php echo htmlspecialchars($variable); ?>'>test</a>

Peki ne farkı var her 2 kodun? İlk kodda a tag’inin href attribute’ünü çift tırnak ile açtık 2. kodda tek tırnak ile. Eğer $variable; kullanıcının müdahale edebildiği bir inputtan geliyor olsaydı (örneğin bir arama sayfasında arama yapıldıktan sonra arama linkinin ekranda gösterilmesi gibi) sistem saldırı karşısında savunmasız kalacaktı. Aşağıdaki gibi bir payload çok rahat çalışacaktı;

$variable = ” ‘ onmouseover=’xss_by_@om3rcitak’ alt=’ “;

yani; kodunuzu 1.deki gibi veya htmlspecialchars’a 2. parametre olarak ENT_QUOTES’i verilseymiş yukarıdaki her 2 kod içinde güvende sayılmış olunacaktı.

Bazı developer arkadaşlara yukardaki örnek çok ütopik gelebilir. Bug bounty platformu olan büyük firmalara yapılan XSS report’larının bir kısmı HTML taglerinin atribute’lerin tek tırnak ile yazılmış olmasıdır.

Yani sonuç olarak;

  1. HTML tag’lerinin attribute’leri muhakkak çift tırnak ile açılmalıdır
  2. htmlspecialchars kullanılacak ise 2. parametre olarak ENT_QUOTES verilmelidir -> htmlspecialchars($variable, ENT_QUOTES);

-.- . -. -.. .. -. .. –.. . / .. -.– .. / -… .- -.- .. -. .-.-.- .-.-.- .-.-.-

Comments on this post

  1. keşke lyk sınavına girmeden önce okusaydım bu makaleyi 🙂 (-.- ./blabla/-.-.-)

    • Bir güvenlikçi atasözü derki; “Bir soru sorulduğunda sorudan çok sana soruyu soranı tanımaya çalış” 😉

      • hahaha çok doğru hocam. Siz bir daha sınav hazırlarsanız görüşürüz 😀

  2. Furkan

    Çok özet bir şekilde çok net anlatmışsınız 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackbacks and Pinbacks

No trackbacks.

TrackBack URL