Php’de Güvenlik
SQL injection:SQL injection denen method ile veritabanınıza yetkisiz işlem yaptırılabilir.Bunları engellemek için kullanılır.
Htmlspecialchars: Bu komut html deki özel karakterleri html için normal karakterlere dönüştürür.
Htmlspecialchars_decode: Özel html imlerini karaktere dönüştürür.Bir nevi htmlspecialchars in tam tersi görevinde işlev görür.
htmlentities : Girdilerde olduğu gibi dışarıya sunulan tüm verilerin de filtrelenmesi gerekmektedir.
strip_tags() : Formlardan gelen html kodlarını temizlemek için stript_tags() fonksiyonunu kullanılır.
Mysql_escape_string : mysql_escape_string — mysql de kullanmak için stringleri uygun biçime dönüştürür.
SQL injection: Php ile uğraşıyorsanız öğrenmeniz gereken konuların başında gelir.
Bu fonksiyon mysql ‘ e daha güvenli bilgiler yerleştirmek için kullanılır.
SQL injection denen method ile veritabanınıza yetkisiz işlem yaptırılabilir. Bu yetkisiz işlemler ile veritabanınızdaki bir tablo tamamen boşaltılabilir, veriler silinebilir veya veri eklenebilir, daha da kötüsü yazdığınız script bir yönetim paneline sahipse buraya izinsiz girişler olabilir.
Basit bir SQL sorgumuz olsun, url ile gelen id ye sahip makaleyi veritabanından seçelim.
1 |
$query = mysql_query("SELECT * FROM makaleler WHERE id=$_GET['id']", $baglanti); |
Bu şekilde güvende değiliz. Bu kodları nasıl güvenli hale getiririz.
1 2 3 4 |
$id = $_GET['id']; $id = get_magic_quotes_gpc() ? stripslashes($id) : $id; $id= function_exists("mysql_real_escape_string") ? mysql_real_escape_string($id) : mysql_escape_string($id); $query = mysql_query(sprintf("SELECT * FROM makaleler WHERE id='%s'", $id), $baglanti); |
Kodlarımızı düzgün ve güvenli hale getirdik.
Sorgumuzu bu hale getirerek kimsenin SQL’imize dokunmamasını sağlamış oluyoruz.
Kısacası, URL veya POST ile gelen bütün verileri bir filtreden geçirerek, bu gelen verinin içinde bulunabilecek ‘ işaretlerini \’ haline getiriyoruz. Böylece bu gelen verilerdeki zararlı işaretler, sorgumuzun içine karışmıyor ve SQL injection ile sitemize zarar vermek isteyen kişiler avuçlarını yalıyorlar.
htmlspecialchars ve htmlspecialchars_decode : Bu kodların görevlerini kısaca anlatayım sonra örneklere geçelim.
Htmlspecialchars: Bu komut html deki özel karakterleri html için normal karakterlere dönüştürür.
Parametreler :
ENT-QUOTES >> bu parametre ayarlandığında çift tırnak ve tek tırnaklar dönüştürülür.
ENT-NOQUOTES >> bu parametre ayarlandığında çift tırnak ve tek tırnaklar dönüştürülmesi ihmal edilir.
ENT-COMPAT >> bu ön tanımlı parametre ise sadece çift tırnak dönüşümünü yapar tek tırnaklar dönüştürülmez.
1 2 3 4 |
Örnek : $deneme = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); echo $deneme; // &lt;a href='test'&gt;Test&lt;/a&gt; (sag tık kaynagı) |
görüntüle yapınız.
Htmlspecialchars_decode: Özel html imlerini karaktere dönüştürür.Bir nevi htmlspecialchars in tam tersi görevinde işlev görür.
Parametreler: htmlspecialchars fonksiyonunun paremetreleriyle tamamen aynıdır.
1 2 3 4 5 |
Örnek : $str = '<p>this -&gt; &quot;</p>'; echo htmlspecialchars_decode($str); //Çift tırnak dönüştürülmez burda echo htmlspecialchars_decode($str, ENT_NOQUOTES); |
Bu sayede arkadaşlar önemi saldırılardan arınmış oluruz.
htmlentities : Girdilerde olduğu gibi dışarıya sunulan tüm verilerin de (güvenli olarak filtreleyip veritabanına işlediğiniz verilerin dahi) filtrelenmesi gerekmektedir.Filtrelenmesi gereken en önemli şey probleme yol açabilecek olan HTML tag larıdır. Bunu yapmanın en kolay yolu bütün HTML’i escape işlemine sokan htmlentities() fonksiyon’udur.
1 2 3 4 |
Örnek: <?php echo htmlentities($_GET['kelime']); ?> |
htmlentities ile muhtemel XSS (cross site scripting) saldırılarını kaldırırsınız
Eğer tüm html taglarını silmek istemiyorsanız strip_tags() kullanarak bazı html taglarına izin verebilirsiniz.
strip_tags() : Genellikle formdan gelen bilgilerdeki html kodlarını temizlemek için stript_tags() fonksiyonunu kullanırız.Örnek vermek gerekirse bir ziyaretçi formunda,üyelik kayıt formunda,tartışma forumunda vb. gibi yerlerde kullanılabilir.
Kullanım Şekli:
strip_tags($değişken)
1 2 3 4 5 6 7 8 |
Örnek: <?php $mesaj = "<a href=\"index.php\"><b>Ana Sayfamız</b></a><br><br>"; // strip_tags kullanmadan bakalım echo $mesaj; // şimdi strip_tags kullanalım echo strip_tags($mesaj); ?> |
İstedigimiz tagların çalışmasına izin vermek istiyorsak yapmamız gereken;
1 2 3 4 |
<?php $mesaj = "<a href=\"index.php\"><b>Ana Sayfamız</b></a><br><br>"; echo strip_tags($mesaj, "<a><b>"); ?> |
Burada a ve b taglarının çalışmasına izin verdik isteseydik a ya izin vermeyip link özelligini yitirmesini saglardık.
mysql_real_escape_string ve mysql_ escape_string :
Mysql_escape_string : mysql_escape_string — mysql de kullanmak için stringleri uygun biçime dönüştürür.
Kullanim
string mysql_escape_string (string dönüştürülecek _string)
Bu fonksiyon mysql ‘ e daha güvenli bilgiler yerleştirmek için kullanılır.
Bu fonksiyonun kullanımı mysql_real_escape_string() ile aynıdır bir tek farkla. mysql_real_escape_string()
fonksiyonu belirtilen karakter setini dönüşüm yaparken dikkate alır.
1 2 3 4 5 |
<? $ifade = "Ahmet'in Bilgisayarı"; $escaped_ifade = mysql_escape_string($ifade); printf("Dönüştürülmüş string: %s\n", $escaped_ifade); ?> |
Örneğin çıktısı:
Dönüştürülmüş string:Ahmet\’in Bilgisayarı
Mysql_real_escape_string :
1 2 3 4 5 6 |
<? /*MySQL'e gönderilen SQL cümlesindeki özel karakterlerden mevcut bağlantı dilini kullanarak kaçar.*/ $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", mysql_real_escape_string($user), mysql_real_escape_string($password)); ?> |
Php Cache: Neden bu önlemi almalıyız diye bir soru soralım ve cevabını verelim:
Sitemize 4–5 kişi geldiğinde mysql tavan yapabilir.
Database e bağlanamama sorunu olduğunda.
Mysql overload olduğunda.Ve daha fazla birçok sorun yüzünden olabilir tabiî ki. Biz hemen sorunu nasıl hallede biliriz ona geçelim.
Yapacağımız betik(işlem) 2 kısımdan oluşacak birisi sayfamızın en üst kısmında diğeri ise sayfamızın en alt kısmında olması gerekiyor.
Aşağıdaki kısmı sayfanın en üstüne yazılacak kısmı.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<? $filename = "%%-".md5($_SERVER['REQUEST_URI'])."-%%.html"; $cachefile = "cache/".$filename; $cachetime = 3 * 60 * 60; // Cache Süresi if (file_exists($cachefile)) { if(time() - $cachetime < filemtime($cachefile)) { readfile($cachefile); exit; } else { unlink($cachefile); } } ob_start(); ?> |
Aşağıdaki kısmı isi sayfanın en altına yazılacak kısmı
1 2 3 4 5 6 |
<? $fp = fopen($cachefile, 'w+'); fwrite($fp, ob_get_contents()); fclose($fp); ob_end_flush(); ?> |
Temel olarak yapmış olduğumuz işlemleri anlatalım.
Herhangi bir ziyaretçi sayfamıza geldiği zaman url alınıyor ve md5 lenip $cachefile değişkeninin içine aktarılıyor. Daha sonra alt kısma eklediğimiz kodlar devreye giriyor ve yapmış olduğu işlem $cachefile dosyasını yazılabilir bi şekilde açıyor ve yeni bi ziyaretci daha sayfamıza geliyor. Ve üst tarafta yazdığımız kodlar tekrar devreye giriyor. Sitemize gelen 1.kişi ile 2. kişi arasında saat farkı göz önünce bulunduruluyor ve işleme tabir tutuluyor
Burada yapmış olduğumuz kazancı söyleyelim sitemize gelen 2. ziyaretçi mysql sorguları-php sorguları yerine daha önceden anlatmış olup kaydetmiş olduğumuz html dosyasını gösterdik ve kaynaktan tasarruf ettik. Mysql rahatlamış oluyor.
cache süresini $cachetime değişerek kendinize göre ayarlayabilirsiniz
1 |
$cachetime = 3 * 60 * 60; // Cache Süresi 3 saate |