|

<p>PHP ve Login Güvenliği [SQL]</p>



admin tarafından 2019-08-18 14:46:00 tarihinde yazıldı. Tahmini okunma süresi 2 dakika, 38 saniye. 599 kere görüntülendi.




Disclaimer


The information provided in this blog post is intended for educational and informational purposes only. It is not intended to encourage or promote any illegal or unethical activities, including hacking, cyberattacks, or any form of unauthorized access to computer systems, networks, or data.

Yasal Uyarı
Bu blog yazısında sağlanan bilgiler yalnızca eğitim ve bilgilendirme amaçlıdır. Bilgisayar korsanlığı, siber saldırılar veya bilgisayar sistemlerine, ağlara veya verilere herhangi bir şekilde yetkisiz erişim de dahil olmak üzere herhangi bir yasa dışı veya etik olmayan faaliyeti teşvik etme veya reklamlama amacı taşımaz.
Yasal bilgiler için yasal sayfasını inceleyebilirsiniz .

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.