php-pdo-guvenlik-aciklari-ve-alinabilecek-basit-onlemler

Php PDO Guvenlik Açıkları Videolu Anlatım

Php PDO Guvenlik Açıkları Videolu Anlatım

Arkadaşlar selamlar bugün sizlere uzun uzun güzel bir konu anlatmaya çalıştım aynı zamanda videolu olarakta anlattım ama yazılı olarak da kalsın bir kenarda diye yazılı olarak da anlatacağım.

Bildiğiniz üzere yazılan kodlarda yapılan projelerde php ye yeni giriş yapanlar olsun orta seviye olanlar olsun gözden kaçan hatalar olabilir.Ben aklıma gelenlerden bazılarını sırasıyla listeleyip nasıl bu açıkları kapatacağınızı anlatmaya çalışacağım.

1 – Giriş Kayıt İletişim gibi formlarda post güvenliği

Arkadaşlar giriş,kayıt,iletişim gibi tüm formlarda veriler post edilirken inputtan gelen tüm verileri süzmeden alıyor çoğu kişi süzmediği içinde saldırgan kişiler html taglarını input içerisine ya da farklı birşeyler yazarak veritabanımıza kayıt ettirmeye çalışabilirler.

Böylelikle veritabanımıza html tagları ile birlikte kayıt ettirebilirler bu da en büyük açıklardan birtanesidir ve kapatılması kolaydır arkadaşlar.

Kapatılması için iki güzel harika bi okadar süper fonksiyonumuz var nedir onlar ?

//strip_tags();  //tüm html tağlarını temizler

//trim();  // tüm boşlukları temizler

Bunların kullanımları nasıldır peki ?

<?php

<?php     
$gelenveri = $_POST["veri"];   
echo strip_tags(trim($gelenveri));  
?>

gördüğünüz gibi gelen verileri bu şekilde strip_tags ve trim fonksiyonları ile süzdükten sonra 
veritabanına kayıt ettirirseniz hiç bir html tagları,javascript tagları çalışmayacaktır ve böylelikle 
bu güvenlik açığını kapatmış oluyoruz.

2 – Get Güvenliği

Arkadaşlar get güvenliği konusunda da strip_tags ve trim geçerlidir yani gelen veriyi aşağıdaki gibi almanızı öneririm.

<?php

<?php     
$gelenveri = $_GET["veri"];   
echo strip_tags(trim($gelenveri));  
?>
Bu sayede tarayıcıdan html taglarını kullanarak bir veri ya da formdan html 
tagları,javascript gibi tagları gönderemezler gönderseler bile strip_tags hepsini yok edecektir.

Ek olarak get ile switch case işlemlerinde örneğin admin panelinde şöyle bir yapınız var

islemler.php?islem=uyesil&id=123

bakın bu yapıda veriniz var bu düzenleme de olabilir silme de olabilir.Siz yönetim panelinin temasını header.php,footer.php gibi böldüyseniz sadece header.php de $_SESSION[“yonetici”] kontrolü yaparsınız fakat bu islem.php de switch case kısmına etki etmeyebiliyor.

Bunu bizzat denedim ve gördüm dışarıdan session oluşmadan veri silinebiliyor.Bundan dolayı tüm case kısımlarında ek olarak session kontrolü yapmanızı öneririm. Örnek kod aşağıdaki gibidir.

<?php

<?php     
$islem = strip_tags(trim($_GET['islem']));   
switch($islem){            
case 'uyesil':         
if($_SESSION['admin']){            
//islemleriniz         
}       
break;     
}
?>

Gördüğünüz şekilde tüm case kısımlarında session kontrolü yapmanızı öneriyorum arkadaşlar.

3 – Dizinlere Direkt Olarak Ulaşılmasının Engellenmesi

Arkadaşlar bu kısımda bahsettiğim güvenlik açığı ise örneğin yaptığınız projede /css /img gibi klasörleriniz var bu klasörlere dışarıdan /img klasörüne girdiğimiz anda direk içerisinde olan tüm herşey listeleniyor bu hoş bir şey değil ve güvenlik açığı olarak nitelendirilebilecek bir konudur.

Bunun ise bir kaç çözümü var

// ilgili klasörlere içi boş bir index.php atmak klasörlerin listelenmesini engellemenize yardımcı olur

// htaccess üzerinden dosya ya da klasör engellemesi yapabilirsiniz.

// wordpress de ise htaccess dosyasının sonuna Options -Indexes bunu eklerseniz tüm dizinlere erişimi kapatır.

4 – Header.php Footer.php Gibi Temayı Böldüğümüz Dosyalara Direkt Olarak Erişilmesini Engelleme

Arkadaşlar burada bahsettiğim ise örneğin bir temanız var ve parçaladınız temayı ust.php alt.php sag.php sol.php diye ayırdınız diyelim eyvallah tema parçalamak mantıklı olay tabiki eski bişey diyecek halim yok.Ama gel gelelim burada temayı parçalamak yetmiyor.Gözden kaçırdığınız bir nokta var oda şu www.domain.com/ust.php dediğiniz anda sadece üst kısımın geldiğini göreceksiniz aynı şekilde diğer sayfalarıda çagırdığınızda bu sayfalara direkt olarak erişildiğini göreceksiniz.

Şimdi burada ayırdığınız üst alt sağ sol gibi sayfaları çağırdığınız sayfada yani ana sayfada hani atıyorum index.php var bunda require_once “ust.php” dediğiniz sayfada yani şu kodu yazıyorsunuz

<?php

define("guvenlik",true);

burada yazdığım güvenlik sadece sabit değişkenin ismi oraya ne yazarsanız yazarsınız size kalmış.Şimdi bunu ana sayfada yazdım asıl sayfada yazdım yani bundan sonra diğer sayfaların en üstüne şunu eklemem gerekiyor.

<?php

<?php echo !defined("guvenlik") ? die("Hacker olmaya çalışan biri") : null; ?>

şimdi mesala domainadi.com/ust.php yazdığınız anda die içerisine yazdırdığımız yazı gelecektir.Yani direkt olarak ayırdığımız dosyalara erişemeyecekler.

Örnek = https://yavuz-selim.com/header.php

Bu açığıda kapattık arkadaşlar 🙂

5 – E-posta Kontrolü

Evet yine geldik bir e-posta kontrolüne daha şimdi çoğu kimse sadece html tarafında input type=”email” şeklinde yapıp geçiyor html tarafında @ eksik diye direk uyarı veriyor fakat sayfa kaynağından type=”email” kısmını text yaparak o engeli aşabiliyoruz.Fakat biz bunu hem type=”email” tarafında hem de php tarafında kontrol edersek geçilmesi imkansız hale gelecektir.

<?php

<?php     
$eposta = $_POST['eposta'];  
if(!filter_var($eposta,FILTER_VALIDATE_EMAIL)){        
echo "Eposta yanlış";  
}
?>

Gördüğünüz gibi php tarafında da kontrol ettirdik böylelikle geçemezler bu kısımı.Ek olarak şöyle bir önerim var tüm üye girişlerinde kullanıcı adı yerine e-posta ile giriş yaptırın.Çünkü kullanıcı adını tahmin etmek kolaydır atıyorum yavuz diye kullanıcı adı üzerine bir ton şifre denemesi yaptırabilir ama o kişinin e-posta adresini bulması zor olur. Bundan dolayı e-posta ile giriş yaptırın.

6 – Çift Şifre Girişi

Arkadaşlar aslında bunu önlem olarak görmeyebilirsiniz gereksiz olarak görebilirsiniz ama kayıt ve giriş formunda denemenizi ve uygulamanızı öneririm.Burada bahsettiğim şudur kayıt olurken ve giriş yaparken şifreyi iki kez sordurmak birinci ile ikinci girilen şifre birbirine eşit ise devam etsin değilse uyarı versin botlara karşı çok daha etkili olursunuz.Örnek verelim.

<?php

<?php     
$sifre= $_POST['sifre'];  
$sifre2= $_POST['sifre2'];  
if($sifre == $sifre2){        
echo "şifreler eşleşti";  
}else{         
echo "Şifreler uyuşmadı";  
}
?>

7 – Şifreyi Kriptolama

Arkadaşlar bildiğiniz üzere bu kısımda da md5,sha1 gibi şifreleme fonksiyonlarını kullanacağız.

<?php

<?php     
$sifre= $_POST['sifre'];    
echo md5($sifre); // 32 karakterli kriptolu şifreleme  
echo sha1($sifre): // 40 karakterli kriptolu şifreleme  
echo sha1(md5($sifre)); // iç içe şifreleme 
?>

Arkadaşlar kullanıcını şifresini kriptolu olarak veritabanına kayıt ettirmenizi kesinlikle ve kesinlikle öneririm.Mutlaka bu şekilde yapın hatta en sonda yazdığım gibi iç içe olarak kaydedin.Neden derseniz normal veriyi md5 ile şifreliyorsunuz şifrelenen veriyi de sha1 ile şifreliyorsunuz oldukça güvenli hale gelmiş oluyor 🙂

8 – Şifreyi Hileli Olarak Kullanma Ters Köşe Yaptıralım Hadi

Arkadaşlar burada kendi mantığımı kullanarak bir şey yaptım ve çok güzel oldu bana kalırsa.Bakın şöyle anlatayım örneğin birisi veritabanınızı görüntüleyebildi diyelim.Mesala tüm üyelerin şifreleri md5 diyelim o şekilde yapmışsınız diyelim 32 karakterli dimi herkes bakar 32 karakter gider dışarıdan bir yerden md5 oluşturur yeni üye açar kendini yönetici yapar sizin ruhunuz duymadan hergün yönetimden sizi izler falan filan ya da sha1 olarak görür 40 karakterin sha1 olduğunu anlar gider sha1 oluşturup kendisine yeni kullanıcı açar yine aynı işlemleri yapar.

Fakat ben buna şu tarz bi önlem aldım kendimce.Şimdi şöyle düşünün veritabanına girmeyi başaran hain kişilik tüm üyelerin şifrelerini 32 karakterli olarak görse ama o 32 karakter olan şifre md5 olmasa ? sadece md5 olduğunu sanar ve sürekli md5 oluşturup full kendine yeni kullanıcı açmaya çalışır ya da var olanları md5 sandığı için değiştirmeye çalışır.Ama md5 değil verimiz peki sizce nasıl yaparız bunu ? 🙂

Hemen bir örnek yapalım.

<?php

<?php         
if($_POST){    
//md5    
$sifre = $_POST['sifre'];    
$sifrele = sha1(md5($sifre));    
$kisalt = mb_substr($sifrele,0,32);                
echo $kisalt;
}
?>

Bakın arkadaşlar ne yaptık burada ? gelen veriyi sha1 ile şifreledik fakat veritabanına 0,32 yani ilk 32 karakterini kayıt ettik bu sayede ne oldu veritabanında 32 karakter görünmüş oldu yani giren kişi md5 sanar ve sürekli denese bile eline bir fayda geçmez en fazla yapacağı tüm verilerinizi siler yedekten geri dönersiniz olur biter ya da sunucu değişirsiniz falan yani.Ama kendisine yeni bir üyelik açıp sizi yönetim panelinizden gizlice takip edemez.Neden çünkü bu tür kurnazlık yaptığımızdan dolayı bana göre çok akıllıca bu yöntem kendim düşündüm ve uyguladım çokta güzel oldu. Umarım sizinde işinize yarar.

9 – Dip Not Dibin Dibi Not

Arkadaşlar videoda söylemeyi unutmuş olabilirim burada yazayım.Tüm formlarınızda giriş formu olsun iletişim formu olsun kayıt formu olsun herhangi bir veri eklenen form olsun tüm formlarınızda mutlaka ve mutlaka kesinlikle ve kesinlikle kesin kez ve kesin kez yani bu derece net söylüyorum google doğrulama kodunu kullanın mutlaka kullanın.Şuanda tüm botları yüzde 99 una kadar engelleyen tek ve vazgeçilmezdir çünkü.

Arkadaşlar umarım konumuz faydalı olmuştur ben aklıma gelenleri hem yazılı olarak hem videolu olarak anlattım elimden geldiğince aklınıza gelen varsa sizlerde kanalımdan video altına ya da web sitemden konu altına yorum atarak ulaştırabilirsiniz.

Sonraki konuda görüşmek üzere
Kanalıma abone olmayı unutmayın 🙂..

Similar Posts

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir