Composer Nedir, Kurulumu ve Kullanımı

Composer, Php için bağımlılık yönetimini sağlamaya yarayan araçtır. Kullanılan paketlerin/kütüphanelerin kurulmasını ve güncellenmesini sağlar. Nils Adermann ve Jordi Boggiano tarafından geliştirilmiş ve 2012 yılının mart ayında yayınlanmıştır. Node.js npm’den ve Ruby bundler’dan esinlenmişlerdir. Komut satırı(terminal/cli) üzerinden kullanılır ve dört temel komutu bulunur.

require: İstenilen bir paketi composer.json dosyasına ekler ve kurar
install: composer.json dosyasında bulunan tüm paketleri kurar
update: composer.json dosyasında bulunan tüm paketleri günceller
remove: İstenilen bir paketi composer.json dosyasın siler ve paketi kaldırır

Kurulum

Composer resmi sitesinde, farklı işletim sistemleri için kurulum yönergeleri bulunmaktadır. Dikkat edilmesi gereken, composer’ı işletim sistemine global olarak kurmaktır. Bu yöntemle daha kolay bir kullanım sağlanacaktır. Kurulum sonrasında aşağıdaki komutla kontrol sağlanabilir.

composer -v

Kullanım

Örnek kullanım olması için dotenv kütüphanesini kuralım ve kullanalım. Kütüphane proje genelinde kullanacağımız değişkenleri “.env”(genelde) dosyası üzerinden tanımlamak ve ihtiyaç duyulan yerlerde kullanmak için geliştirilmiş. Kütüphaneyi kurmak için aşağıdaki komutu çalıştırıyoruz.

composer require vlucas/phpdotenv

Bu komut, yoksa proje kök dizininde composer.json ve composer.lock dosyalarını ve vendor klasörünü oluşturur. Şimdi .env ve index.php dosyalarını oluşturalım.

ORNEK_DEGISKEN="Merhaba Dünya!"
<?php

require __DIR__ . '/vendor/autoload.php'; // composer ile gelen autoloader

use Dotenv\Dotenv; // kurduğumuz dotenv kütüphanesini dahil ediyoruz

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

var_dump($_ENV['ORNEK_DEGISKEN']);

Kapanış

Php’nin temel konusu olan composer’ı kısaca anlatmaya çalıştım. Elbette daha anlatıması gereken konuları vardır. Yazıya ilgi ve soru gelirse genişletmeye çalışacağım. Yorumlarınızı bekliyorum. Paylaşmayı unutmayın 🙂

XSS Nedir?

Cross Site Scripting kelimelerinin kısaltmasıyla oluşan ve önlem alınmadığında korkulu rüya olabilecek bir tehlike. Çapraz siteler arasında script çalıştırma, kullanıcı bilgilerini ele geçirme gibi bir çok riske sebep olan bir yöntem. Hackerlarınsa en sevdiği yöntemlerden bir tanesi. Peki işin temeli nedir, nasıl çalışır önce kısaca ona bakalım.

XSS Nasıl Çalışır?

Gün içerisinde bir çok siteyi ziyaret ediyoruz ve oturumlarımız hep açık. Google, Facebook, Twitter, Borsa Ekranları ve bazen banka ekranlarımız gün boyu ya da günün bazı zamanlarında açık ve online. Bu da demek oluyor ki Sekme açık olmasa bile oturumlarımız aslında açık. Bankaların oturum süre kısıtlaması birazdan mantıklı gelmeye başlayacak. Açık olan bu oturumlarımıza; kötü niyetli bir hacker ya da kullanıcı, ziyaret ettiğimiz farklı bir siteler aracılığıyla erişim sağlayabilir. Dilediği işlemi yapabilir. Örneğin Facebook üzerinden bir sayfayı haberiniz olmadan size beğendirebilir ya da banka hesabınızdan haberiniz olmadan işlem yapabilir. Bu bazen korsan siteler üzerinden olabilirken eğer önlem alınmamışsa çok sık ziyaret edilen bir site üzerinden de yapılabilir. Bugün bilinen ve güvendiğimiz bir çok web sitesi üzerinden kötü niyetli kullanıcıların benzer saldırıları gerçekleşti. Elbette siteler kullanıcılarının güvenliği için her geçen gün daha çok önlem almaya devam ediyor. Bu durum aslında hackerlarla geliştiriciler arasında bitmeyen bir savaşa benziyor.

XSS’e Nasıl Önlem Alınabilir?

Önlem almak için kullanıcıların verilerinin kaydedildiği ve özellikler tüm kullanıcılara sunulduğu noktalarda veriyi süzmek gerekir. Php‘de bunun için htmlspecialchars() fonksiyonu bulunmakta. Bu fonksiyon aracılığıyla html tagları, kullanıcı tarafında çalıştırılamayacak hale getirilir. Ancak bu kesin çözüm değildir. Kötü niyetli kullanıcılar farklı teknikler geliştirerek bu fonksiyonun etrafından dolanmayı başarabilmektedir. jsfuck.com’daki örnek gibi farklı karakterlerle javascript betikleri yazmak mümkün olabiliyor. Elbette güncel tarayıcılar bu tarz açıklar için önlem alıyor ancak her kullanıcı güncel olamayabiliyor. O nedenle template sistemi kullanmak önemli. Bir çok geliştirici tarafından geliştirilen ve topluluk tarafından farklı testlere tabi tutulan sistemlerle daha güvenli kalmam mümkün olabilir. Özellikle Frameworklerin sundukları template sistemleri tercih edilebilir. Laravel Blade vs gibi.

Kapanış

Yazıyı yazarken aklıma tarayıcıların sekme özelliğini sundukları dönemler aklıma geldi. Bu dönemler aslında XSS açıklarının ayyuka çıktığı dönemlerdi. Büyük siteler büyük açıklarla karşı karşıya kalmışlardı ve önlem almaları zor olmuştu. O karanlık dönemler geride kaldı ancak %100 güvenlik diye bir şey yok. Her zaman tetikte olmakta fayda var. Her zaman söylendiği gibi, %100 güvenlik istiyorsanız sunucuyu kapatıp uyuyabilirsiniz 🙂 Yorumlarınızı bekliyorum.

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.