İçeriğe atla

Açık Oturum Bilgileri

18/12/2009

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.

Yorum yapın

Yorum yapın

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Değiştir )

Twitter picture

You are commenting using your Twitter account. Log Out / Değiştir )

Facebook photo

You are commenting using your Facebook account. Log Out / Değiştir )

Connecting to %s

Takip Et

Get every new post delivered to your Inbox.

Join 117 other followers