İncelediğim kadarıyla son yıllarda oldukça sıkı ve neredeyse eksiksiz veritabanı sınıfları yazılmış. Basit bir giriş için bile bu sınıfların ağır geldiği durumlar oluşabiliyor. Bende bu sorunum için kendime basit/minik bir çalışma yaptım. Gelecekte ihtiyaç duyma ihtimalime karşı burada not alarak paylaşmak istedim. Tabi unutulmamalıdır ki güvenlik ciddi bir şekilde ele alınması gereken önemli bir geliştirme adımıdır. Asla gözardı edilmemeli, asla basit bir geçiştirme ile ele alınmamalıdır. Yazımın sonunda bu anlamda bir kaç önerim daha olacak.
Öncelikle basit bir giriş arayüzü hazırladım. Inputlarımızın isimleri email ve pass
Bu formumuzda üretilen veriyi post ile gönderdiğimiz dosyamızın adı gelen.php . Bildiğiniz gibi geliştiricilerin çoğu php dosyalarının sonunda php etiketini kapatırlar. Bu bazen nedenini anlamıdığımız boşlukların oluşmasına sebebiyet verebiliyor. Bu sebeple bu PHP dökümanlarınızın etiketlerini kapatmayın, bizde kapatmıyoruz. Örnek verelim;
Eski anlayış;
<?php /** * User: hmustak * Date: 12.09.2016 */ // Eski Anlayış function hata($mesaj){ return $mesaj; } ?>
Yeni anlayış;
<?php /** * User: hmustak * Date: 12.09.2016 */ // Yeni Anlayış function hata($mesaj){ return $mesaj; }
Gelen verileri işlediğimiz gelen.php dosyası ile ilgili bir detaya daha dikkat ediyor olacağız; direkt konumuz değil ama gelen verileri veritabanımız üzerinde sorgulayacak ve çekeceğimiz için PHP grubu, kendi sitelerinde de duyurdukları üzere PHP5.5’den itibaren mysql_ ile başlayan etiketleri kaldırdı ve destek vermiyor olacak. Geliştirmelerinizde buna dikkat etmenizi önereceğim.
Yazıda da gördüğünüz üzere bunun için kullanılmasını önerdiği alternatifler: PDO (Php Data Objects), Mysqli (Mysql Improved Extension). Yazımızın konusu basit güvenlik olduğu için şimdi değil ama müsait bir zamanda özellikle PDO konusunda bir şeyler yazmak istiyorum.
Sonunda geldik gelen.php dosyamıza;
// Post ile gelen basit veri güvenliğini sağlayan fonksiyon function guvenlik($gelen){ $giden = addslashes($gelen); $giden = htmlspecialchars($giden); $giden = strip_tags($giden); $giden = htmlentities($giden); return $giden; } // MySQL Bağlantı $mysql_connection = new mysqli($mysql_host, $mysql_user, $mysql_pass, $mysql_db); // Gelen Bilgiler $gelen_email = mysqli_real_escape_string($mysql_connection, guvenlik($_POST['email'])); $gelen_pass = mysqli_real_escape_string($mysql_connection, guvenlik($_POST['pass'])); echo $gelen_email . "-" . $gelen_pass ;
Gördüğünüz gibi gayet basit ama etkili.
- POST ile gelenleri önce guvenlik() fonksiyonumuza gönderiyoruz
- Güvenlik fonksiyonumuz altında sırasıyla addslashes, htmlspecialchars, strip_tags, htmlentities alt fonksiyonlarından geçiyor
- Sonra mysqli_real_escape_string fonksiyonumuza mysql bağlantımızla tekrar sokup, son halini veriyoruz.
Hakan Müştak @2016/08
Kaynakça;
http://php.net/manual/tr/function.addslashes.php
http://php.net/manual/tr/function.htmlspecialchars.php
http://php.net/manual/tr/function.strip-tags.php
http://php.net/manual/tr/function.htmlentities.php
http://php.net/manual/en/mysqli.real-escape-string.php
http://php.net/manual/tr/class.pdo.php
http://php.net/manual/en/class.mysqli.php
Bir yanıt yazın