PHP PHP script'lerinizin güvenli olduğundan emin olmanız için ilk olarak temel kuralları yerine getirmeniz gerekiyor: kullanıcı girdilerinin filtrelenmesi ve çıktıların kontrolü. Eğer bu ikisini doğru olarak yapmıyorsanız script'leriniz her zaman güvenlik problemleri ile karşı karşıya olacaktır. Bu makale'de bu iki işlem ile ilgili yapılması gerekenler anlatılıyor. Bütün girdileri filtreleyin Script'leriniz harici bir kaynaktan girdi okuduğunda, bu verinin tehlikeli olduğu varsayılmalı ve güvenilmemelidir. Güvenilmemesi gereken değişkenlerden bazıları: $_POST, $_GET, $_REQUEST ve hatta pek mümkün grünmese de nemli veriler içerebilecek olan $_SERVER. Tehlikeli bir değişkenden gelen veriyi işlemlere tabi tutmadan nce ilk olarak nce onaylanamanız ve filtrelemeniz gerekmektedir. Onaylama işlemi ile sadece sizin istediğiniz verileri içerdiğinden emin olabilirsiniz. rneğin bir eposta adresi bilgisi bekliyorsanız, onay fonksiyon'unuz girilen verinin doğru bir eposta adresi olup olmadığını kontrol etmeli. Hemen basit bir rnekle açıklayalım. Aşağıdaki kodda ilk olarak $_POST değişkeninden e-posta adresini alıyorum ve sonra veriyi onaylama işlemine sokuyorum: <?php $eposta = $_POST ; # Burada veri hala TEHLİKELİ durumda // Validate e-mail if (valid_eposta false) ?> Veriyi kontrol ederek script'imize tehlikeli verilerin eklenmesi riski büyük lçüde azaltılmış oldu. valid_eposta fonksiyon'u PHPit Code Snippet veritabanında da bulunabilecek olan standart bir onay işlemidir. Verimiz daha güvenli olsa da işimiz daha bitmedi çünkü hala veriyi MySQL veritabanına yerleştirmek istiyoruz ve bu işlemden nce de bazı kontroller yapmamız gerekiyor. PHP tüm nemli karakterlerin escape edildiği mysql_real_escape_string standart fonksiyon'unu sunar. Diğer bir yntem ise SQL sorgusunda veriyi her zaman kesme imleri arasına yerleştirin. nceki rneğimize devam edelim: <?php $eposta = $_POST ; # Burada veri hala TEHLİKELİ durumda // Validate e-mail if (valid_eposta false) // eposta'nın veritabanı için güvenli hale getirilmesi $eposta = mysql_real_escape_string ; // Artık güvenli! ?> Artık elimizdeki eposta verisi veritabanına güvenli bir şekilde işlenebilir. Hatalardan kaçınmak için tehlikeli değişkenlere bir n ek verilebilir, rneğin: <?php $t_eposta = $_POST ; # Tehlikeli // Onay işlemi $g_eposta = mysql_real_escape_string ; ?> Bu şekilde tehlikeli bir veriyi işleme sokarken n tarafındaki t_ eklentisi ile hemen farkına varabilirsiniz. Çıktıların filtrelenmesi Girdilerde olduğu gibi dışarıya sunulan tüm verilerin de filtrelenmesi gerekmektedir. Filtrelenmesi gereken en nemli şey probleme yol açabilecek olan HTML tag'leridir. Bunu yapmanın en kolay yolu bütün HTML'i escape işlemine sokan htmlentities fonksiyon'udur: <?php echo htmlentities ; ?> Bu kod muhtemel XSS saldırılarını kaldırır. Eğer mümkünse, htmlentities fonksiyon'unun üçüncü argümanı'nı da kullanmalısınız. Google'da HTML'i escape işleminde düzgün encoding ayarı yapmadığı için XSS saldırısından etkileniyordu. Google bu açığı 1 aralık'ta kapattı. Basitçe, her zaman encoding tipini belirlemelisiniz: <?php echo htmlentities($_GET , ENT_QUOTES, 'UTF-8'); ?> Eğer bütün HTML tag'lerini filtrelemek istemiyorsanız, bazı tag'lere izin vermek istiyorsanız strip_tags fonksiyon'unu kullanabilirsiniz. Fakat bu, <script> tag'lerini filtreleseniz dahi Javascript ekleme açıklarına karşı bir güvenlik problemi içerebilir. r ( <div onclick="alert ;"> . Diğer bir yntem de sadece sizin istediklerinizi filtrelemenize yarayacak kendi fonksiyon'unuzu yazmanız . Bu bazen en iyi yntem olabilir fakat herhangi bir şeyi unutmanız durumunda güvenlik problemlerine yol açabilirselametle :D:D