sql injection ornek
💻 Bilgisayar, 💾 Programlama

PHP ve ezSQL

php logoezSQL, 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

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

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=XtraDB  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=XtraDB  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);

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>
👋 🚨 Yeni yazılardan haberdar olmak ister misiniz? 👇

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir