Php, Xss, Güvenlik Ve HTML Purifier

Pzt, 12 Oca 2009 10:22:00, yazar: Yılmaz Uğurlu, yorum:(1)

Web uygulamaları projelerinde en çok üzerinde durulan ve dikkat edilmesi gereken geliştirme aşaması, uygulama güvenliğinin gözden geçirildiği bölümdür. Kendimizi çok iyi programcı ve çok dikkatli bir geliştirici olarak kabul etsekte, hazırladığımız uygulamaların pek çoğu dışarıdan, üçüncü şahıslardan veriler alarak bu verileri işlemektedir.

Kullanıcıdan gelen bu veriler genel olarak hazırladığımız sistemin işlediği verileri oluşturur ve kullanıcıya bu verilerle ilgili işlemler yapma imkanı veririz. Çok iyi biliyoruz ki, hazırladığımız web uygulamasına erişen tüm kullanıcılar aynı iyi niyeti taşımıyor. Bazıları, belki de pek çoğu, hazırladığınız uygulamanın zayıf yanlarından faydalanmaya çalışacak hareketlerde bulunuyorlar, bırakmanız muhtemel olan açıkların herbirini tek tek, ve sabırla uygulamanız üzerinde deniyorlar.

Elbetteki çoğu geliştirici web uygulamalarındaki güvenlikle ilgili kurallardan (resmi ya da gayri resmi) birincisini mutlaka biliyordur. “Kullanıcıdan gelene veriye asla güvenme”. Çoğunlukla hazırladığımız web uygulamasını bu birinci kural çerçevesinde inceden inceye düzenleriz. Veri analizleri, filtrelemeler vb. pek çok şekilde gelen bu verinin güvenliğini sağlamaya çalışırız.

Web güvenliği dendiğinde öncelikle akla gelen (en azından benim aklıma gelen) iki başlık bulunuyor. Sql Injection ve XSS (cros site scripting). Sql Injection daha çok bizim yazdığımız kodlardaki matık hataları üzerinden vuku bulan sorunlar ortaya çıkarıyor ve sonuçları da oldukça ağır oluyor. Xss ise, kullanıcıdan gelen verilere güvenerek filtrelemememizden kaynaklanan ve kendi uygulamamız dışında, uygulamayı kullanan iyi niyetli kullanıcılara da zarar verebilecek saldırıları tanımlıyor.

Sql Injection üzerine internet üzerinde pek çok kaynak bulmak mümkün.
Sql Injection Nedir ?
Sql Injection Google Araması
Xss Wiki Sayfası

Benim kurcalayacağım konu ise xss olacak. Xss wikipediadaCross site scripting (XSS), bir bilgisayar güvenlik açığıdır. Saldırgan, HTML kodlarının arasına istemci tabanlı kod gömmesiyle, kullanıcının tarayıcısında istediği istemci tabanlı kodu çalıştırması.“ olarak tanımlanıyor. Saldırgan gönderdiği veri içerisine zararlı html kodları – ki genelde javascript kodlarıdır – eklemesi ve bu eklenen zararlı kodların yüklenerek çalışabildiği sayfanın üçüncü bir şahsın ziyaretinin ardından, iyi niyetli kullanıcı ile ilgili önemli bilgilerin, saldırıda bulunan kişiye ulaşması şeklinde gelişen bir senaryoya sahip xss.

Php içerisinde htmlspecialchars vb. fonksiyonlar ile bu tarz zararlı içerikleri filtrememiz mümkün, ancak bu seferde izin vermek istediğiniz, özellikle kullanıcıdan gelen mesaj vb. içeriklerdeki html biçimlendirmelerini kaybetmemiz gibi bir sorun oluşuyor. Bu konuda çözüm oluşturmak için üretildiğini düşündüğüm, bbcode, markdown, textile gibi içerik biçimlendirme formatları olmasına rağmen, her zaman istediğimiz biçimde şekillendirme yapmak mümkün olmuyor.

İşte bu noktada HTML Purifier bize yardımcı oluyor. Kullanıcıdan gelen veri içerisindeki zararlı içerikleri temizlemesinin yanında, izin vereceğiniz html etiketlerini bozmadan, ve buna ek olarak doğru html biçimlendirmesi yapıldığını kontrol ederek gelen verileri filtrelemeniz mümkün oluyor.

Kendi oluşturacağınız bir kurallar listesi ile kullanıcıdan gelen veriyi zararlı içerilerden filtrelemeniz ve yeniden biçimlendirmeniz mümkün oluyor. Oluşturacağınız kurallar için çok fazla seçenek sunan HTML Purifier veri güvenliği konusunda da kendine güveniyor. XSS Attacks Smoketest sayfasında olası xss atakları ve filtrelenmiş içeriğin çıktıları listeleniyor. http://ha.ckers.org/xss.html sayfasındaki atak biçimleri baz alınarak hazırlanmış örneklerde HTML Purifier tam başarı sağlıyor.

Download sayfasından kütüphane dosyalarını indirdikten sonra tek yapmanız gereken, uygulamanız içerisinde filtreleme yapacağınız yerde ilgili dosyaları uygulamanıza dahil etmek ve kendi ayarlarınızı oluşturarak, içeriği filtrelemek. Kısaca örnekler vererek açıklamamı tamamlamak istiyorum.

Basit kurulum

require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
$purifier = new HTMLPurifier();
// $dirty_html kullanıcıdan gelen güvenilmez veriler
$clean_html = $purifier->purify($dirty_html);

Örneğin hazır bir javascript html editörü kullanıyorsunuz, kullanıcınızın buradaki biçimlendirmeleri kullanmasına izin vermek istiyorsunuz, aynı zamanda veri güvenliğini sağlayıp, html editörünün oluşturduğu gereksiz kodlarıda gelen veri içerisinden kaldırmak istiyorsunuz. İşte bu ihtiyaç için kullanabileceğiniz reçete.
kaynak kod

require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
$purifier = new HTMLPurifier();
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML', 'DefinitionID', 'User Content Filter');
$config->set('HTML', 'DefinitionRev', 1);
// düzenleme yapacağımız html doctype tanımlaması
$config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional');
// etiketler içerisindeki hatalı nitelikeri düzenler, yukarıda tanımladığımız doctype biçimine göre içeriği yeniden düzenler
$config->set('HTML', 'TidyLevel', 'heavy'); 
// izin verdiğimiz html etiketlerimiz
$config->set('HTML', 'Allowed', 'a,strong,em,p,span,img,li,ul,ol,sup,sub,small,big,code,blockquote,h1,h2,h3,h4,h5');
// izin verdiğimizi html etiket niteliklerimiz
$config->set('HTML', 'AllowedAttributes', 'a.href,a.title,span.style,p.style,img.src,img.style,img.alt,img.title');
// text halindeki url adreslerini otomatik linklendirir
$config->set('AutoFormat', 'Linkify', true);
// içeriği tarayarak otomatik biçimlendirme yapar
$config->set('AutoFormat', 'AutoParagraph', true);
// içeriği boş html etiketlerini siler
$config->set('AutoFormat', 'RemoveEmpty', true);
// ayarlarımızı kaydedelim
$purifier = new HTMLPurifier($config);
// $dirty_html kullanıcıdan gelen güvenilmez veriler
$clean_html = $purifier->purify($dirty_html);

Yukarıda oluşturduğum tanımlamayı http://htmlpurifier.org/live/configdoc/plain.html adresindeki bilgilere göre oluşturdum. Sizde ihtiyacınız olan niteliklere göre yukarıdaki ayarlamayı yapabilirsiniz.

HTML Purifier ile ilgili linkler:

http://htmlpurifier.org/
http://htmlpurifier.org/demo.php
http://htmlpurifier.org/docs.html
http://htmlpurifier.org/live/configdoc/plain.html
http://htmlpurifier.org/live/smoketests/xssAttacks.php
http://htmlpurifier.org/download.html

Yorumlar

İçeriğe kayıtlı yorum bulunmuyor!

Yorum Ekle