Ali Can Gönüllü tarafından 2019-08-18 14:46:00 tarihinde yazıldı. Tahmini okunma süresi 2 dakika, 38 saniye.
Çalışmalarım için bağış yapmak isterseniz Patreon hesabımdan bağışta bulunabilirsiniz.
Blog adresinde yazılanlar sadece eğitim amacıyla deneysel olarak hazırlanmıştır. Konu içerisinde geçen yöntemleri kendi oluşturduğunuz test ortamında denemenizi tavsiye ederiz.
Herhangi bir tarih, yer ve/veya mekanda oluşacak zararlardan alicangonullu.org, alicangonullu.org yöneticisi ve/veya konu yazarı mesul değildir.
Merhabalar
Bu yazımda sizlere Login panelde güvenliğinizi sağlamanız için ipuçları vereceğim. Ancak öncelikle bu yazının kötü niyetli kullanımları için sorumluluğumu reddetmek için Yasal Beyanımı yazıyorum. Keyifli okumalar.
Öncelikle size SQL Injection zaafiyetini basitçe açıklamam gerekiyor.
SQL Injection : Bilgi hırsızlığına dayanan bir zaafiyettir. Kurbanın kişisel verilerine, veritabanına ve hatta shell yöntemiyle sunucusuna ulaşmak için sık sık kullanılan bir yöntemdir. Blind ve Union Based gibi çeşitleri vardır. Ancak biz bugün Login ile çekmeyi göstereceğiz.
Login SQL Injection : Kurbanın panel kısmına SQL Injection da kullandığımız bazı kod dizilerini kullanarak sızma yaptığımız zaafiyet türüdür.
Şöyle ki bu açıklar genelde query() ile çekilen verilerde oluyor. Bu konudaki yazıma şuradan ulaşabilirsiniz. Tabi biz de farklı bir şey yapmayacağız. Sadece query() ile güvenli bir kod yazacağız.
Gerekli yazıları tamamladığımıza göre örnek bir veritaban oluşturalım :
CREATE TABLE `admins` (
`id` int(11) NOT NULL,
`kadi` varchar(255) CHARACTER SET utf8 NOT NULL,
`pass` varchar(255) CHARACTER SET utf8 NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
Uzmanlar için : Auto Increment kullanmamamın nedeni çoklu admin şuan denemeyeceğiz. Ancak tabi siz bu değeri vererek çoklu kullanıcı yapabilirsiniz.
Oluşturup PDO ile veritaban bağlantımızı kurduğumuza göre (kurmayı bilmiyorsanız yorumlarda belirtin) artık giriş kısmını yapabiliriz.
Bu yöntemde iki alternatif kodumuz var.
1. Kod :
require_once("conn.php");
$name = $_POST["user"];
$pass = $_POST['pass'];
$query = $db->query("SELECT * FROM admins WHERE kadi=" . $db->quote($name) . " && pass =" . $db->quote($pass) . "",PDO::FETCH_ASSOC);
if ( $say = $query -> rowCount() ){
if( $say > 0 ){
session_start();
//Session Girisi
}
}else{
echo 'HATA: Oturum Açılamadı!';
}
Burada güvenliği sağlayan $db->quote($deger) kısmıdır bu kısım filtre görevi görür (öninceleme işlemi) ve SQL ile eşleştirir. Bunu şöyle de yapabilmemiz mümkün.
Ayrıntılı bilgi için : https://www.php.net/manual/tr/pdo.quote.php
require_once("conn.php");
$query = $db->query("SELECT * FROM admins WHERE kadi=" . $db->quote($_POST["user"]) . " && pass =" . $db->quote($_POST['pass']) . "",PDO::FETCH_ASSOC);
if ( $say = $query -> rowCount() ){
if( $say > 0 ){
session_start();
//Session Girisi
}
}else{
echo 'HATA: Oturum Açılamadı!';
}
Burada ise POST isteklerini direkt formülün içerisine gömerek fazla kodlardan kurtulduk. Ancak strip_tags() veya intval() kullanmak isterseniz ilk yöntemi tavsiye ederim.
Konumuz bu kadardı arkadaşlar. Okuduğunuz ve değerli zamanınızı ayırdığınız için teşekkür ederim.