IRC ve mIRC Kullanıcılarının Buluşma Noktası
  Reklam Ver


Forum tutkunlarının tek adresi Türkiye Sohbet Odaları Sohbetteyiz herkes burda

ayna chat muhabbetbayilik veren firmalar

Şeker Shell  Sohbet



Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 15 Nisan 2013, 21:42   #1
Çevrimdışı
Basit PHP Güvenliği


-- Sponsor Baglantı --


PHP scriptlerinizin güvenli olduğundan emin olmanız için ilk olarak temel kuralları yerine getirmeniz gerekiyor: kullanıcı girdilerinin (input) filtrelenmesi ve çıktıların (output) kontrolü. Eğer bu ikisini doğru olarak yapmıyorsanız scriptleriniz her zaman güvenlik problemleri ile karşı karşıya olacaktır. Bu makalede bu iki işlem ile ilgili yapılması gerekenler anlatılıyor.

Bütün girdileri filtreleyin
Scriptleriniz harici bir kaynaktan girdi okuduğunda, bu verinin tehlikeli olduğu varsayılmalı ve güvenilmemelidir. Güvenilmemesi gereken değişkenlerden bazıları: $_POST, $_GET, $_REQUEST ve hatta pek mümkün görünmese de önemli veriler içerebilecek olan $_SERVER .

Tehlikeli bir değişkenden gelen veriyi işlemlere tabi tutmadan önce ilk olarak önce onaylanamanız ve filtrelemeniz gerekmektedir. Onaylama işlemi ile sadece sizin istediğiniz verileri içerdiğinden emin olabilirsiniz. Örneğin bir eposta adresi bilgisi bekliyorsanız, onay fonksiyonunuz girilen verinin doğru bir eposta adresi olup olmadığını kontrol etmeli.

Hemen basit bir örnekle açıklayalım. Aşağıdaki kodda ilk olarak $_POST değişkeninden e-posta adresini alıyorum ve sonra veriyi onaylama işlemine sokuyorum:
<?php
$eposta = $_POST[eposta]; # Burada veri hala TEHLİKELİ durumda

// Validate e-mail
if (valid_eposta($eposta) == false) {
// Geçerli bir adres değil
die(Geçerli bir eposta adresi değil!);
}
?>
Veriyi kontrol ederek scriptimize tehlikeli verilerin eklenmesi riski büyük ölçüde azaltılmış oldu. valid_eposta() fonksiyonu nda da bulunabilecek olan standar bir onay işlemidir

Verimiz daha güvenli olsa da işimiz daha bitmedi çünkü hala veriyi MySQL veritabanına yerleştirmek istiyoruz ve bu işlemden önce de bazı kontroller yapmamız gerekiyor. PHP tüm önemli karakterlerin escape edildiği standart fonksiyonunu sunar. Diğer bir yöntem ise SQL sorgusunda veriyi her zaman kesme imleri arasına yerleştirin.

Önceki örneğimize devam edelim:
<?php
$eposta = $_POST[eposta]; # Burada veri hala TEHLİKELİ durumda

// Validate e-mail
if (valid_eposta($eposta) == false) {
// Geçerli bir adres değil
die(Geçerli bir eposta adresi değil!);
}

// eposta ın veritabanı için güvenli hale getirilmesi
$eposta = mysql_real_escape_string($eposta);

// Artık güvenli!
?>

Artık elimizdeki eposta verisi veritabanına güvenli bir şekilde işlenebilir. Hatalardan kaçınmak için tehlikeli değişkenlere bir ön ek verilebilir, örneğin:
<?php
$t_eposta = $_POST[eposta]; # Tehlikeli

// Onay işlemi

$g_eposta = mysql_real_escape_string($d_eposta);
?>

Bu şekilde tehlikeli bir veriyi işleme sokarken ön tarafındaki t_ eklentisi ile hemen farkına varabilirsiniz.

Çıktıların filtrelenmesi
Girdilerde olduğu gibi dışarıya sunulan tüm verilerin de (güvenli olarak filtreleyip veritabanına işlediğiniz verilerin dahi) filtrelenmesi gerekmektedir.

Filtrelenmesi gereken en önemli şey probleme yol açabilecek olan HTML tagleridir. Bunu yapmanın en kolay yolu bütün HTMLi escape işlemine sokan fonksiyonudur:
<?php
echo htmlentities($_GET[eposta]);
?>

Bu kod (saldırganın sayfalarınıza JavaScript kodları eklemesine ve diğer kullanıcıların cookielerini çalmasını sağlayan) muhtemel XSS (çapraz site betik çalıştırma - cross site scripting) saldırılarını kaldırır. Eğer mümkünse, htmlentities fonksiyonunun üçüncü argümanı ı (encoding/charset tipi) da kullanmalısınız. Googleda HTMLi escape işleminde düzgün encoding ayarı yapmadığı için . Google bu açığı 1 aralık a kapattı. Basitçe, her zaman encoding tipini belirlemelisiniz:
<?php
echo htmlentities($_GET[eposta], ENT_QUOTES, UTF-8);
?>

Eğer bütün HTML taglerini filtrelemek istemiyorsanız, bazı taglere izin vermek istiyorsanız strip_tags() fonksiyonunu kullanabilirsiniz. Fakat bu, <script> taglerini filtreleseniz dahi Javascript ekleme açıklarına karşı bir güvenlik problemi içerebilir. ör ( <div onclick="alert(Hi!);"> .

Diğer bir yöntem de sadece sizin istediklerinizi filtrelemenize yarayacak kendi fonksiyonunuzu yazmanız (veya internet eki yüzlerce hazır fonksiyondan birini kullanmanız). Bu bazen en iyi yöntem olabilir fakat herhangi bir şeyi unutmanız durumunda güvenlik problemlerine yol açabilir.

Son olarak, çıktıyı filtrelemenin en iyi yolu, üç argümanı ile birlikte htmlentities() fonksiyonunun kullanımı fakat bununda işlevi sınırlı (ör: formatlama olmaması) kalabilir. Buna çözüm olarak verileri formatlamanızda kullanılabilecek olan kendi HTML kodunuzu yaratabilirsiniz. Kendi HTML kodunuzu yaratma ile ilgili olarak dokümanına göz atabilirsiniz.

Sonuç
Bu makalede PHP programlamının iki temel ilkesi olan girdi filtreleme ve çıktı filtrelemeden bahsettim. Eğer bu ikisini doğru olarak yapabilirseniz çok güvenli bir PHP scriptine doğru yola çıkmışsınız demektir.

Verdiğim örnekler çok basit ve hantal. Escape işlemini otomatikleştirmeniz iyi olabilir. Bunun için iyi bir yöntem gerekli işlemleri yapan bir class veya fonksiyonlar yazmanız.

PHP güvenliği ile ilgili daha fazla bilgiye ihtiyaç duyuyorsanız aşağıdaki sitelerine göz atabilirsiniz:

- - Çok sayıda bilgi içeren mükemmel bir güvenlik rehberi. Mutlaka okunmalı.
- - Chris Shiflettin Essential PHP Security kitabından bilgiler. Kitabın bir kaç bölümü ücretsiz sunuluyor.
- - Güvenlik bültenlerine yer veriliyor

Kaynak:
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
Kod:   Kodu kopyalamak için üzerine çift tıklayın!
ALıntıdır.

PHP scriptlerinizin güvenli olduğundan emin olmanız için ilk olarak temel kuralları yerine getirmeniz gerekiyor: kullanıcı girdilerinin (input) filtrelenmesi ve çıktıların (output) kontrolü. Eğer bu ikisini doğru olarak yapmıyorsanız scriptleriniz her zaman güvenlik problemleri ile karşı karşıya olacaktır. Bu makalede bu iki işlem ile ilgili yapılması gerekenler anlatılıyor.

Bütün girdileri filtreleyin
Scriptleriniz harici bir kaynaktan girdi okuduğunda, bu verinin tehlikeli olduğu varsayılmalı ve güvenilmemelidir. Güvenilmemesi gereken değişkenlerden bazıları: $_POST, $_GET, $_REQUEST ve hatta pek mümkün görünmese de önemli veriler içerebilecek olan $_SERVER .

Tehlikeli bir değişkenden gelen veriyi işlemlere tabi tutmadan önce ilk olarak önce onaylanamanız ve filtrelemeniz gerekmektedir. Onaylama işlemi ile sadece sizin istediğiniz verileri içerdiğinden emin olabilirsiniz. Örneğin bir eposta adresi bilgisi bekliyorsanız, onay fonksiyonunuz girilen verinin doğru bir eposta adresi olup olmadığını kontrol etmeli.

Hemen basit bir örnekle açıklayalım. Aşağıdaki kodda ilk olarak $_POST değişkeninden e-posta adresini alıyorum ve sonra veriyi onaylama işlemine sokuyorum:
<?php
$eposta = $_POST[eposta]; # Burada veri hala TEHLİKELİ durumda

// Validate e-mail
if (valid_eposta($eposta) == false) {
// Geçerli bir adres değil
die(Geçerli bir eposta adresi değil!);
}
?>
Veriyi kontrol ederek scriptimize tehlikeli verilerin eklenmesi riski büyük ölçüde azaltılmış oldu. valid_eposta() fonksiyonu nda da bulunabilecek olan standar bir onay işlemidir

Verimiz daha güvenli olsa da işimiz daha bitmedi çünkü hala veriyi MySQL veritabanına yerleştirmek istiyoruz ve bu işlemden önce de bazı kontroller yapmamız gerekiyor. PHP tüm önemli karakterlerin escape edildiği standart fonksiyonunu sunar. Diğer bir yöntem ise SQL sorgusunda veriyi her zaman kesme imleri arasına yerleştirin.

Önceki örneğimize devam edelim:
<?php
$eposta = $_POST[eposta]; # Burada veri hala TEHLİKELİ durumda

// Validate e-mail
if (valid_eposta($eposta) == false) {
// Geçerli bir adres değil
die(Geçerli bir eposta adresi değil!);
}

// eposta ın veritabanı için güvenli hale getirilmesi
$eposta = mysql_real_escape_string($eposta);

// Artık güvenli!
?>

Artık elimizdeki eposta verisi veritabanına güvenli bir şekilde işlenebilir. Hatalardan kaçınmak için tehlikeli değişkenlere bir ön ek verilebilir, örneğin:
<?php
$t_eposta = $_POST[eposta]; # Tehlikeli

// Onay işlemi

$g_eposta = mysql_real_escape_string($d_eposta);
?>

Bu şekilde tehlikeli bir veriyi işleme sokarken ön tarafındaki t_ eklentisi ile hemen farkına varabilirsiniz.

Çıktıların filtrelenmesi
Girdilerde olduğu gibi dışarıya sunulan tüm verilerin de (güvenli olarak filtreleyip veritabanına işlediğiniz verilerin dahi) filtrelenmesi gerekmektedir.

Filtrelenmesi gereken en önemli şey probleme yol açabilecek olan HTML tagleridir. Bunu yapmanın en kolay yolu bütün HTMLi escape işlemine sokan fonksiyonudur:
<?php
echo htmlentities($_GET[eposta]);
?>

Bu kod (saldırganın sayfalarınıza JavaScript kodları eklemesine ve diğer kullanıcıların cookielerini çalmasını sağlayan) muhtemel XSS (çapraz site betik çalıştırma - cross site scripting) saldırılarını kaldırır. Eğer mümkünse, htmlentities fonksiyonunun üçüncü argümanı ı (encoding/charset tipi) da kullanmalısınız. Googleda HTMLi escape işleminde düzgün encoding ayarı yapmadığı için . Google bu açığı 1 aralık a kapattı. Basitçe, her zaman encoding tipini belirlemelisiniz:
<?php
echo htmlentities($_GET[eposta], ENT_QUOTES, UTF-8);
?>

Eğer bütün HTML taglerini filtrelemek istemiyorsanız, bazı taglere izin vermek istiyorsanız strip_tags() fonksiyonunu kullanabilirsiniz. Fakat bu, <script> taglerini filtreleseniz dahi Javascript ekleme açıklarına karşı bir güvenlik problemi içerebilir. ör ( <div onclick="alert(Hi!);"> .

Diğer bir yöntem de sadece sizin istediklerinizi filtrelemenize yarayacak kendi fonksiyonunuzu yazmanız (veya internet eki yüzlerce hazır fonksiyondan birini kullanmanız). Bu bazen en iyi yöntem olabilir fakat herhangi bir şeyi unutmanız durumunda güvenlik problemlerine yol açabilir.

Son olarak, çıktıyı filtrelemenin en iyi yolu, üç argümanı ile birlikte htmlentities() fonksiyonunun kullanımı fakat bununda işlevi sınırlı (ör: formatlama olmaması) kalabilir. Buna çözüm olarak verileri formatlamanızda kullanılabilecek olan kendi HTML kodunuzu yaratabilirsiniz. Kendi HTML kodunuzu yaratma ile ilgili olarak dokümanına göz atabilirsiniz.

Sonuç
Bu makalede PHP programlamının iki temel ilkesi olan girdi filtreleme ve çıktı filtrelemeden bahsettim. Eğer bu ikisini doğru olarak yapabilirseniz çok güvenli bir PHP scriptine doğru yola çıkmışsınız demektir.

Verdiğim örnekler çok basit ve hantal. Escape işlemini otomatikleştirmeniz iyi olabilir. Bunun için iyi bir yöntem gerekli işlemleri yapan bir class veya fonksiyonlar yazmanız.

PHP güvenliği ile ilgili daha fazla bilgiye ihtiyaç duyuyorsanız aşağıdaki sitelerine göz atabilirsiniz:

- - Çok sayıda bilgi içeren mükemmel bir güvenlik rehberi. Mutlaka okunmalı.
- - Chris Shiflettin Essential PHP Security kitabından bilgiler. Kitabın bir kaç bölümü ücretsiz sunuluyor.
- - Güvenlik bültenlerine yer veriliyor

Kaynak:
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
Kod:   Kodu kopyalamak için üzerine çift tıklayın!
ALıntıdır.

__________________
Sokaklarda Kalmış Çocuğun Hayalleri Kadar Boş Olsada Ceplerim
Trilyonların Bile Alamayacağı İnsanlara Sahibim

Kullanıcı imzalarındaki bağlantı ve resimleri görebilmek için en az 20 mesaja sahip olmanız gerekir ya da üye girişi yapmanız gerekir.
  Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
Cevapla

Etiketler
basit, güvenliği, php

Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Php.ini Güvenliği Neo GNU, Linux ve UNIX 0 13 Ekim 2012 00:52
Vbulletin Güvenliği Dilara vBulletin Sorunları ve Çözümleri 1 12 Mart 2009 15:15
W-LAN Güvenliği. Lee Ağ, Network ve Networking 1 18 Kasım 2007 12:37
Ağ güvenliği HITMAN Güvenlik Açıkları 1 01 Mart 2006 07:02
%99 Pc Güvenliği PaYanDA Güvenlik Açıkları 1 24 Şubat 2006 17:16