Güvenlik Önlemleri


    × Bunları biliyor muydunuz?
"Başlangıç kontrolcüsü üzerinden $this nesnesini data olarak göndererek statik olmayan sınıflara ilgili data üzerinden erişebilirsiniz."


ZN Framework'te bir dizi güvenlik önlemi alınmıştır. Form verilerinin güvenliğinden tutun da URL üzerinden yapılabilecek türm saldırılara karşı bazı güvenlik yöntemleri geliştirilmiştir.  

 

# Bölüm Başlıkları

# URL
# Form
# Database
# Request
# Session & Cookie

 

# URL Güvenliği


URL üzerinden yapılan veri gönderimlerinde hangi karakterlerin izole edileceği belirlenebilir.  Aşağıdaki config dosyasında gerekli yapılandırma ayarları mevcuttur. Aşağıda yer alan urlChangeChars dizisine engellenmesini istediğiniz karakterleri ekleyebilirsiniz.

File: Settings/Security.php
'urlChangeChars' =>
[
    '<'  => '',
    '>'  => '',
    "'"  => '',
    '"'  => '',
    ':[' => 'badrequest'
]

Yukarıdaki ayar dosyasında belirtilen karakterler sistem tarafından otomatik olarak izole edilecektir. Böylece URL üzerinden hangi karakterin gönderimine engel koyacağınızı belirleyebilirsiniz. 

Aşağıda örnek bir URL üzerinden enjeksiyon içerikli bir gönderimin yapılması üzerine örnek verilmiştir.

Example: domainname.com/data/id/1 ' or 1 = 1
echo URI::get('id');
Output: 1 or 1 = 1

Dikkat edilirse tırnak(') işareti izole edilmiştir.

 

# Form Güvenliği


Form güvenliği formlardan gelen post ve get datalarının manipüle edilemesi üzerine dayanır. Form güvenliklerini sağlayabilmeniz için ZN içinde bir kaç kütüphane yer alır. Formlardan gelen verileri $_POST ve $_GET gibi klasik globaller ile almak yerine ZN için oluşturulan Method::get() ve Method::post() yöntemlerini kullanın. Bu yöntemler postlar üzerinden gelen HTML içerikli karakterleri izole etmiş olacaktır.

Post::secure('<script>alert(1)<script>');
echo Post::secure();
Output: <script>alert(1);<script>

Görüldüğü gibi HTML karakterleri dönüştürülür. Bu kütüphane arkaplanda gelen veriyi belli bir güvenlik süzgecinden geçirerek sunar.

 

# Database Güvenliği


ZN Framework'ün Database kütüphanesi iç yapısında bir takım güvenlik önlemlerini devreye sokar. ZN yapısına uygun sorgularda enjeksiyon açığı yoktur. Ancak düz query'ler yazılırsa bu durumda kullanıcıların bir takım güvenlik önlemi alması gerekir. Bunun ilgili Database kütüphanesinin kullanımı bölümünde gerekli bilgiler aktarılmıştır. Ancak yinede basit bir örnek vermekte fayda var.

Güvenli Sorgu

DB::where('column', $data)->get('table')->result();

Yukarıdaki yöntemde $data parametresi enjeksiyon güvenliğinden geçerek gönderilir. 

DB::secure(['x:' => $data])
  ->query('SELECT * FROM table WHERE column = x:')->result();

Artık $data gerekli güvenlik süzgecinden geçer. Ve sorgumuz daha güvenli bir sorgu haline gelmiştir.

Güvensiz Sorgu

DB::query('SELECT  * FROM table WHERE column = ' . $data)->result();

Yukarıdaki yöntemde hiç bir güvenlik kontrolü yoktur. Bunu şu şekilde güvenli hale getirebilirsiniz.

INT Çevirimi (ZN >= 4.2.6)

ID gibi sayısal değer alması gereken sütunlara gelen değerleri Int türüne çevirmek için aşağıdaki gibi kullanımda belirtilen sürüm ve sonrası için geçerlidir. Bunun için 1. parametre int:kolon formunda kullanılır.

echo DB::where('int:id', 'test')->getString('ExampleTable');
SELECT * FROM ExampleTable WHERE id = 0

Çıktıda görüldüğü gibi int: ön eki getirilmiş sütuna gelen değer sayısal olmasa bile sayıya çevrilmiştir.

 

# Request Güvenliği


Ajax isteklerinde ajax gönderimi yapılan kontrolcünün yada sayfanın başına aşağıdaki kodu eklerseniz geçersiz AJAX isteğini engellemiş olursunuz.

if( Http::isAjax() === false )
{
    redirect('home/badrequest');
}

kullanabilirsiniz.

Ayrıca URL üzerinden geçersiz GET, POST gönderimlerini engellemek için yapılandırma dosyası bulunur.

Sürüm: (ZN >= 4.2.5)
File: Config/Routing.php
'invalidRequest' =>
[
    'control'    => true,
    'page'       => '',
    'allowPages' => []
]

Yukarıda yer alan 'control' => true ayarı bu istekleri engeller. İsteklerin istisna olarak engellenmemesini istediğiniz sayfaları ise allowPages ayarı ile belirtebilirsiniz. Geçersiz istek oluştuğunda hata ile karşılaşmamak için sayfa yönlendirmesi yapmak adına page ayarına geçerli bir controller/function yolu belirtebilirsiniz.

 

# Oturum ve Çerez Güvenliği


Session ve Cookie verilerini tutan anahtarlar varsayılan olarak şifrelenir. Bu konuyla ilgili yapılandırma ayarları Config/Storage.php dosyası içinde bulunur. Sayfaların her yenilenmesinde Session ID değeri değiştirildiği için ekstra güvenlik sağlanır. Eğer istenirse Session ve Cookie değerleride şifrelenebilir. Bu konuyla ilgili Session ve Cookie kullanımlarına bakınız.