Posts Tagged ‘Php’

Php kodlamada güvenlik

Pazartesi, Mayıs 4th, 2009

Arkadaşlar bir sitede de alınması gereken önlemleri ile ilgili bir makale okudum ve burada sizlerle paylaşmak istedim.
————–

Basit Güvenliği:
script’lerinizin 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 script’leriniz her zaman problemleri ile karşı karşıya olacaktır. Bu makale’de bu iki iÅŸlem ile ilgili yapılması gerekenler anlatılıyor.

Bütün Girileri Filtreleyin:
Script’leriniz 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 fonksiyon’unuz 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:

Kodu:
<?
$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 script’imize tehlikeli verilerin eklenmesi riski büyük ölçüde azaltılmış oldu. valid_eposta() fonksiyon’u PHPit Code Snippet veritabanında da bulunabilecek olan standart 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. tüm önemli karakterlerin escape edildiÄŸi mysql_real_escape_string() standart fonksiyon’unu sunar. DiÄŸer bir yöntem ise SQL sorgusunda veriyi her zaman kesme imleri arasına yerleÅŸtirin.

Önceki örneğimize devam edelim:

Kodu:
<?
$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ı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:
Kodu:
<?
$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 tag’leridir. Bunu yapmanın en kolay yolu bütün HTML’i escape iÅŸlemine sokan htmlentities() fonksiyon’udur:

Kodu:
<?
echo htmlentities($_GET['eposta'
]);
?>
Bu kod (saldırganın sayfalarınıza JavaScript kodları eklemesine ve diÄŸer kullanıcıların cookie’lerini ç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 fonksiyon’unun üçüncü argümanı’nı (encoding/charset tipi) da kullanmalısınız. ’da HTML’i escape iÅŸleminde düzgün encoding ayarı yapmadığı için XSS saldırısından etkileniyordu. bu açığı 1 aralık’ta kapattı. Basitçe, her zaman encoding tipini belirlemelisiniz:

Kodu:
<?
echo htmlentities($_GET['eposta'], ENT_QUOTES, ‘UTF-8′
);
?>

EÄŸer bütün HTML tag’lerini filtrelemek istemiyorsanız, bazı tag’lere izin vermek istiyorsanız strip_tags() fonksiyon’unu kullanabilirsiniz. Fakat bu, <script> tag’lerini filtreleseniz dahi Javascript ekleme açıklarına karşı bir problemi içerebilir. ör ( <div onclick=”alert(’Hi!’);”> .

DiÄŸer bir yöntem de sadece sizin istediklerinizi filtrelemenize yarayacak kendi fonksiyon’unuzu yazmanız (veya internet’teki yüzlerce hazır fonksiyon’dan birini kullanmanız). Bu bazen en iyi yöntem olabilir fakat herhangi bir ÅŸeyi unutmanız durumunda 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 format’lamanızda kullanılabilecek olan kendi HTML kodunuzu yaratabilirsiniz. Kendi HTML kodunuzu yaratma ile ilgili olarak Create your own BBCode, using dokümanına göz atabilirsiniz.

Sonuç :
Bu makalede programlamının iki temel ilkesi olan girdi filtreleme ve çıktı filtreleme’den bahsettim. EÄŸer bu ikisini doÄŸru olarak yapabilirseniz çok güvenli bir script’ine 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 fonksiyon’lar yazmanız.

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

- Security Consortium - Çok sayıda bilgi içeren mükemmel bir rehberi. Mutlaka okunmalı.
- Essential Security - Chris Shiflett’in Essential Security kitabından bilgiler. Kitabın bir kaç bölümü ücretsiz
- Hardened - bültenlerine yer veriliyor
——-

Php kullanarak sitemap güncellemek ( To update the sitemap using php )

Cumartesi, Mayıs 2nd, 2009

kullanarak güncellemek ( To the using )

Amaç: ile .xml dosyasımızın içini otomatik olarak güncelleme.
Yöntem: .htaccess dosyamızda xml uzantılarında taglarının çalışmasınıayarlayacağız. Daha sonra xml dosyasının içine kodlarımızıyazacağız.

Bu kodu .htaccess dosyamızın içine ekleyelim
Kod:

Objective: automatically updated .xml dosyasımızın inside.
Method:. Htaccess files in our xml extension tag worked setup . Then in the file xml codes write.

This code. Htaccess file, add in our
Code:

AddType application/x-httpd- . .xml

Bu da .xml dosyamızın içeriği olsun
Kod:
——– KOD BAÅžLANDICI———-
<?
$host = “localhost”; // Veritabanı Sunucusu
$mysqladi = “root”; // Veritabanı Yetkili Adı
$mysqlsifre =”"; // Veritabanı Yetkili Åžifresi
$db = “phpxml”; // Veritabanı Adı
mysql_connect ($host, $mysqladi, $mysqlsifre) or die (”VT BaÄŸlantısı Yok”);
mysql_select_db ($db) or die (”Veritabanına BaÄŸlanılamadı”);
header(’Content-type: text/xml;charset=UTF-8′);
$xml = “<?xml version=\”1.0\” encoding=\”UTF-8\”?>”.”\n”.”<urlset xmlns=\”http://www.sitemaps.org/schemas//0.9\”>”.”\n”;
$urunsayfasi=”http://www.domain.com/urunler.?id=”;

$sorgu=mysql_query(”Select id from urunler”);
while($xmlsorgu=mysql_fetch_array($sorgu)){
$xml .=    “\t”.”<url>”.”\n\t\t”.”<loc>”.$urunsayfasi.$xmlsorgu["id"].”</loc>”.”\n\t”.”</url>”;
}
$xml.=”</urlset>”;
echo $xml;
?>

—— KOD BİTİŞİ——-

Not: Bu XML site haritasında veritabanı bilgilerini değiştirmelisiniz. Ayrıca veritabanından çektiğiniz bilgileri kendinize göre düzenleyin. İsterseniz öncelik ve değişim değerlerini ekleyebilirsiniz.

Note: This must change the database information in XML site map. Moreover, according to your own database, edit the information you have taken. If you want you can add value and change priorities.

Mysqlden veri okurken iki döngü iç içe kullanmamız gerekirse mysql_fetch_assoc

Pazar, Ekim 26th, 2008

Mysqlden veri çekerken iç içe kullanacağımız whilelerde array yerine mysql_fetch_assoc kullanıyoruz.

Örnek php

Oyun Domain Registration Australia
Add to Technorati Favorites Technorati