Açık Oturum Bilgileri
Web sayfası birden fazla sayfanın bulunduğu bir sunucuda bulunduruluyorsa tek başına bir tek sunucuda (dedicated server) bulunması durumundan daha fazla riske sahiptir.
Paylaşılan sunucuların en büyük riski oturum bilgilerinin ortak bir yerde saklanmasıdır. Ön tanımlı olarak PHP oturum bilgilerini /tmp altında doslayarda tutuyor. Ön tanımlı değerlerin her zaman saldırganların için ilk baktıkları yer olduğuna dikkat edilmelidir. Oturum dosyalarına sadece web sunucusu ulaşabilir :
$ ls /tmp
total 12
-rw——- 1 nobOdy nobOdy 123 May 21 12:34 sess_dc8417803c0f12c5b2e39477dc371462
-rw——- 1 nobOdy nobOdy 123 May 21 12:34 sess_46c83b9ae5e506b8ceb6c37dc9a3f66e
-rw——- 1 nobOdy nobOdy 123 May 21 12:34 sess_9c57839c6c7a6ebd1cb45f7569d1ccfc
$
Tabiki bir PHP kodu sayesinde bu dosyalara kolayca ulaşılabilir.
php.ini dosyasındaki safe_mode belirteci bu ve buna benzer durumları engeller. Fakat saldırganlar farklı programlama dilleri kullanarak oturum bilgilerine ulaşmaya çalışabilirler.
Bunun için şöyle bir çözüm uygulanabilir. Herkesin kullandığı yerler oturum kayıt etmek için kullanılmamalıdır. Veritabanaı, ki sadece sizin hesabınız tarafından ulaşılacaktır, oturum bilgilerinin kaydı için kullanılabilir. Bu session_set_save_handler() fonksiyonu kullanılarak yapılabilir.
Oturum bilgilerinin veritabanında tutulmasını sağlayan bir PHP örneği :
<?php
session_set_save_handler(’open’, ’close’, ’read’, ’write’, ’destroy’, ’clean’);
function open()
{
global $_sess_db;
if ($sess_db = mysql_connect(’127.0.0.1’, ’myuser’, ’mypass’))
{
return mysql_select_db(’sessions’, $_sess_db);
}
return false;
}
function close()
{
global $_sess_db;
return mysql_close($_sess_db);
}
function read($id)
{
global $_sess_db;
$sql = "SELECT data
FROM sessions
WHERE id = ’$id’";
if ($result = mysql_query($sql, $_sess_db))
{
$record = mysql_fetch_assoc($result);
return $record[’data’];
}
return false;
}
function write($id, $data)
{
global $_sess_db;
$access = time();
$data = mysql_escape_string($data);
$sql = "REPLACE
INTO sessions
VALUES (’$id’, ’$access’, ’$data’)";
return mysql_query($sql, $_sess_db);
}
function destroy($id)
{
global $_sess_db;
$sql = "DELETE
FROM sessions
WHERE id = ’$id’";
return mysql_query($sql, $_sess_db);
}
function clean($max)
{
global $_sess_db;
$old = time() - $max;
$sql = "delete from sessions where access < ’$old’";
return mysql_query($sql, $_sess_db);
}
?>
Bu kod veritabanında sessions adında ve aşağıdaki yapıda bir tablo olmasını gerektirir. Tablo :
mysql> DESCRIBE sessions;
--------------------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
--------------------------------------------------------------------
| id | varchar(32) | | PRI | | |
| access | int(10) unsigned | YES | | NULL | |
| data | text | YES | | NULL | |
--------------------------------------------------------------------
Bu tablo aşağıdaki SQL komutu ile oluşturulabilir :
CREATE TABLE sessions
(
id varchar(32) NOT NULL,
access int(10) unsigned,
data text,
PRIMARY KEY (id)
);
Oturum bilgileri veritabanında saklandığında oturum güvenliği veritabanı güvenliğine bırakılmış olur.