PHP ve Login Güvenliği [SQL] | alicangonullu.biz

PHP ve Login Güvenliği [SQL]

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.

loginsqlinjection

Şö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.


Belge / Video Eki
Belge / Video Eki Yok

Ali Can Gönüllü | Blog