Etiket arşivi: php

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.

Php ile Pdf Oluşturmak

Php‘de sertifika, fatura gibi konularda pdf çıktısı almamız gerekebiliyor. Fpdf kütüphanesi pdf çıktısı almamızı kolay bir hale getiriyor. Temel bir kaç özelliğini anlatacağım. Detaylı kullanmak için dökümana bakabilirsiniz. Dökümantasyonda Türkçe çeviri de yapılmış. Hamza Ortatepe’e çevirisi için ayrıca teşekkürler.

Fpdf kütüphanesinin; Türkçe karakterleri desteklemesi için özelleştirilmiş kütüphanesi de mevcut. Türkçe karakter sorunu yaşamamak için buradan indirebilirsiniz.

Basit Kullanım

İlk olarak basit bir pdf sayfası yapalım. Boş bir sayfaya sadece bir yazı yazayım.

<?php
ob_end_clean();
require('tfpdf/tfpdf.php'); 
  
// Instantiate and use the FPDF class  
$pdf = new tFPDF(); 
  
//Add a new page 
$pdf->AddPage(); 
  
// Set the font for the text 
$pdf->SetFont('Arial', 'B', 18); 
  
// Prints a cell with given text  
$pdf->Cell(60,20,'Hello Php Pdf!'); 
  
// return the generated output 
$pdf->Output();
?>

Sertifika Örneği

Özellikle Eğitim Sitelerinde istenilen pdf sertifikaların basit bir örneğini yapacağız. $pdf->Output(); satırı ile kullanıcı tarayıcıda pdf dosyasını görüyor. Dizinde bir yere kaydetmek ve sonradan kullanmak için $pdf->Output(‘F’, ‘dosya-adi.pdf’); satırını kullanabilirsiniz. Özellikle e-posta ile göndermek için bu yolu tercih edebilirsiniz.

<?php
ob_end_clean();
require('tfpdf/tfpdf.php');
  
// pdf değişkenini / objesini olusturma
$pdf = new tFPDF();
  
// yeni sayfa ekleme
$pdf->AddPage('L', 'A4');
  
// font secimi ve yazi boyutu 
$pdf->AddFont('DejaVu', '', 'DejaVuSansCondensed.ttf',true);
$pdf->SetFont('DejaVu', '', 24);

// resim ekleme, A4 boyutunda
$pdf->Image('sertifika.jpg', 0, 0, 297, 210);

// sayfanin ortasina yazi ekleme  
$text = 'Tebrikler, Php ile Pdf dosyası oluşturdunuz';
$pdf->Text(148 - ( $pdf->GetStringWidth($text) / 2 ), 105, $text);
  
// dosya ciktisi
$pdf->Output();
//$pdf->Output('F', 'dosya-adi.pdf');
?>

Farklı Font Kullanımı

Farklı afilli fontlar kullanmak için tercih ettiğiniz fontun ttf dosyasını, “tfpdf/font/unifont/” dizine ekleyerek ve “AddFont”, “SetFont” fonksiyonlarını ekleyerek kullanabilirsiniz.

Umarım faydalı bir yazı olmuştur. Yorumlarınızı bekliyorum 🙂