PHP ve ezSQL

php-logo php-logo   {right}ezSQL, PHP üzerinden veri tabanına erişimi kolaylaştıran hazır bir sınıftır. PHP’nin 4. ve 5. sürümleriyle uyumludur. Justin Vincent tarafından yazılan bu sınıfın kendi sitesine buradan erişilebilir. Eğer kendi sitesine girmek istemezseniz bu yazının yazıldığı dönemdeki son sürümü olan 2.05'i buradan indirebilirsiniz.

Yakuter, ezSQL sınıfının kullanımı ile ilgili çok kapsamlı bir yazı hazırladığından bir daha anlatmayı gereksiz buluyorum.

Bu yazıdaki kod örneğinde ezSQL sınıfı kullanılarak veri tabanına ekleme yapma ve basit sorgularla bilgi çekme örnekleri bulabilirsiniz. Daha önemlisi, veri tabanına erişimde ve web sayfasına çıktı yaparken Türkçe karakterlerde çıkabilecek sorunların nasıl giderilebileceğine dair ipuçları bulabilirsiniz.

Örnekte karakter kodlaması konusunda birkaç şey yapılmıştır:

  1. PHP belgesi UTF-8 without Byte Order Mark (BOM) karakter kodlaması ile kaydedilmiştir.
  2. Asıl çıktıya başlamadan önce HTTP headerında karakter kodlaması ve mime-type doğru olarak belirtilmiştir.
  3. Doğru bir DOCTYPE belirtilmiştir.
  4. HTML meta tagları ile sayfanın kodlanmış olduğu kaynak kodlaması olan UTF-8 belirtilmiştir.
  5. MySQL veri tabanı oluşturulurken karakter seti olarak UTF-8 tercih edilmiştir.
  6. Veri tabanına bağlandıktan hemen sonra, yapılacak sorgular ile alakalı karakter tipi belirtilmiştir. (SET NAMES UTF-8)

Örnekte yukarıda yazan maddelerin tamamının uygulamalarını görebileceksiniz. Kendi projelerinizde bu adımları uyguladığınız zaman herhangi bir karakter problemi yaşamamanız gerekmektedir.

Örnekte aynı zamanda SQL injection güvenlik açıklarına da örnek bulabilirsiniz. Örnekteki güvenlik açığının uygulanabilmesi için php.ini dosyasındaki magic_quotes_runtime değerinin Off olması gerekmektedir. (Dediğim sadece bu örnek için, yoksa magic_quotes_runtime on olunca her şey büyülü bir şekilde güvenli olmuyor.)

Örnek, normalde index.php?id=INTEGERDEGER seklinde bir GET parametresi ile veri tabanından bir bilgi çekmek üzere tasarlanmışken, güvenlik açığından dolayı index.php?id=1' OR 1='1 gibi bir değer için de çalışacak ve veri tabanı tablosundaki tüm bilgileri ekrana yazdıracaktır.

sql-injection-ornek sql-injection-ornek  

Gerekli ezSQL dosyaları ile birlikte kodları bilgisayarınıza indirmek için buraya tıklayabilirsiniz. Kodları doğrudan buradan incelemek için yazının devamına bakmanız yeterlidir.

Veritabanı Yapısı: localhost.sql

[sql] SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /; /!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /; /!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /; /!40101 SET NAMES utf8 */;

-- -- Database: ticaret -- CREATE DATABASE ticaret DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE ticaret;


-- -- Table structure for table kullanici --

CREATE TABLE IF NOT EXISTS kullanici ( ad text NOT NULL, soyad text NOT NULL, id int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;

-- -- Dumping data for table kullanici --

INSERT INTO kullanici (ad, soyad, id) VALUES ('Umut', 'Benzer', 1), ('Hayrullah', 'Çokbilmiş', 2), ('Sercan', 'Kırbaş', 3), ('Haydar', 'Dümen', 4), ('Müge', 'Çalışkan', 11), ('Şaban', 'Ağzıbozuk', 12);


-- -- Table structure for table urun --

CREATE TABLE IF NOT EXISTS urun ( id int(11) NOT NULL AUTO_INCREMENT, urun_adi text NOT NULL, kullanici_id int(11) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

-- -- Dumping data for table urun --

INSERT INTO urun (id, urun_adi, kullanici_id) VALUES (1, 'Soba', 1), (2, 'Batarya', 1), (3, 'Batarya', 2), (4, 'Projektör', 2); [/sql]

index.php

 <?php header("Content-Type: text/html; charset=utf-8"); header('X-Easter-Egg: Abidik Gubidik'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="tr-TR"> <head profile="http://gmpg.org/xfn/1"> <!-- EgeBK PHP Kursu Örnek Kaynak Kodları --> <title>Veri Tabanı Deneyi</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="author" content="Umut Benzer" /> </head> <body> <form action="index.php" method="post"> <label for="name">Name</label> <input type="text" id="name" name="name" size="30" /> <label for="lastname">Lastname</label> <input type="text" id="lastname" name="lastname" size="30" /> <button type="submit">Yallah</button> </form> <?php /* İnit */

// ezSQL include_once "ez_sql_core.php"; include_once "ez_sql_mysql.php"; // Veritabanı yapılandırması $vt_kullanici="root"; $vt_parola=""; $vt_isim="ticaret"; $vt_sunucu="localhost"; // ezSQL sınıfından bir nesne... $db = new ezSQL_mysql($vt_kullanici,$vt_parola,$vt_isim,$vt_sunucu);

// Dil ayarlaması $db->query("SET NAMES utf8");

/* Son Eklenen Kullanıcının Sistemden Çekilmesini Gösteren Bir Örnek */ // $kullanici = $db->get_row("SELECT ad,soyad FROM kullanici ORDER BY id DESC LIMIT 1"); // echo "Adı: ". $kullanici->ad . " Soyadı: " . $kullanici->soyad . "<br />\n";

if(isset($_POST["name"]) && isset($_POST["lastname"])) {

// Güvenlik önlemleri $name = $db->escape($_POST["name"]); $lastname = $db->escape($_POST["lastname"]); // Aşağıdaki satırlar potansiyel güvenlik açıkları yaratır. // $name = $_POST["name"]; // $lastname = $_POST["lastname"]; // Asıl satır $db->query("INSERT INTO `kullanici` (`ad`, `soyad`) VALUES ('".$name."', '".$lastname."');"); echo "Yeni kayıt eklendi.";

}

/* SORUMLULUK REDDİ: AŞAĞIDAKİ SATIR CİDDİ GÜVENLİK AÇIKLARI İÇERİR. */ if(isset($_GET["id"])) { ?><table><?php $sql = "SELECT * FROM `kullanici` WHERE id='".$_GET["id"]."'"; echo "Yaratılan SQL cümleciği: " . $sql . "<br />\n"; $sonuclar = $db->get_results($sql); //echo var_dump($sonuclar); if(!is_null($sonuclar)) { foreach($sonuclar as $sonuc) { echo "<tr>"; echo "<td>".$sonuc->id."</td>"."<td>".$sonuc->ad."</td>"."<td>".$sonuc->soyad."</td>"; echo "</tr>"; } } } echo "</table>"; /* DENEYİN: index.php?id=1' OR 1='1 */ ?> </body>