Space Collective - İleri Görüşlü Dünyalılar Komitesi
* Bilim, Teknoloji ve Gelecek
* İnsan beyni ve nöroloji
* Biyoloji, Biyoteknoloji, Genetik ve Tıp
* Çevre
* Fizik ve Felsefe
* Sanat ve Tasarım
* Yapay Zeka
* Sistemler ve karmaşıklık
* The Web
temalarındaki yazıların olağanüstü güzellikteki görsellerle ve tasarımlarla açıklandığı kollektif blog sitesi. Mutlaka gezilmesi ve görülmesi gereken bir site.
Tanıtım videosu:
http://spacecollective.org/
22.02.2009
29.08.2008
Dates in PHP and MySQL
I see a lot of people on forums and on my training courses asking about the best way (or any way) to manage dates stored in a MySQL database and used in PHP. Three options follow, but first the problem.
PHP uses unix timestamps for all its date functionality. It has methods to convert these timestamps into pretty much any text format you could want but internally it uses the timestamp format. A timestamp is simply an unsigned integer. Specifically, it’s the number of seconds that have elapsed since midnight on January 1st 1970 (greenwich mean time).
MySQL has three date types for use in columns. These are DATETIME, DATE, and TIMESTAMP. DATETIME columns store date and time as a string in the form YYYY-MM-DD HH:MM:SS (e.g. 2006-12-25 13:43:15). DATE columns use just the date part of this format - YYYY-MM-DD (e.g. 2006-12-25). TIMESTAMP columns, despite their name, are nothing like the unix timestamps used in PHP. A TIMESTAMP column is simply a DATETIME column that automatically updates to the current time every time the contents of that record are altered. (That’s a simplification but broadly true and the details are not important here). In particular, since version 4.1 of MySQL the TIMESTAMP format is exactly the same as the DATETIME format.
So the problem is how to work with these two very different date formats - the PHP timestamp integer and the MySQL DATETIME string. There’s three common solutions…
1.
One common solution is to store the dates in DATETIME fields and use PHPs date() and strtotime() functions to convert between PHP timestamps and MySQL DATETIMEs. The methods would be used as follows -
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );
$phpdate = strtotime( $mysqldate );
2.
Our second option is to let MySQL do the work. MySQL has functions we can use to convert the data at the point where we access the database. UNIX_TIMESTAMP will convert from DATETIME to PHP timestamp and FROM_UNIXTIME will convert from PHP timestamp to DATETIME. The methods are used within the SQL query. So we insert and update dates using queries like this -
$query = "UPDATE table SET
datetimefield = FROM_UNIXTIME($phpdate)
WHERE...";
$query = "SELECT UNIX_TIMESTAMP(datetimefield)
FROM table WHERE...";
3.
Our last option is simply to use the PHP timestamp format everywhere. Since a PHP timestamp is an unsigned integer, use an unsigned integer field in MySQL to store the timestamp in. This way there’s no conversion and we can just move PHP timestamps into and out of the database without any issues at all.
Be aware, however, that by using a unsigned integer field to store your dates you loose a lot of functionality within MySQL because MySQL doesn’t know that your dates are dates. You can still sort records on your date fields since php timestamps increase regularly over time, but if you want to use any of MySQL’s date and time functions on the data then you’ll need to use FROM_UNIXTIME to get a MySQL DATETIME for the function to work on.
However, if you’re just using the database to store the date information and any manipulation of it will take place in PHP then there’s no problems.
So finally we come to the choice of which to use. For me, if you don’t need to manipulate the dates within MySQL then there’s no contest and the last option is the best. It’s simple to use and is the most efficient in terms of storage space in the data table and speed of execution when reading and writing the data.
However, some queries will be more complicated because your date is not in a date field (e.g. select all users who’s birthday is today) and you may lose out in the long run. If this is the case it may be better to use either option 1 or 2. Which of these you use depends on whether you’d rather place the work on MySQL or PHP. I tend to use option 2 but there’s no right or wrong answer - take your pick.
So to summarise, for those who’ve skipped straight to the last paragraph, most of the time I use option 3 but occasionally I use option 2 because I need MySQL to know the field contains a date.
PHP uses unix timestamps for all its date functionality. It has methods to convert these timestamps into pretty much any text format you could want but internally it uses the timestamp format. A timestamp is simply an unsigned integer. Specifically, it’s the number of seconds that have elapsed since midnight on January 1st 1970 (greenwich mean time).
MySQL has three date types for use in columns. These are DATETIME, DATE, and TIMESTAMP. DATETIME columns store date and time as a string in the form YYYY-MM-DD HH:MM:SS (e.g. 2006-12-25 13:43:15). DATE columns use just the date part of this format - YYYY-MM-DD (e.g. 2006-12-25). TIMESTAMP columns, despite their name, are nothing like the unix timestamps used in PHP. A TIMESTAMP column is simply a DATETIME column that automatically updates to the current time every time the contents of that record are altered. (That’s a simplification but broadly true and the details are not important here). In particular, since version 4.1 of MySQL the TIMESTAMP format is exactly the same as the DATETIME format.
So the problem is how to work with these two very different date formats - the PHP timestamp integer and the MySQL DATETIME string. There’s three common solutions…
1.
One common solution is to store the dates in DATETIME fields and use PHPs date() and strtotime() functions to convert between PHP timestamps and MySQL DATETIMEs. The methods would be used as follows -
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );
$phpdate = strtotime( $mysqldate );
2.
Our second option is to let MySQL do the work. MySQL has functions we can use to convert the data at the point where we access the database. UNIX_TIMESTAMP will convert from DATETIME to PHP timestamp and FROM_UNIXTIME will convert from PHP timestamp to DATETIME. The methods are used within the SQL query. So we insert and update dates using queries like this -
$query = "UPDATE table SET
datetimefield = FROM_UNIXTIME($phpdate)
WHERE...";
$query = "SELECT UNIX_TIMESTAMP(datetimefield)
FROM table WHERE...";
3.
Our last option is simply to use the PHP timestamp format everywhere. Since a PHP timestamp is an unsigned integer, use an unsigned integer field in MySQL to store the timestamp in. This way there’s no conversion and we can just move PHP timestamps into and out of the database without any issues at all.
Be aware, however, that by using a unsigned integer field to store your dates you loose a lot of functionality within MySQL because MySQL doesn’t know that your dates are dates. You can still sort records on your date fields since php timestamps increase regularly over time, but if you want to use any of MySQL’s date and time functions on the data then you’ll need to use FROM_UNIXTIME to get a MySQL DATETIME for the function to work on.
However, if you’re just using the database to store the date information and any manipulation of it will take place in PHP then there’s no problems.
So finally we come to the choice of which to use. For me, if you don’t need to manipulate the dates within MySQL then there’s no contest and the last option is the best. It’s simple to use and is the most efficient in terms of storage space in the data table and speed of execution when reading and writing the data.
However, some queries will be more complicated because your date is not in a date field (e.g. select all users who’s birthday is today) and you may lose out in the long run. If this is the case it may be better to use either option 1 or 2. Which of these you use depends on whether you’d rather place the work on MySQL or PHP. I tend to use option 2 but there’s no right or wrong answer - take your pick.
So to summarise, for those who’ve skipped straight to the last paragraph, most of the time I use option 3 but occasionally I use option 2 because I need MySQL to know the field contains a date.
11.07.2008
PHP' de güvenlik
Giriş
PHP, bir çok yazılım dilinden farklı olarak, buffer-overflows gibi hafıza problemleri olan, bundan dolayı güvenlik problemine neden olabilecek bir dil değildir. Aynı zamanda PHP öğrenilmesi kolay ve hızlı bir dildir. Bu kolay ve hızlı öğrenilebilirlik, bu dili bir çok kişinin öğrenmesine, aynı hızda üretim yaparak uygulama geliştirmesine de olanak sağlamaktadır. Ancak bu durum, bilinsizce yapılan kodlama teknikleri nedeniyle kendi içerisince ciddi bir güvenlik problemini yanında getirmektedir.
Bu klavuz size, online güvenlik, web tabanlı yazılım geliştirirken PHP’de temel güvenliği nasıl sağlayacağınız konusunda fikir vermek için hazırlanmıştır. Klavuz içerisinde başlangıç seviyesi kullanıcılar için önemli bilgiler, uzmanlar için belki de gözden kaçan ufak ipuçları bulunabilir.
Atak Tipleri:
XSS Atağı:
XSS “Cross Site Scriptting” anlamında kullanılmaktadır ve bir sayfaya içerik girmek -JavaScript gibi- gibi düşünebiliriz. XSS atakları genelde kullanıcının Cookie (çerez) lerini çalmak amacıyla kullanılır. Bu cookie’ler kullanıcı login bilgileri, sişreleri ya da benzeri önemli bilgileri içeriyor olabilir.
Basit anlamda bir örnek verelim.
$id=$_GET[’id’];
echo “Gelen ID degeri:”.$id;
Yukarıdaki kodda, $_GET[’id’] degiskeni bir sayı ise problem yok. Ancak ya aşağıdaki gibi bir kodsa?
Kullanıcı bir sekilde, bu kotu amaçlı kodu çalıştırırsa, tüm cookie bilgilerini kotü amaçlı siteye devredebilir.
XSS Ataklarından Nasıl Korunurum?
İlk olarak, asla kullanıcı girişi bilgilerine güvenmeyiniz. Kullanıcılardan girilen her bilgiyi mutlaka kontrol edip filtrelememiz gerekiyor. Yani gelen kullanıcı bilgilerini HTML tag’lerinden arındırırsak bir JavaScript kodu çalıştırılamak hale getirebiliriz. Bunu yapmanın en kolay yolu PHP’nin strip_tags() fonksiyonunu kullanmaktır. Bu fonksiyon tüm HTML tag’lerini temizleyecektir. HTML tag’lerini silmemek ama onları zararsız hale getirmk için htmlentities() fonksiyonunu da kullananilirsiniz. Bu fonksiyon, < ve > karakterlerini < ve >karakterlerine dönüştürecektir.
SQL Injection Yönetemi:
Günümüzde bir çok web sitesi verileri barındırmak için veritabanı kullanmaktadır. Bu bağlamda veritabanına girmek için bir çok INSERT, UPDATE ve SELECT işlemleri yapılmaktadır. Buna rağmen bir çok site, form verileri açısında SQL Injection yöntemi ile atağa uğramak konusunda yeterli güvenliğe sahip değildir.
SQL Injection, değiştirilmiş, atak için düzenlenmiş form içerikleri ile yapılan veritabanı sorgularıdır. Bu ataklar veritabanınızdan bir kaç veriyi çalmak, izinsiz login olmak, ya da tüm veritabanını silmek gibi sonuçları doğurabilir.
En genel kullanımı anlatmak için aşağıdaki kod örneğine bakalım:
site_users
WHERE
username = ‘$username’
AND
password = ‘$password’
“);
if ( mysql_num_rows($result) > 0 )
// login oldu
Yukarıdaki kod örneği, SQL Injection için gerekli ortamı hazırlamaktadır, bu konuda zaafiyet oluştrabilecek bir kod örneğidir. Kötü amaçlı bir kişi yukarıdaki SQL’i değiştirerek sisteme izinsiz giriş yapabilir. (Kullanıcı şifresini girmeden login olabilir)
Örneğin kötü kullanıcı (saldırgan) kullanıcı adı alanına “rob” şifre (password) alanına aşağıdaki gibi bir giriş yaparsa:
‘ OR 1=1 ‘
Yukarıdaki kod şu şekli alır:
SELECT *
FROM
site_users
WHERE
username = ‘rob’
AND
password = ” OR 1=1
Bu SQL sorgusu ise, kullanıcı adı “rob” olan kaydın şifresi ne olursa olsun getirmektedir. Yani şifre kontrolu gerçekleşememiştir.
SQL Injection Atağından Nasıl Korunurum?
XSS Atağında olduğu gibi, en büyük sorun kullanıcının gönderdiği veriyi olduğu gibi kullanmaktır. Korunmanın en iyi yöntemi ise, kullancıı verisini riskli karakterlerden arındırmaktır. mysql_real_escape_string() fonksiyonu bu amaçla PHP içerisinde yer alıyor. Bu fonksiyon riskli olan ‘ ve ” gibi karakterleri temizlemektedir. Ayrıca, SQL sorgularınızda kullandığınız kullancıı verileri, eğer, sayı olmanı bekleniyorsa intval() fonksiyonu ile gelen verinin sadece sayı bilgisi olan kısmı alınmalıdır.
Dosya Yüklemesi Atağı (File Upload)
Kullancıların yükledikleri dosyalar en büyük güvenlik risk unsurlarının başında gelmektedir. Bu, tanımadığınzı bilmediğiniz dosyaları sunucunuzda barındırmak anlamındadır. Bu dosyalar, dosyalarınız silmek için, veri tabanınızı boşaltmak için olabilir. Ya da daha başka bir çok güvenlik problemine neden açabilecek dosyalar olabilir.
Buna rağmen, güvenli şekilde dosya almak kontrol içerisinde alındığında mümkündür.
Kullanıcıların sisteminize dosya yüklemesine izin verdiğiniz durumlarda, kontrol etmeniz gereken 2 önemli bilgi mevcuttur.
Birincisi, dosyanın “mime-type” ıdır. Yani, dosyanın header’ında bulunan ve dosya tipini belirten bölüm. Örneğin kullanıcının sadece resim dosyası upload etmesini istiyorsanız yüklenen dosyanın “mime-type” ı image/png, image/jpeg, image/gif, image/x-png ya da image/p-jpeg olmalıdır. Aşağıdaki kod bu kontrolü gerçekleştirir.
$validMimes = array(
‘image/png’,
‘image/x-png’,
‘image/gif’,
‘image/jpeg’,
‘image/pjpeg’
);
$image = $_FILES[’image’];
if(!in_array($image[’type’], $validMimes)) {
die(’Üzgünüm, izin verilmeyen dosya tipi.’);
}
// İşlem tamam yüklemeyi gerçekletir vs vs.
İkinci kontrol etmeniz gereken bilgi ise, dosyanın uzantısıdır. Zira, mime-type bilgisi manuple edilebilir bir bilgidir. Bu bağlamda dosyanın uzantısını kontrol etmeniz gerekir. Zira bir kullanıcı, bir imaj dosyasının mime-type ı ile bir PHP dosyası gönderebilir. Bu durumda siz bir PJP dosyasını sisteminize almış olursunuz ki bu çok ciddi bir risk faktörüdür.
Bu durumdan korunmak için, sisteminize yüklediğiniz dosyaların uzantıları, siz tanımlamalısınız. Bu tanımlamayı ise mime-type bilgise göre yapabilirsiniz. Aşağıdaki örneğe bakalım:
$validMimes = array(
‘image/png’ => ‘.png’,
‘image/x-png’ => ‘.png’,
‘image/gif’ => ‘.gif’,
‘image/jpeg’ => ‘.jpg’,
‘image/pjpeg’ => ‘.jpg’
);
$image = $_FILES[’image’];
if(!array_key_exists($image[’type’], $validMimes)) {
die(’Üzgünüm, izin verilmeyen dosya tipi.’);
}
// Dosya uzantısını barındırmayan dosya adını alalım:
$filename = substr($image[’name’], 0, strrpos($image[’name’], ‘.’));
// Mime type göre dogru uzantıyı verelim
$filename .= $validMimes[$image[’type’]];
// İşlem tamam
Yukarıdaki örnekle, bir PHP dosyanının sanki bir resim dosyasıymış gibi sisteminize PHP dosyası olarak yüklenmesini engellediniz. Dosya mime-type’ı PNG’yi işaret ediyorsa, dosya uzantısı .png olacaktır.
Dosya Include Atağı:
Kullanımı çok yaygın olan index.php?sayfa=xxxx.php şeklideki dosya include yöntemi çok ciddi risk taşıyabilir. Bu kullanım genelde, menü yapısı, logo gibi bölümleri index.php ye kaydedip içerik bölümünü başka dosyalarda saklayarak site yönetimini kolaylaştırmak için kullanılır. Bu durumdaki yanlışlık,
include $_GET[’sayfa’];
gibi bir kod ile gelen değişkene göre sayfayı include etmektendir.
Yukaridaki kullanımda PHP’nin allow_url_fopen ayarı ON durumda ise, yani aktifse, saldırgan başka bir sunucudaki dosyayı sitenize include edebiliyor demektir. Kodunuz da echo file_get_contents() değil de include kullanıdığı için bu çok sık karşılaşılan bir açığa sebebiyet vermektedir. Bu durum, sunucunuzun tüm kontrolünü saldırgana bırakmak demektir.
Bu durumdan yapabileceğiniz 2 şey vardır.
Birincisi, bir liste oluşturup gelen değişkeni burada kontrol etmektir. Örneğin şöyle bir kod ile:
switch($_GET[’sayfa’]) {
case “hakkimizda”:
include(’hakkimizda.php’);
break;
case “haberler”:
include(’haberler.php’);
break;
default:
include(’anasayfa.php’);
}
Bu kod ile include edebileceğiniz her sayfayı belirtiyor ve belirtmediğiniz sayfa için anasayfa.php dosyasını include ediyorsunuz. Bu yöntemin zor tarafı, ekleyeceğiniz her sayfayı bu listeye de eklemek zorunluluğudur.
İkinci bir yöntem ise, dışarodan gelen $_GET[’sayfa’] değişkenini kontrol etmek ve temizlemektir.
$sayfa = preg_replace(’/\W/si’, ”, $_GET[’sayfa’]);
include(’./’.$sayfa.’.php’);
Yukarıdaki kod, “..”, “/” gibi karakterleri temizleyerek kullanıcının 212.111.111.111 gibi ip ya da http://www.kotusite.com gibi domain belirtmesini engeller. Bu verileri 212111111111, httpwwwkotusitecom şekline çevirir.
Dosya include atağındaki diğer bir açık ise, include edilen dosyaların uzantılarını .inc gibi sunucunun tanımayacağı bir uzantı yapmaktır. Örneğin, config.inc gibi bir dosya yapıp bunu include etmek çok sakıncalı olabilir. Zira, saldırgan bu dosyanın adını ve yerini öğrendiğinde, eğer web suncuunuz bu dosyayı çalıştırabilir bir dosya olarak tanımıyorsa (ki tanımama ihtimali yüksektir), saldırdan dosya içeriğini görecektir. Bu durumda yapabileceğiniz, her türlü dosya uzantınızı .php yapmaktır. Boylece saldırgan bu dosyaların içeriğini görüntüleyemez. Diğer bir yöntem ise Apache sunucular için, aşağıdaki gibi bir .htaccess dosyası olusturarak .inc dosyalarının ulaşılmasını engelleyebilirsiniz.
Order allow,deny
Deny from all
Register Globals Atağı:
register_globals değeri PHP ayarında ON durumda ise, $_POST, $_GET, $_SERVER, $_COOKIE, $_REQUEST, $_FILE ile gelen değişkenlere global değişkenler olarak ulaşabilirsiniz. Yani mesela $_POST[’mesaj’] değişkenine $mesaj olarak ulaşabilirsiniz.
register_globals değeri güncel PHP kurulumlarında varsayılan olarak OFF durumdadır. Ancak eski bir PHP kurulumu bulunan sunucuda, ya da sistem yönetici tarafından özellikle açılmış bir sunucuda ON durumunda olabilir (ki paylaşımlı hosting firmaları geçmiş müşterilerinin kodlarının uyumu adına açabiliyorlar).
register_globals’in ON olamsı durumu için aşağıdaki kodu inceleyelim.
dosya.php dosyası örneği:
if($_POST[’username’] == ‘rob’ && $_POST[’password’] == ‘foo’) {
$authenticated = true;
}
if($authenticated) {
// giriş başarılı bişeyler yapalım
}
Saldırgan, dosya.php?authenticated=true şeklinde bir URL çağrımı ile, sisteme izinsiz giriş yapabilir.
Bu durumda ne yapacağız, register_globals değerini OFF yapamayabileceğimiz durumların her zaman gerçekleşebileceğini düşünerek, kodumuzu şu şekilde değiştirelim.
$authenticated = false;
if($_POST[’username’] == ‘rob’ && $_POST[’password’] == ‘foo’) {
$authenticated = true;
}
if($authenticated) {
// giriş başarılı bişeyler yapalım
}
Bu kod, $authenticated değişkenini sayfa başında false yapmaktadır. $_POST’tan gelen veri eğer uygunsa $authenticated true yapılır. Böylece, dışarıdan gönderilen değişken ile izinsiz giriş yaplıması engellenmiş olur.
PHP, bir çok yazılım dilinden farklı olarak, buffer-overflows gibi hafıza problemleri olan, bundan dolayı güvenlik problemine neden olabilecek bir dil değildir. Aynı zamanda PHP öğrenilmesi kolay ve hızlı bir dildir. Bu kolay ve hızlı öğrenilebilirlik, bu dili bir çok kişinin öğrenmesine, aynı hızda üretim yaparak uygulama geliştirmesine de olanak sağlamaktadır. Ancak bu durum, bilinsizce yapılan kodlama teknikleri nedeniyle kendi içerisince ciddi bir güvenlik problemini yanında getirmektedir.
Bu klavuz size, online güvenlik, web tabanlı yazılım geliştirirken PHP’de temel güvenliği nasıl sağlayacağınız konusunda fikir vermek için hazırlanmıştır. Klavuz içerisinde başlangıç seviyesi kullanıcılar için önemli bilgiler, uzmanlar için belki de gözden kaçan ufak ipuçları bulunabilir.
Atak Tipleri:
XSS Atağı:
XSS “Cross Site Scriptting” anlamında kullanılmaktadır ve bir sayfaya içerik girmek -JavaScript gibi- gibi düşünebiliriz. XSS atakları genelde kullanıcının Cookie (çerez) lerini çalmak amacıyla kullanılır. Bu cookie’ler kullanıcı login bilgileri, sişreleri ya da benzeri önemli bilgileri içeriyor olabilir.
Basit anlamda bir örnek verelim.
$id=$_GET[’id’];
echo “Gelen ID degeri:”.$id;
Yukarıdaki kodda, $_GET[’id’] degiskeni bir sayı ise problem yok. Ancak ya aşağıdaki gibi bir kodsa?
Kullanıcı bir sekilde, bu kotu amaçlı kodu çalıştırırsa, tüm cookie bilgilerini kotü amaçlı siteye devredebilir.
XSS Ataklarından Nasıl Korunurum?
İlk olarak, asla kullanıcı girişi bilgilerine güvenmeyiniz. Kullanıcılardan girilen her bilgiyi mutlaka kontrol edip filtrelememiz gerekiyor. Yani gelen kullanıcı bilgilerini HTML tag’lerinden arındırırsak bir JavaScript kodu çalıştırılamak hale getirebiliriz. Bunu yapmanın en kolay yolu PHP’nin strip_tags() fonksiyonunu kullanmaktır. Bu fonksiyon tüm HTML tag’lerini temizleyecektir. HTML tag’lerini silmemek ama onları zararsız hale getirmk için htmlentities() fonksiyonunu da kullananilirsiniz. Bu fonksiyon, < ve > karakterlerini < ve >karakterlerine dönüştürecektir.
SQL Injection Yönetemi:
Günümüzde bir çok web sitesi verileri barındırmak için veritabanı kullanmaktadır. Bu bağlamda veritabanına girmek için bir çok INSERT, UPDATE ve SELECT işlemleri yapılmaktadır. Buna rağmen bir çok site, form verileri açısında SQL Injection yöntemi ile atağa uğramak konusunda yeterli güvenliğe sahip değildir.
SQL Injection, değiştirilmiş, atak için düzenlenmiş form içerikleri ile yapılan veritabanı sorgularıdır. Bu ataklar veritabanınızdan bir kaç veriyi çalmak, izinsiz login olmak, ya da tüm veritabanını silmek gibi sonuçları doğurabilir.
En genel kullanımı anlatmak için aşağıdaki kod örneğine bakalım:
site_users
WHERE
username = ‘$username’
AND
password = ‘$password’
“);
if ( mysql_num_rows($result) > 0 )
// login oldu
Yukarıdaki kod örneği, SQL Injection için gerekli ortamı hazırlamaktadır, bu konuda zaafiyet oluştrabilecek bir kod örneğidir. Kötü amaçlı bir kişi yukarıdaki SQL’i değiştirerek sisteme izinsiz giriş yapabilir. (Kullanıcı şifresini girmeden login olabilir)
Örneğin kötü kullanıcı (saldırgan) kullanıcı adı alanına “rob” şifre (password) alanına aşağıdaki gibi bir giriş yaparsa:
‘ OR 1=1 ‘
Yukarıdaki kod şu şekli alır:
SELECT *
FROM
site_users
WHERE
username = ‘rob’
AND
password = ” OR 1=1
Bu SQL sorgusu ise, kullanıcı adı “rob” olan kaydın şifresi ne olursa olsun getirmektedir. Yani şifre kontrolu gerçekleşememiştir.
SQL Injection Atağından Nasıl Korunurum?
XSS Atağında olduğu gibi, en büyük sorun kullanıcının gönderdiği veriyi olduğu gibi kullanmaktır. Korunmanın en iyi yöntemi ise, kullancıı verisini riskli karakterlerden arındırmaktır. mysql_real_escape_string() fonksiyonu bu amaçla PHP içerisinde yer alıyor. Bu fonksiyon riskli olan ‘ ve ” gibi karakterleri temizlemektedir. Ayrıca, SQL sorgularınızda kullandığınız kullancıı verileri, eğer, sayı olmanı bekleniyorsa intval() fonksiyonu ile gelen verinin sadece sayı bilgisi olan kısmı alınmalıdır.
Dosya Yüklemesi Atağı (File Upload)
Kullancıların yükledikleri dosyalar en büyük güvenlik risk unsurlarının başında gelmektedir. Bu, tanımadığınzı bilmediğiniz dosyaları sunucunuzda barındırmak anlamındadır. Bu dosyalar, dosyalarınız silmek için, veri tabanınızı boşaltmak için olabilir. Ya da daha başka bir çok güvenlik problemine neden açabilecek dosyalar olabilir.
Buna rağmen, güvenli şekilde dosya almak kontrol içerisinde alındığında mümkündür.
Kullanıcıların sisteminize dosya yüklemesine izin verdiğiniz durumlarda, kontrol etmeniz gereken 2 önemli bilgi mevcuttur.
Birincisi, dosyanın “mime-type” ıdır. Yani, dosyanın header’ında bulunan ve dosya tipini belirten bölüm. Örneğin kullanıcının sadece resim dosyası upload etmesini istiyorsanız yüklenen dosyanın “mime-type” ı image/png, image/jpeg, image/gif, image/x-png ya da image/p-jpeg olmalıdır. Aşağıdaki kod bu kontrolü gerçekleştirir.
$validMimes = array(
‘image/png’,
‘image/x-png’,
‘image/gif’,
‘image/jpeg’,
‘image/pjpeg’
);
$image = $_FILES[’image’];
if(!in_array($image[’type’], $validMimes)) {
die(’Üzgünüm, izin verilmeyen dosya tipi.’);
}
// İşlem tamam yüklemeyi gerçekletir vs vs.
İkinci kontrol etmeniz gereken bilgi ise, dosyanın uzantısıdır. Zira, mime-type bilgisi manuple edilebilir bir bilgidir. Bu bağlamda dosyanın uzantısını kontrol etmeniz gerekir. Zira bir kullanıcı, bir imaj dosyasının mime-type ı ile bir PHP dosyası gönderebilir. Bu durumda siz bir PJP dosyasını sisteminize almış olursunuz ki bu çok ciddi bir risk faktörüdür.
Bu durumdan korunmak için, sisteminize yüklediğiniz dosyaların uzantıları, siz tanımlamalısınız. Bu tanımlamayı ise mime-type bilgise göre yapabilirsiniz. Aşağıdaki örneğe bakalım:
$validMimes = array(
‘image/png’ => ‘.png’,
‘image/x-png’ => ‘.png’,
‘image/gif’ => ‘.gif’,
‘image/jpeg’ => ‘.jpg’,
‘image/pjpeg’ => ‘.jpg’
);
$image = $_FILES[’image’];
if(!array_key_exists($image[’type’], $validMimes)) {
die(’Üzgünüm, izin verilmeyen dosya tipi.’);
}
// Dosya uzantısını barındırmayan dosya adını alalım:
$filename = substr($image[’name’], 0, strrpos($image[’name’], ‘.’));
// Mime type göre dogru uzantıyı verelim
$filename .= $validMimes[$image[’type’]];
// İşlem tamam
Yukarıdaki örnekle, bir PHP dosyanının sanki bir resim dosyasıymış gibi sisteminize PHP dosyası olarak yüklenmesini engellediniz. Dosya mime-type’ı PNG’yi işaret ediyorsa, dosya uzantısı .png olacaktır.
Dosya Include Atağı:
Kullanımı çok yaygın olan index.php?sayfa=xxxx.php şeklideki dosya include yöntemi çok ciddi risk taşıyabilir. Bu kullanım genelde, menü yapısı, logo gibi bölümleri index.php ye kaydedip içerik bölümünü başka dosyalarda saklayarak site yönetimini kolaylaştırmak için kullanılır. Bu durumdaki yanlışlık,
include $_GET[’sayfa’];
gibi bir kod ile gelen değişkene göre sayfayı include etmektendir.
Yukaridaki kullanımda PHP’nin allow_url_fopen ayarı ON durumda ise, yani aktifse, saldırgan başka bir sunucudaki dosyayı sitenize include edebiliyor demektir. Kodunuz da echo file_get_contents() değil de include kullanıdığı için bu çok sık karşılaşılan bir açığa sebebiyet vermektedir. Bu durum, sunucunuzun tüm kontrolünü saldırgana bırakmak demektir.
Bu durumdan yapabileceğiniz 2 şey vardır.
Birincisi, bir liste oluşturup gelen değişkeni burada kontrol etmektir. Örneğin şöyle bir kod ile:
switch($_GET[’sayfa’]) {
case “hakkimizda”:
include(’hakkimizda.php’);
break;
case “haberler”:
include(’haberler.php’);
break;
default:
include(’anasayfa.php’);
}
Bu kod ile include edebileceğiniz her sayfayı belirtiyor ve belirtmediğiniz sayfa için anasayfa.php dosyasını include ediyorsunuz. Bu yöntemin zor tarafı, ekleyeceğiniz her sayfayı bu listeye de eklemek zorunluluğudur.
İkinci bir yöntem ise, dışarodan gelen $_GET[’sayfa’] değişkenini kontrol etmek ve temizlemektir.
$sayfa = preg_replace(’/\W/si’, ”, $_GET[’sayfa’]);
include(’./’.$sayfa.’.php’);
Yukarıdaki kod, “..”, “/” gibi karakterleri temizleyerek kullanıcının 212.111.111.111 gibi ip ya da http://www.kotusite.com gibi domain belirtmesini engeller. Bu verileri 212111111111, httpwwwkotusitecom şekline çevirir.
Dosya include atağındaki diğer bir açık ise, include edilen dosyaların uzantılarını .inc gibi sunucunun tanımayacağı bir uzantı yapmaktır. Örneğin, config.inc gibi bir dosya yapıp bunu include etmek çok sakıncalı olabilir. Zira, saldırgan bu dosyanın adını ve yerini öğrendiğinde, eğer web suncuunuz bu dosyayı çalıştırabilir bir dosya olarak tanımıyorsa (ki tanımama ihtimali yüksektir), saldırdan dosya içeriğini görecektir. Bu durumda yapabileceğiniz, her türlü dosya uzantınızı .php yapmaktır. Boylece saldırgan bu dosyaların içeriğini görüntüleyemez. Diğer bir yöntem ise Apache sunucular için, aşağıdaki gibi bir .htaccess dosyası olusturarak .inc dosyalarının ulaşılmasını engelleyebilirsiniz.
Order allow,deny
Deny from all
Register Globals Atağı:
register_globals değeri PHP ayarında ON durumda ise, $_POST, $_GET, $_SERVER, $_COOKIE, $_REQUEST, $_FILE ile gelen değişkenlere global değişkenler olarak ulaşabilirsiniz. Yani mesela $_POST[’mesaj’] değişkenine $mesaj olarak ulaşabilirsiniz.
register_globals değeri güncel PHP kurulumlarında varsayılan olarak OFF durumdadır. Ancak eski bir PHP kurulumu bulunan sunucuda, ya da sistem yönetici tarafından özellikle açılmış bir sunucuda ON durumunda olabilir (ki paylaşımlı hosting firmaları geçmiş müşterilerinin kodlarının uyumu adına açabiliyorlar).
register_globals’in ON olamsı durumu için aşağıdaki kodu inceleyelim.
dosya.php dosyası örneği:
if($_POST[’username’] == ‘rob’ && $_POST[’password’] == ‘foo’) {
$authenticated = true;
}
if($authenticated) {
// giriş başarılı bişeyler yapalım
}
Saldırgan, dosya.php?authenticated=true şeklinde bir URL çağrımı ile, sisteme izinsiz giriş yapabilir.
Bu durumda ne yapacağız, register_globals değerini OFF yapamayabileceğimiz durumların her zaman gerçekleşebileceğini düşünerek, kodumuzu şu şekilde değiştirelim.
$authenticated = false;
if($_POST[’username’] == ‘rob’ && $_POST[’password’] == ‘foo’) {
$authenticated = true;
}
if($authenticated) {
// giriş başarılı bişeyler yapalım
}
Bu kod, $authenticated değişkenini sayfa başında false yapmaktadır. $_POST’tan gelen veri eğer uygunsa $authenticated true yapılır. Böylece, dışarıdan gönderilen değişken ile izinsiz giriş yaplıması engellenmiş olur.
9.06.2008
Beyniniz hakkında 10 şaşırtıcı gerçek
İngiliz bilim insanları Sandra Aamodt ve Sam Wang, yeni çıkan "Welcome to Your Brain (Beyninize Hoşgeldiniz)" adlı kitapta beyin ve sinir sistemine yönelik gözden kaçırdığınız, bilmediğiniz ayrıntıları sıraladı. İşte bu ayrıntılardan bazıları...
Beynin farklı noktaları ayrı faaliyetler için kullanılıyor. (Grafik: New York Times)
Beyin 12 watt gücünde enerji kullanır ki büyük boy iki muzdan elde edilecek enerjiye eşittir. Vücut ağırlığının sadece %3'ünü oluşturmasına karşın beyin bütün enerjisinin yüzde17'sini tüketir. Bu enerjinin büyük kısmı ise beynin bakım ve destek faaliyetlerine gider. Dikkatli ve yoğun düşünme esnasında harcadığınız enerji o kadar küçüktür ki fark edilmez bile.
2. Sık yaşanan jet-lag hafızaya zarar verebilir
Jet-lag sadece sinir bozucu olmakla kalmaz, eğer sık aralıklarla tekrarlanırsa beyin sağlığınıza zararlıdır. Sıklıkla kıtalararası uçuş yapan insanlar beyin hasarı veya hafıza zayıflığı yaşayabilirler. Muhtemelen bunun sebebi jet-lag sırasında çok fazla stres hormonu salgılanması ve bu hormonların beyin lobuna ve hafızaya zarar vermesidir.
Vardiya usulü çalışan insanlarda da benzer bir risk söz konusu olabilir. Çalışma saatlerinde sıklıkla meydana gelen değişiklikler, tıpkı sık yapılan uçak yolculukları gibi, strese neden olmakta bu da vücut ve beyin üzerinde hasar yaratmaktadır.
3. Gürültülü bir odada niçin telefon konuşması yapmak zordur?
Gürültülü yerlerde cep telefonuyla konuşmak zordur. Cep telefonunuz içinde bulunduğunuz odanın sesleriyle hattın diğer ucundan gelen sesleri karıştırmak suretiyle beyninizin işini zorlaştırmaktadır. Bu durumda beyniniz telefondaki arkadaşınızın sesiyle odadaki diğer sesleri ayırt etmekte zorlanmaktadır. Telefonunuzun mikrofonunu elinizle kapattığınız anda aslında içinde bulunduğunuz odadaki seslerin telefona girmesine engel olduğunuz için ses karışımına engel olmakta ve beyninizin işini kolaylaştırmaktasınız.
4. Video oyunları, aynı anda birden fazla işi yapabilmenize yardımcı olabilir
Dikkatinizi aynı anda birden fazla şeye yöneltebilme yeteneği pratik yaparak artırılabilmektedir. Bu konuda yapabileceğiniz pratik ise, pek çok hedefe ateş etmek zorunda kaldığınız bir video oyunu olabilir. Bu tür oyunlar dikkatinizi ekrandaki her alana yaymanızı gerektireceği için olayları çabuk kavrama ve çabuk reaksiyon verme konusunda egzersiz yerine geçebilir.
Tetris oynamak aynı etkiyi yapmaz çünkü tetris oynarken birden fazla noktaya aynı anda dikkatini yöneltmek yerine sadece bir tek parçaya odaklanmış oluyorsunuz. Ama bu şekilde bir düşünce tarzıyla çocuklara iyi bir örnek olmadığınızı da bilmelisiniz.
5. Beynin bir şaka merkezi vardır
Mizah denen şeyi tanımlamak zordur ama onu gördüğümüzde hemen tanırız. Mizahın tarifini yapmaya çalışan bir teoriye göre, mizah kendi içinde bir sürpriz unsuru içermelidir –bir sonraki cümlede ne olacağını bildiğimizi sandığımız halde esprinin kendisi bizi başka bir noktaya götürmelidir- sonra da vardığımız bu yeni noktayı önceden tahmin ettiğimiz noktayla karşılaştırarak yeni bir perspektif elde ederiz. Mizahın beynimizde algılanma şekli aşağı yukarı böyledir.
Fıkra anlatmanın ya da espri yapmanın bulmaca çözmekten farkı ise, günlük yaşamda her gün rastlamayacağımız türden ama kendi içinde tutarlı bir hikâyenin bulunmasıdır. Beyinlerinin ön lobu (bilhassa sağ lobu) hasar görmüş bazı hastalar, yapılan esprileri anlayamamaktadır. Genelde bunun nedeni, fıkra ya da espriye konu olan imajları yeni bir perspektifle değerlendirme aşamasında beynin normal fonksiyonlarını yerine getirememesidir. Bu türden insanlar, anlatılan bir fıkradaki hikâyeyi takip edebilir ama fıkranın sonunu nasıl bağlarsanız bağlayın asla komik bulmazlar.
6. O şarkıyı bir türü hatırlayamıyorsanız sebebi var
Bazen bir şarkı veya şarkının bir bölümü aklınıza takılır kalır, bir türlü hangi şarkı olduğunu hatırlayamazsınız. Çok sinir bozucudur gerçekten. Ama beynin 'sıralı hatırlama' ilkesi, hafızamızın işleyişi açısından özel ve kullanışlı bir göreve sahiptir. Her şeyi olay akışının sırası içinde hatırlamamız gerekir.
Herhangi bir kâğıda adınızı yazarken, sabahları çay demlerken veya akşam evinize dönerken hangi sokaklardan ve kapılardan geçeceğinize karar verirken bile beyniniz bu kurala göre çalışmaktadır.
Bu 'sıralı hatırlama' fonksiyonu sayesinde günlük işlerimizi sürdürebiliyoruz. Bir şarkının veya bir film repliğinin sadece bir parçasını düşündüğünüzde, beyniniz –anılarınızın arasında- bu bilgi parçacığını eşleştireceği bir olay dizini aramaktadır. Büyük ihtimalle beyniniz en sonunda bu parçacığı bulacak ve siz aklınıza takılan o şarkıyı hatırlayacaksınız. Ama eğer 'aklınıza takılıp kalmış olması' sizi rahatsız ediyorsa ve o anlık takıntıdan kurtulmak istiyorsanız, beyninize uğraşması için başka bir 'sıra' verin. Söz gelişi başka bir şarkıyı düşünün veya söylemeye çalışın. Muhtemelen beyniniz 'dağınık hafıza kalabalığı' içinde sizin yönlendirmenizle biraz daha kısa sürede sonuca ulaşacaktır. Umarız bu yöntemi denerken başka bir can sıkıcı şarkıya takılıp kalmazsınız.
7. Güneş ışığı hapşırmanıza neden olur
Parlak güneş ışığına bakan pek çok kişi hapşırır. Niçin böyle bir refleks vardır ve nasıl çalışır? Hapşırmanın temel fonksiyonu bellidir: sizin nefes yollarınızı rahatsız eden madde veya parçacıkların dışarı atılması. Hapşırmayı kontrol eden merkez beynin lateral medulla denilen bölgesindedir. Bu bölgenin hasar görmesi halinde hapşırabilme yeteneğimizi kaybederiz.
Hapşırma genellikle 'rahatsız edici' bir unsurun uyarısıyla tetiklenir. Bu uyarının beyinde ulaşacağı nokta 'lateral medulla'dır. Bu bilgi beyne burnumuzdaki çeşitli sinirler vasıtasıyla iletilir. Bu sinirlerden biri de trigeminal sinirdir ve çok yoğun çalışan bir trafiğe aracılık etmektedir. Normalde parlak güneş ışığının yalnızca göz bebeklerinin küçülmesini tetiklemesi gerekirken burun kaşındırıcı impulsları ileten komşu bölgelerdeki nöronlar da aynı şekilde etkilenebilmekte. Gözbebeklerinin küçültülmesi sinyali bu nedenle bazen hapşırmaya neden oluyor.
8. Kendinizi gıdıklayamazsınız
Gıdıklanma konusunda duyarlı hastaları muayene ederken doktorlar hastanın elini kendi elleri üzerine yerleştirerek gıdıklanma hissine engel olurlar. Bu nasıl olmaktadır? Çünkü gıdıklanmaya ne kadar duyarlı olursanız olun, kendinizi gıdıklayamazsınız.
Bunun nedeni beynimizin etrafımızda olan bitenleri takip ederken pek çok hissimiz arasında en önemli olanları hissetmeye programlanmış olmasıdır. Mesela oturduğunuz sandalyeyi veya ayağımıza giydiğimiz çorabı –özellikle onları düşünmediğimiz sürece- hissetmeyiz ama omzumuza dokunan bir el hemen bizi irkiltecektir.
Beynin bu 'hisleri ayırt etme' fonksiyonunu sürdürebilmesi için bizim temasımızı başkalarının temasından ayırt etmeye yarayan bir sinyal üretmesi gerekmektedir. Bu fonksiyonu gerçekleştiren ise beyinciktir. Yaklaşık 110 gram ağırlığındaki bu organ, kendi eylemlerimizin yaratacağı hisleri tayin eden yerdir. Beklenen veya beklenmeyen reaksiyonları ayırt etme işi beyinciğe aittir.
Beyincikten gelen sinyallere göre, beyin bu hissin önemli olup olmadığına karar verir. Gıdıklanma hissi abartılmış bir refleks olmakla birlikte, eğer size dokunan gene size ait bir organsa, beyin bu gıdıklanmanıza değil, dokunduğunuz organdan (mesela elinizden) gelen hislere öncelik verecektir.
9. Esnemek beyni uyandırır
Esneme aktivitesini uyku hali veya sıkılmış olmakla ilişkilendirmemize rağmen esnemenin fonksiyonu uyandırmaktır. Esneme, daha fazla miktarda havanın ciğerlerimize dolmasına neden olacak şekilde kas gruplarını çalıştırır ve kanımızdaki oksijen oranını hızla yükselterek bizi uyandırır. Memeli hayvanlar ve kuşlarda da esneme vardır. 12 haftalık olmuş fetuslarda esneme olduğu gözlenmiştir.
Esnemenin, vücut tarafından tam uyanıklığa erişmek amacıyla başlatılan bir hareket olduğunu düşünün. Ve esnemek bulaşıcıdır. Odada bir kişi esnerse diğerleri de esnemeye başlar. Bunun nedeni tam olarak bilinmemekle birlikte, topluluk içinde birisi 'uyanıklığa ihtiyaç duymuşsa' herkesin 'uyanık olması' gerektiği şeklinde toplumsal bir içgüdüden kaynaklanıyor olabilir. Köpeklerin esnemesi, stresli bir durumda 'rahatlatıcı' etki yaratmaktadır. Köpekler esneyerek etrafındakileri 'sakinleştir'. Huzursuzluk eden köpeğinizin karşısında esneyerek onu sakinleştirebilirsiniz.
10. İrtifa arttıkça beyin garip resimler görür
Pek çok dinin hikâyelerinde yüksek yerlerde görülen özel görüntüler anlatılır. Mesela Hz.Musa Sina Dağı'nda 'yanan bir çalı' görmüştü. Hz. Muhammed ise Hira Dağı'nda Cebrail'i gördü. Genelde anlatılan ruhsal deneyimlerde yabancı bir varlığın hissedilmesi (sesinin duyulması) bir şekil görme veya çeşitli ışık demetleri ve huzmeleri görüldüğü ve korku duyulduğu ortak olarak belirtilmiştir.
Buna benzer olgulara dağcılarda da rastlanır ki bunların pek çoğunun mistik kişiler olmadığını biliyoruz. Bunun nedeni genelde yerden yükseldikçe havadaki oksijen oranının düşmesi ve beyne daha az oksijen gitmesidir. 2 bin 400 metre yükseklik bu durumda bir sınır değer olarak kabul edilmektedir. Bu yükseklikten daha yukarı tırmanan dağcılar görünmeyen
5.06.2008
Flash Oyun Sitesi yayında
Sonunda oyun sitemiz yayına başladı. Bu adresi bir kenera not edin en güzel flash oyunları burada olacak.
www.dersbilgisayar.info
www.dersbilgisayar.info
Kaydol:
Kayıtlar (Atom)