Etiket arşivi: mysql

Sql Injection Nedir?

Konu yazılım güvenliği ve veri güvenliği olduğunda en önemli başlıklardan birisi elbette Sql Injection’dır. Tanımını yapmak gerekirse; sql komutları arasına zararlı eklemeler, düzenlemeler yaparak veritabanına erişmek diyebiliriz. Bu erişim izinli olmayan verilere ulaşmak olabilir. Verileri silmek olabilir. Hatta fantastik boyutlarda sunucuya root erişimi bile olabilir. Bu nedenle sql injection’a karşı önlem almak önemlidir.

Nasıl Yapılıyor?

Php ve Mysql kullandığım için örneklerim onlar üzerinde olacak. Yazılım katmanında, veritabanına sorgu gönderirken aslında bir text oluşturuyoruz. Yani aslında Sql sorgusu oluşturuyoruz. Bu sorgunun içerisine eklediğimiz değişkenlerle de dinamik hale getiriyoruz. Örneğin bir kullanıcının verilerini almak ya da kullanıcının verilerini güncellemek gibi. Sorgu içerisinde kullanılan değişkenler kötü niyetli kişiler tarafından manipüle edilmeye çalışılıyor. Çok Basit bir sorgu ile göstereyim. Senaryomuzda login esnasında yaptığımız sorguyu baz alalım ve kullanıcıdan gelen veriler üzerinde her hangi bir kontrol yapmayalım.

Nasıl Önlem Alınabilir?

Öncelikle kullanıcı tarafından gelen verileri filtreden geçirmek önemli. Sadece sql injection için değil XSS için de filtreleme yapmak önemli. Bunun için htmlspecialchars fonksiyonu kullanılabilir. Ancak veritabanı güvenliği için kullanılacak fonksiyonlar yeterli değil. Geçmişte kullanılan fonksiyonlarda vardı. Ancak bunların güvensiz oldukları ortaya çıktı. O nedenle veritabanı sorgularını yaparken Php Pdo ya da Orm kullanmak çok önemli. Bunları kullanırken de doğasına uygun kullanmak önemli. Pdo kullanırken değişkenleri sorgunun içerisine doğrudan yazmak risk oluşturacaktır.

Alınabilecek yazılım önlemleri dışında kullanılan versiyonları güncel tutmak da çok önemli. Php, Mysql, Postgresql, Apache, Nginx vb bir çok yazılımdan kaynaklanan güvenlik sorunları olabilir. Kullanılan yazılımların son sürümlerini takip etmek ve güncel kalmak da önlem alma noktasında çok önemlidir.

Toparlarsak

Çok önemli olan sql injection ve veritabanı güvenliği hakkında kısaca bilgi vermek istedim. Eksik olduğunu düşündüğünüz ya da ekleme yapmak istediğiniz konular olursa yorum yapmaktan geri durmayın. Okuduğunuz ve paylaştığınız için teşekkürler 🙂

Php Pdo Kullanımı

Php Data Objects kelimelerinin kısaltması olan PDO’yu Türkçe’ye Php Veri Nesneleri olarak çevirebiliriz. Veritabanına erişmek için hafif, tutarlı ve güvenli bir arayüz sunması nedeniyle PDO yoğun olarak tercih edilmekte. Özellikle Sql Injection riskine karşı en güvenli tercihlerden birisi. Elbette sunulan kullanıma uygun olarak, “prepared query” tercih edilirse. Popüler veritabanları olan Mysql, MariaDb ve PostgreSql gibi bir çok veritabanını desteklemekte. Sql dilini kullanarak sorgularımızı yapabiliyoruz.

Öncelikle PDO’nun aktif edilmesi gerekiyor. php.ini dosyasından, “;extension=php_pdo_mysql.dll” satırının başındaki noktalı virgül kaldırılımalı ve apache yeniden başlatılmalı. Sonrasında PDO’yu kullanılabilir.

Veritabanına Bağlanmak

Konu veritabanı olduğunda güvenliği elden bırakmamakta fayda var. Her ihtimale karşı, olası bir sql injection riskini bertaraf etmek için veritabanını oluştururken, kullanıcı oluştururken gerekli olmayan yetkileri vermemek önemli. SELECT, INSERT, UPDATE ve DELETE fonksiyonları dışında yetki verirken dikkatli olmakta fayda var. Pdo ile veritabanına aşağıdaki gibi bağlanıyoruz. Bu kısmı dbConnect.php gibi bir dosyaya koyabilirsiniz.

<?php

$sunucu = 'database';
$dbAdi= 'db_adi';
$dbKullanici = 'db_kullanici';
$dbSifre = 'db_sifre';

$dsn = "mysql:host=$sunucu;dbname=$dbAdi;charset=UTF8";

try {
	$pdo = new PDO($dsn, $dbKullanici, $dbSifre);

	if ($pdo) {
		echo "$dbAdi veritabanina baglandiniz";
	}
} catch (PDOException $e) {
	echo $e->getMessage();
}

Tablodan Verileri Çekmek: SELECT

Tablodan veri çekmek için kullandığımız SELECT fonksiyonuyla bir örnek yapalım. WHERE koşulunda kullanacağımız verinin değişkenden gelmesi önemli.

<?php

include 'pdo.php';

$dogumYili = 1990;

$sql = 'SELECT *  FROM ornek WHERE dogum_yili < :dogum_yili';

$sorgu = $pdo->prepare($sql);
$sorgu->bindParam(':dogum_yili', $dogumYili, PDO::PARAM_INT);
$sorgu->execute();
$veriler = $sorgu->fetch(PDO::FETCH_ASSOC);

var_dump($veriler);

Tabloya Veri Eklemek: INSERT

Tabloya veri eklemek için INSERT fonksiyonunu kullanacağız. Sql sorgusunu yardığımı satıra, değişen ekleyerek veri girişi asla yapmayın. Bu yol veri güvenliği riskine yol açabilir!

<?php

include 'pdo.php';

$isim = 'Sakin';
$soyisim = 'Adam';
$yil = 1987;

$sql = 'INSERT INTO ornek(isim, soyisim, dogum_yili) VALUES(:isim, :soyisim, :yil)';

$statement = $pdo->prepare($sql);

$statement->execute([
	':isim' => $isim,
	':soyisim' => $soyisim,
	':yil' => $yil,
]);

$insertId = $pdo->lastInsertId();

var_dump($insertId);

Tablodan Veri Güncelleme: UPDATE

<?php

include 'pdo.php';

$id = 2;
$isim = 'Sakin Edit';

$sql = 'UPDATE ornek SET name = :isim WHERE id = :id';

$update = $pdo->prepare($sql);

$update->bindParam(':id', $id, PDO::PARAM_INT);
$update->bindParam(':isim', $isim);

if ($update->execute()) {
	echo 'Basariyla guncellendi!';
}

Tablodan Veri Silmek: DELETE

<?php

include 'pdo.php';

$id = 2;

$sql = 'DELETE FROM ornek  WHERE id = :id';

$delete = $pdo->prepare($sql);
$delete->bindParam(':id', $id, PDO::PARAM_INT);

if ($delete->execute()) {
	echo 'Basariyla silindi';
}

Toparlayalım 🙂

Temel 4 sorgu olan SELECT, INSERT, UPDATE ve DELETE üzerinden Php Pdo’yu anlatmaya çalıştım. Atladığım kısımlar varsa ya da başka sormak istedikleriniz olursa yorum bırakabilirsiniz.

Mysql Nedir?

Mysql, ilk sürümü 1995 yılında yayınlanmış, sql tabanlı bir veri tabanı yönetim sistemidir. Şu an en güncel sürümü 5.6.12 (2013) olan Mysql; başlangıçta bir vakıf tarafından geliştirilse de, Ocak 2008’de Oracle tarafından satın alındı.

Açık kaynaklı olması ve ticari kullanımlar dışında ücretsiz olması nedeniyle; başta Php olmak üzere, bir çok platformda geliştiriciler tarafından kullanmakta. Satışı sonrası ücretli olması çekincesiyle PostgreSql’e yönelim başladı ancak bu sayı henüz ciddi seviyelerde değil. Satış öncesi gelişimine yardımcı olan bir çok yazılımcı, bugün aynı desteği PostgreSql için vermektedir.

Mysql en iyi performansını Linux üzerinde verse de, Windows ve Unix sistemler üzerinde de çalışabilmekte. Daha çok Php ile özdeşleşse de, diğer sunucu taraflı diller tarafından da kullanılabilmekte / kullanılmaktadır.

Sql Nedir?

SQL; Structured Query Language(Yapılandırılmış Sorgu Dili) kelimelerinin baş harflerinin birleşiminden oluşmaktadır. Verilerin depolanması, işlenmesi ve kullanılması neredeyse tüm masaüstü programcılığında ve web programcılığında kullanılmaktadır. IBM labaratuvarlarında çalışan, Donald D. Chamberlin tarafından, 1970 yılında geliştirilmiştir.

SQL’in en büyük özelliği, birçok veri tabanı sistemi tarafından kullanılıyor olmasıdır. Başlıca; Mysql, Mssql, Postgresql, Oracle, Access tarafından kullanılmaktadır. Unuttuğum varsa affola. Bu veri tabanı sistemleri arasında Oracle kuşkusuz en güçlü olanıdır. Ancak ücretsiz olması nedeniyle Mysql daha çok tercih edilmektedir. Yakın tarihte; Mysql’in Oracle tarafından satın alındı. Halen ücretsizdir ancak geliştiriciler her duruma karşı Postgresql’e yönelmeye başladılar. Bir çok geliştirici de veri tabanı işlemlerinde farklı kütüphaneler kullanarak, kötü senaryodan etkilenmemek için şimdiden önlem almış durumda.

SQL’de en çok 4 temek fonksiyon kullanılmakta.

Veri Girişi Yapmak için INSERT
“INSERT tablo_adi(ad,soyad) VALUES(‘sakin’,’adam’)”

Verileri Seçmek için SELECT
“SELECT * FROM tablo_adi WHERE ba=’1′”

Veri Güncellemek için UPDATE
“UPDATE tablo_adi SET ad=’Sakin’, soyad=’Adam’ WHERE ba=’1′”

Veri Silmek için DELETE
“DELETE FROM tablo_adi WHERE ba=’1′”

SQL dilinde en çok kullanılan fonksiyonlar bunlardır, ancak sadece bu fonksiyonları bilmek, SQL dilini bilmek anlamına gelmiyor. SQL dilini öğrendikçe, onun nimetlerinin farkına varacaksınızdır.

Son yıllarda NoSql ortaya çıktı. Bu sistemler Gigabaytlarla ölçülen büyük veriler için kullanılmakta. Bu sistemler SQL dilinin yeteneklerine sahip olmasa da performans açısından yüksek puanlar almakta. Özellikle google gibi büyük verilerle çalışan firmalar tarafından tercih edilmekte ve geliştirilmektedir.