Toplam 271 konuya 1670 yorum yazıldı.
Php PDO Guvenlik Açıkları ve Alınacak Önlemler 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 
 
   $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ÜVENLİĞİ



 



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 
 
   $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 
 
   $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 - DİZİNLERE DİREKT OLARAK ULAŞILMASININ ENGELLENMESİ



 



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 GİBİ TEMAYI BÖLDÜĞÜMÜZ DOSYALARA DİREKT OLARAK ERİŞİLMESİNİ 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 




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 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 = http://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 
  
  $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 - ÇİFT ŞİFRE GİRİŞİ



 



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 
  
  $sifre= $_POST['sifre'];
  $sifre2= $_POST['sifre2'];

  if($sifre == $sifre2){
   
     echo "şifreler eşleşti";

  }else{
    
     echo "Şifreler uyuşmadı";
  }

?>




7 - ŞİFREYİ KRİPTOLAMA



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




<?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 - ŞİFREYİ HİLELİ OLARAK KULLANMA TERS KÖŞE YAPTIRALIM HADİ



 



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 
        
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 - DİP NOT DİBİN DİBİ 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.



Kendinize iyi bakın ve lütfen kanalıma abone olmayı unutmayın :)





https://www.youtube.com/phppdovideoludersler



Hoşcakalın.....




Yorumlar

kolayca indir

24.11.2017 16:13

hayati önem taşıyan php pdo açıklarını düzeltmede detaylı anlatımınız için teşekkürler.

ENES

22.11.2017 17:50

Teşekkür Ederim

YAVUZ SELİM ŞAHİN

22.11.2017 17:32

@ENES bir sıkıntı çıkacağını zannetmiyorum ama sen yinede tamamiyle benzer aynı yapma bunu kendin için yapma yani çünkü başka bir sitenin tasarımıyla aynı tasarımın olursa senin bir farkın kalmaz başka sitenin tasarımını alacağına indir bootstrapten onu geliştir değiştir kendine göre uygula çok daha hoş olur benim görüşüme göre

ENES

22.11.2017 16:14

Merhaba Hocam , Ben Bitane Script Yazıyorum. Bu Scriptin PHP kısmını Tamamen Kendim Yazıyorum. Ama HTML kısmını bi tane sitenin yapısını kullandım. Bir Sıkıntı Çıkarmı ?

Ömer

21.11.2017 23:54

Tamda aradığım içerik vallahi. Php kod yazarlarının ve php alt yapısı kullanan sitelerin bu açıkla karşılaştığını çokça kez gördüm bana yardımcı oldu teşekkür ederim.

YAVUZ SELİM ŞAHİN

20.11.2017 07:02

@Ramazan sağolasın çekicem tabiki söylediğim gibi merak etme biraz kafam allak bullak bu ara çekerim ama yinede kolay o :)

Ramazan

20.11.2017 06:57

Emeğinize sağlık. İlk kez böyle doyurucu ve elzem bir konuda yazılmış bir makale olmuş. Bahsettiğiniz Google recaptha ve favori ekle vs. gibi konuları YouTube scripti üzerinde uygulamalı gösterir misiniz? UDEMY üzerinden 11. Video çekerim demiştiniz.

Yorum Yaz