Güvenlik Önlemleri
"ZN Framework'e ait tüm paketler framework dışında da kullanılabilir esneklikte tasarlanmıştır."
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. Bu önlemler aşağıda yer alan kütüphaneleri ilgilendirmektedir.
Etkilenen Kütüphaneler
● URI::
● Get::
'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.
echo URI::id();
Dikkat edilirse tırnak(') işareti izole edilmiştir.
Aynı şekilde Get:: kütüphanesi içinde aynı durum söz konusudur.
echo Get::id();
# Form Güvenliği
Form güvenliği formlardan gelen post ve get datalarının manipüle edilmesi ü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();
Görüldüğü gibi HTML karakterleri dönüştürülür. Bu kütüphane arka planda 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 yine de 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.
'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ğerleri de şifrelenebilir. Bu konuyla ilgili Session ve Cookie kullanımlarına bakınız.