register_globals
Kullanımı
UyarıBu özelliğin kullanımı PHP 5.3.0
itibariyle ÖNERİLMEMEKTE olup PHP 5.4.0'da tamamen
KALDIRILMIŞTIR.
PHP'deki belki de en tartışmalı değişiklik,
register_globals
PHP yönergesinin öntanımlı değerinin PHP
» 4.2.0'da
On
iken Off
yapılmasıdır. Bu yönerge
üzerindeki geçmiş deneyimlere dayanmak oldukça yaygındı ve çoğu kişi
yönergenin varlığını bile bilmediği gibi PHP'nin böyle
çalıştığını varsayardı. Bu sayfada, bu yönerge ile yazılan kodun nasıl
güvensiz olabileceği gösterilecek, fakat güvensizliğin yönergenin
kendisinden ziyade nasıl yanlış kullanımından kaynaklandığı açıklanacaktır.
register_globals
On
iken, HTML formlarındaki istek
değişkenleri gibi bir takım değişkenler betiğinize dahil edilir.
PHP'nin değişken ilklendirme gerektirmeme olgusu güvensiz
kod yazımını daha da kolaylaştırır. Zor bir karar olmasına rağmen
PHP topluluğu bu yönergeyi öntanımlı olarak iptal
etmeyi uygun gördü. Yönergenin değeri On
iken,
kullanıcılar, değişkenleri, aslında ne olup bittiğini bilmeden sadece
varsayımla kullanırdı. Betiğin kendisi tarafından tanımlanmış dahili
değişkenler kullanıcı tarafından gönderilen istek verileri ile karışırdı.
register_globals
Off
yapılınca bu değişti. Yönergenin yanlış kullanımını
bir örnekle açıklamaya çalışalım:
Örnek 1 - register_globals = on
ile yanlış kullanım
örneği
<?php
// Sadece kullanıcı kimliği doğrulanıyorsa $yetkili = true olmalı
if (authenticated_user()) {
$yetkili = true;
}
// $yetkili değişkenini başta false ile ilklendirmediğimizden
// bu atama GET auth.php?yetkili=1 şeklinde register_globals
// üzerinden yapılmış olabilir. Dolayısıyla, kullanıcı kendini
// yetkiliymiş gibi gösterebilir!
if ($yetkili) {
include "/gayet/hassas/veriler.php";
}
?>
register_globals = on
iken yukarıda yürüttüğümüz mantık
zarar görebilir. register_globals = off
olduğunda,
$yetkili değişkenine istek üzerinden değer
atanamayacağından bir açık söz konunu olmayacaktır. Aslında değişkenleri
baştan ilklendirmek iyi bir programcılık alışkanlığıdır. Yukarıdaki
örnekte baştan $yetkili = false
yapabilirdik. Bu
ilklendirme yapılmış olsaydı, kullanıcı öntanımlı olarak yetkisiz
olacağından register_globals
yönergesinin değerinin ne
olduğunun bir önemi olmayacaktı.
Diğer bir örnek oturumlarla ilgilidir.
register_globals = on
iken, aşağıdaki örnekte
$kullanici değişkenini de kullanabilirdik, fakat tekrar
hatırlatmakta yarar var: $kullanici, GET gibi başka bir
kaynaktan da (örn, URL üzerinden) gelebilirdi.
Örnek 2 - register_globals
On veya Off iken oturum
örneği
<?php
// $kullanici'nin nereden geleceğini bilemezdik
// Fakat oturum verisi için $_SESSION kullanınca biliriz
if (isset($_SESSION['kullanici'])) {
echo "Merhaba <b>{$_SESSION['kullanici']}</b>";
} else {
echo "Merhaba <b>Ziyaretçi</b><br />";
echo "Oturum açmak ister misiniz?";
}
?>
Sahtecilik yapılmaya çalışıldığında uyaracak önleyici tedbirler almak da
mümkündür. Bir değişken vaktinden önce geliyorsa, gönderilen verinin
ilgisiz bir teslimat çeşidinden gelip gelmediğini sınayabilirsiniz.
Verinin sahte olmadığını garanti etmese de saldırganın yaptığı sahtecilik
türünün tahmin edilmesi gerekir. İstek verisinin geldiği yeri
önemsemiyorsanız, GET, POST ve COOKIE verilerinin bir karışımını içeren
$_REQUEST dizisini kullanabilirsiniz. Ayrıca, Dış Kaynaklı Değişkenler
bölümüne de bakınız.
Örnek 3 - Basit değişken sahteciliğinin saptanması
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE bir çerezden gelir.
// Çerez verisini doğrulamayı unutmayın!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("admin@example.com", "Olası kırma çabası", $_SERVER['REMOTE_ADDR']);
echo "Güvenlik ihlali; yönetici uyarıldı.";
exit;
} else {
// MAGIC_COOKIE bu istek (REQUEST) üzerinden atanmamış.
}
?>
Şüphesiz, tek başına register_globals = off
, kodunuzun
güvenli olduğu anlamına gelmez. Gönderilen her veri parçası başka yollarla
da ayrıca sınanmalıdır. Kullanıcı verinizi daima doğrulayın ve
değişkenlerinizi daima ilklendirin! İlklendirilmemiş değişkenleri görmek
için error_reporting() işlevi ile
E_NOTICE
seviyesinden hataların gösterilmesini
sağlamalısınız.
register_globals
'in On veya Off olmasının taklit
edilmesi hakkında bilgi edinmek için SSS'deki register_globals ile nasıl çalışacağım?
sorusuna bakınız.