Developersland

Teknoloji ve Yazılım Blogu

  • Yazıtipi boyutunu arttır
  • Varsayılan yazıtipi boyutu
  • Yazıtipi boyutunu azaltır

PHP Güvenlik 3

Session Güvenliği

php güvenlikSession içerisinde çok önemli bilgiler tutulduğundan session güvenlik açısından çok önemlidir. Session verilerinin sunucu tarafında tutulması güvenlik açısından içimizi rahatlatan en önemli faktördür.

SSL kullanımını etkinleştirmek server ve client arasındaki veri akışının daha güvenli bir biçimde sağlanması açısından önemlidir. SSL sayesinde bütün HTTP istek ve yanıtları korumalı bir şekilde aktarılır.

Güvenlik kalkanınızı biraz daha güçlendirmek isterseniz session içerisine yazılacak verileri şifreleyerek yazmayı tercih edebilirsiniz. Böylece session içerisindeki veriler şifrelemeyi çözecek anahtar olmadan okunamaz. Şifreleme işi session_set_save_handler( )  fonksiyonu yardımıyla yapılabilir.

Session değişkenini her seferinde yeniden üretmek de saldırganın işini zorlaştıracaktır



<?php

session_start();

if (!isset($_SESSION['initiated']))

{

   session_regenerate_id();

   $_SESSION['initiated'] = TRUE;

}

?>



Sitemizde bir belgeden aldığımız verileri arayüzde göstereceksek file_get_contents  den gelen veriler filtrelenmelidir. Bunu aşağıdaki gibi yapabiliriz:

<?php

    $clean = array();

    $html = array();

    /* Filter Input ($_GET['filename']) */

    $contents = file_get_contents($clean['filename']);

    /* Filter Input ($contents) */

    $html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8');

    echo $html['contents'];

?>


Login Formlarının Güvenliği


Sisteminize kayıtlı üyenin kullanıcı adı, şifre bilgilerini yazarak sisteme giriş yapacağı formların güvenliğinin sağlanması çok önemli bir güvenlik konusudur. Sisteme giriş yapmak isteyen bir saldırgan sürekli farklı şifreler deneyen bir bot tasarlayarak sisteminize giriş yapmaya çalışacaktır. Bu tarz botları engellemek amacıyla çeşitli güvenlik önlermleri alınabilir. Bunlardan bir tanesi sisteme giriş formunuzda captcha kullanmaktır. Bu çözüm başarılı olsa da kullanıcıları sıkan bir yöntem olduğundan bu yöntemi tercih etmek istemeyebilirsiniz. Alacağınız bir diğer güvenlik önlemi ise bir kişinin art arda belli bir zaman aralığında yanlış şifre denemesi yaptığını tespit ederek onun belli bir süre sisteme giriş yapmasını engellemektir. Bu süre 15 dk olarak belirlenebilir. Örneğin 3 kere yanlış şlifre girilirse bir daha deneme yapmak için 15 dk beklemesi gerekecek. Bu tarz bir yöntem saldırganın işini oldukça zorlaştıracaktır.

Http isteklerinin saldırgan tarafından dinlenmesi ihtimali göz önüne alınarak bu isteklerin güvenli bir şekilde gidip gelmesi amacıyla https protokolü kullanılabilir. Bu şekilde server ve client arasındaki veri akışı bir saldırgan tarafından ele geçirilse bile içeriğin ne olduğu kolay kolay çözülemeyecektir.


Paylaşımlı Hosting Kullanımından Doğabilecek Güvenlik Açıkları

Paylaşımlı hosting üzerindeki başka bir sitenin sahibi olan geliştirici sizin kaynak kodlarınızı okuyabilecek bir script geliştirebilir. Aşağıdaki gibi bir kodda file isminmi belirtmek bu işi gerçerkleştirmek için yeterlidir.

<?php

    header('Content-Type: text/plain');

    readfile($_GET['file']);

?>

Bu güvenlik açığını engellemek amacıyla alacağınız önemli önlemlerden bir tanesi de çok önemli bilgileri mümkün olduğunca veritabanında tutmaya çalışmaktır. Ancak bu da her zaman çözüm değildir çünkü veritabanı erişim bilgilerini yine de kaynak kodlarımız içerisinde tutmamız gerekecek. Bu soruna da şöyle bir çözüm getirebiliriz. Veritabanı erişim bilgilerini sadece root erişimi olacak şekilde ayarlarız.

SetEnv DB_USER "myuser"

SetEnv DB_PASS "mypass"

Bu değişkenlere kod içerisinde şu şekilde erişebiliriz:

<?php

    $db_user = $_SERVER['DB_USER'];

    $db_pass = $_SERVER['DB_PASS'];

    $db_host = 'localhost';

    $db = mysql_connect($db_host, $db_user, $db_pass);

?>

Önemli verileriniz $_SERVER değişkeninde olduğundan bu bilgileri kullanıcya sunabilecek phpinfo() fonksiyonunun kullanıcılara açık bir yerde kullanılmasından kaçının.

Session verilerinizin de güvenliği paylaşımlı hosting kullanımlarında tehlike altındadır. Session bilgileri tmp dosyası altında tutulur ve bu dosya bütün apache kullanıcılarının yazma izniyle erişebileceği bir yerdir.  Kötü niyetli bir kişi session verilerinin yazacağı bir script yardımıyla okuyabilir. Bu script aşağıdaki gibi olabilir.

<?php

    header('Content-Type: text/plain');

    session_start();

    $path = ini_get('session.save_path');

    $handle = dir($path);

    while ($filename = $handle->read())

    {

       if (substr($filename, 0, 5) == 'sess_')

       {

           $data = file_get_contents("$path/$filename");

           if (!empty($data))

           {

                 session_decode($data);

                  $session = $_SESSION;

                  $_SESSION = array();

                  echo "Session [" . substr($filename, 5) . "]\n";

                  print_r($session);

                  echo "\n--\n\n";

          }

      }

}

?>


Böyle bir güvenlik açığını kapatmanın yolu session bilgilerini veritabanında tutmaktır.


Php safe mode 


Bu mod açık ise bir script çalıştırıldığında o scripti ç.alıştıran kullanıcı ile erişilmeye çalışılan kaynak sahibinin aynı kullanıcı olup olmadığı kontrol edilir. Böylece başka bir kullanıcının sizin dosyalarınıza erişimi engellenmiş olur. Safe Mode php ile yazılmış scriptler için güvenlik sağlarken diğer dillerde yazılmış olan scriptler açısından bir şey ifade etmez. Aşağıdaki gibi bir CGI scripti buna örnektir.


#!/bin/bash

echo "Content-Type: text/plain"

echo ""

cat /home/victim/inc/db.inc


Host tarafından desteklenen Perl, Phyton gibi dillerde yazılacak scriptlerin hiçbiri safe mode ayarını dikkate almayacaktır.


Safe modun bir diğer zayıf tarafı ise scriptlerin kendi içerisinde yeni script yaratabilir ve bu yaratılan yeni scriptin sahibi web server olacaktır. Web server bütün dosyalara erişim hakkına sahip olduğundan safe modun burada herhangi güvenlik etkisi kalmayacaktır.


Kaynak : Php Essential Security- O'Reilly

 

Yorum ekle


Güvenlik kodu
Yenile