PHP sayfalarda formlardan alınan veriler doğrudan işlenmeden önce mutlaka güvenlik kontrollerinden geçirilmelidir. Aksi halde
ve benzeri güvenlik açıklarına kapı açılır. Güvenlik açısından tüm kullanıcı verileri her zaman şüpheli kabul edilmelidir.
XSS (Cross-Site Scripting), kötü niyetli kişilerin bir web sitesine zararlı JavaScript kodları enjekte ederek, diğer kullanıcıların tarayıcılarında bu kodları çalıştırmasını sağlamasıdır. XSS, kullanıcının tarayıcısında çalışan zararlı script’lerdir.
XSS saldırıları genellikle şu amaçlarla yapılır:
Kullanıcının çerez bilgilerini (cookie) çalmak
Kullanıcıyı başka sayfalara yönlendirmek
Formlara gizlice veri yerleştirmek
Oturum (session) bilgilerini ele geçirerek kullanıcı gibi davranmak
XSS Genelde kullanıcıdan alınan veriler temizlenmeden HTML'e yazdırıldığında ortaya çıkar.
SQL Enjeksiyonu, kullanıcıdan alınan verinin doğrudan ve kontrolsüz şekilde SQL sorgusuna yerleştirilmesi sonucunda oluşan bir güvenlik açığıdır. Bu açık, saldırganın veritabanına doğrudan komut göndermesine ve hatta tüm veritabanını ele geçirmesine neden olabilir.
Kullanıcıdan gelen veri, temizlenmeden SQL sorgusuna dahil edilirse, saldırgan veri tabanını manipüle edebilir.
Bir SQL Injection açığını kullanan saldırgan:
Kayıtları silebilir, güncelleyebilir
Kullanıcı şifrelerini görebilir
Sisteme admin gibi giriş yapabilir
Yeni kullanıcılar oluşturabilir
Sunucu dosyalarına erişebilir (ileri düzeyde)
XSS ve SQL saldırılarından korunmakiçin formdan gelen verilerin , kontrol edilmesi gerekir. Bunu içim PHP'de hazır olan fonksiyonlar kullanılabilir..
trim() fonksiyonu, genellikle programlama dillerinde bir stringin (metin) başındaki ve sonundaki boşluk karakterlerini (whitespace) temizlemek için kullanılır.
$str = " Merhaba dünya! ";
$temiz = trim($str);
echo $temiz; // "Merhaba dünya!"
Yukarıda str değişkeninin başındaki ve sonundaki boşluklar kaldırılır. Boşluk dışında baş bir karakterin temizlenmesi istenirse, trim içinde belitilrebilir..
$str = "!!!!!!!Merhaba dünya!!!!!!!!";
$temiz = trim($str,"!");
echo $temiz; // "Merhaba dünya"
Yukarıda str değişkeninin başındaki ve sonundaki "!" ünlem işaretleri kaldırılır.
$str = "...!,,Merhaba, dünya,!.";
$temiz = trim($str,"!.,");
echo $temiz; // "Merhaba, dünya"
Yukarıda str değişkeninin başındaki ve sonundaki "!.," ünlem,nokta ve virgül işaretleri kaldırılır. Merhaba ile dünya arasındaki "," baş veya sonda olmadığı için kalır..
trim fonksyonunun ltrim ve rtrim olmak üzere farklı kullanımları vardır. Ltrim baştan , rtrim sondan temizler. Kullanım genel trim() fonksiyonu ile aynıdır.
Kullanıcının girdiği metinde HTML veya JavaScript kodları varsa, bunları etkisiz hale getirir. Kullanıcının girdiği metin içindeki < , > , " , & gibi HMTL'e özel karakterlerin tarayıcıda çalışmasını değil, görünmesini sağlar. Yani yazılan HTML kodları işlevsiz kalır ve metin gibi algılanır.. XSS saldırılarına karşı kullanılır.
HTML'e özel karakterler metin kodları (html entity) ile kodlanır. Sayfa kaynak kodunda bu dönüşümler görünürken tarayıcıda karakter karşılıkları görünür..
& için & < için < > için > " için " metin kodları kullanılır...
<input type="text" name="mesaj">
// FORMDAN METİN KUTUSUNA GİRİLEN VERİ
<script> alert("haclendin") </script>
<?php
$mesaj=$_POST["mesaj"];
echo $mesaj;
?>
// FORMDAN GELEN VERİ YAZDIRLIRSA
EKRANDA ALERT KUTUSU GÖRÜNÜR
Örneğin formdan gönderilen veri yukarıdaki gibi <script> alert("haclendin") </script> olsun. Bu durumda bu veri sayfaya PHP ile yazdırılırsa javascript çalışır ve ekranda uyarı kutusu görünür. Genelde yorum sayfaları gibi, mesajlrın kalıcı olarak veri tabanına kaydedilip , sayfada sürekli gösterildiği durumlarda, tüm kullanıcılar bu alert ile karşılaşır.
Bunu engellemek için htmlspecialchars() kullanılabilir. Bu durumda yazılan <script> etiketleri , HTML olarak değil metin olarak algılanacağı için ekranda <script> alert("haclendin") </script> metni görünür...
<?php
$mesaj=$_POST["mesaj"];
echo htmlspecialchars($mesaj);
?>
// FORMDAN GELEN VERİ YAZIDIRLIRSA
EKRANDA <script> alert("haclendin") </script> metni GÖRÜNÜR,
YAzılan HTML kod işlevsiz olur..
htmlspecialchars bazen güvenlik için değil , HMTL kodların gösterilmesi gereken durumlarda görsel açıdan da kullanılabilir.
htmlspecialchars() fonksiyonu gibi çalışır ancak daha kapsamlıdır. Sadece HYML'özel karakterlerin değil, metindeki tümözel karakterlerin ($,£ vs) ve türkçe karakterlerinde metinsel kodlamasını yapar. Yani Tüm özel karakterleri HTML entity’ye dönüştürür.
Özetle:
htmlentities() ⇒ Tüm özel karakterleri HTML entity’ye dönüştürür.
XSS gibi saldırılara karşı çok güçlüdür.
Türkçe karakterler ve özel simgeler dahil her şeyi dönüştürür.
Genellikle, kullanıcıdan alınan HTML içeriği güvenli şekilde saklamak ve göstermek için kullanılır.
<?php
$mesaj=$_POST["mesaj"];
echo htmlentities($mesaj);
?>
// FORMDAN GELEN VERİ YAZIDIRLIRSA
EKRANDA <script> alert("haclendin") </script> metni GÖRÜNÜR,
Yazılan HTML kod işlevsiz olur..
İki fonksiyonu aşağıdaki gibi karşılaştırabiliriz...
Özellik | htmlspecialchars | htmlentities |
Sadece <, >, &, ", ' karakterlerini dönüştürür | EVET | HAYIR |
Tüm özel karakterleri dönüştürür | HAYIR | EVET |
Daha yaygın kullanılır (güvenlik için) | EVET | EVET |
Daha kapsamlı dönüşüm sağlar | HAYIR | EVET |
PHP'de strip_tags(), bir metin içindeki HTML ve PHP etiketlerini kaldırır. Yani kullanıcı <b>kalın</b> gibi bir şey girdiyse, sadece düz metin olan kalın kalır. XSS saldırılarına karşı kullanılır.
Ne zaman kullanılır?
Blog, forum gibi içeriklerde kullanıcıdan gelen HTML kodlarını temizlemek için.
Tamamen düz metin istiyorsan.
Basit yorum sistemlerinde.
WYSIWYG editör dışı içerik girişlerinde.
$metin = "<h1>Merhaba</h1> <p>Bu <b>kalın</b> bir metin.</p>";
echo strip_tags($metin);
Merhaba Bu kalın bir metin.
strip_tags() fonksiyonunda bazı etiketlere izin verilebilir.. Örneğin yukarıdaki metinde p ve b etiketlerine izin vermek istersek , fonksiyon aşağıdaki gibi kullanılır.
$metin = "<h1>Merhaba</h1> <p>Bu <b>kalın</b> bir metin.</p>";
echo strip_tags($metin,"<p>,<b>");
Bu kalın bir metin.
Yukarıda p ve b etiketlerine izin verildi. Dolayısıyla bu etiketler HTML İŞLEVELLİĞİNİ KORUMUŞ OLUR!
mysqli_real_escape_string() PHP'de SQL injection (veritabanı saldırıları) gibi güvenlik açıklarını önlemek için kullanılan bir fonksiyondur. Özellikle MySQL veritabanı ile çalışırken, dışarıdan gelen veriyi güvenli hale getirmen çok önemlidir. SQL enjeksiyonlarına karşı veritabanına gönderilecek veriyi temizler.
Bu fonksiyon, veritabanına gönderilmeden önce bir stringin içindeki özel karakterleri (tırnak işareti gibi) kaçış karakteriyle (\) temizleyerek veritabanı sorgularını güvenli hale getirir.
// Kötü örnek – SQL injectiona açık
$kullanici = $_GET['kullanici'];
$sorgu = "SELECT * FROM uyeler WHERE kullanici_adi = '$kullanici'";
Eğer gelen veri doğrudan sorguya yerleştirilirse kullanıcı şunu yazabilir: ?kullanici=' OR 1=1 --
Bu da tüm kullanıcıları listeleyen bir açık yaratır! Bunu yerine veriyi aşağıdaki gibi mysqli_real_escape_string fonksiyonundan geçirmek gerekir..
// Doğru örnek – SQL injectiona kapalı
$kullanici = mysqli_real_escape_string($mysqli, $_GET['kullanici']);
$sorgu = "SELECT * FROM uyeler WHERE kullanici_adi = '$kullanici'";
Notlar:
Bu fonksiyonun düzgün çalışması için veritabanı bağlantısı ($mysqli) aktif olmalıdır.
Sadece string verilerde kullanılır. Sayılar için gerek yoktur.
Modern uygulamalarda hazır sorgular (prepared statements) daha güvenlidir ve tercih edilmelidir.
Toplam 33 Makale
Lütfen yorumlarınızda saygılı, yapıcı ve anlaşılır bir dil kullanın.
Küfür, hakaret ya da spam içerikler onaylanmaz.