Çerez ile kullanıcı banlama

Kohana cookie den yararlanarak basit bir çerez ile banlama sınıfı yazdım. Herşeyi tamamen Türkçe olarak açıkladım. Sınıf öncesindeki kodlar örnek çalıştırma kodlarıdır, yapılacak işlemlere göre uygun yerlere yerleştirilmelidirler.

Kullanıcı tarafında bulunan çerezler basit yöntemler ile silinebilmektedirler, çerez ile kullanıcı banlama komple/kalıcı bir güvenlik çözümü değildir. Kodları bir forumda sorulan “nasıl yapılır” sorunsuna cevap olarak yazmıştım.

$control değişkeni kullanıcıyı banlayıp, banlamayacağını bildirir, eğer $control değişkeni TRUE olursa kullanıcı banlanır, banın geçerli olması için sayfa değiştirmeli veya yenilemelidir. $control değişkenini belirleyecek olan kullanılacak sistemdir, örneğin kullanıcı 5 yorum yazarsa banlansın gibi bir uygulama ile kullanılabilir, o kısım uygulamaya göre değişeceğinden herhangi bir kod yazmadım.

Not: kohana ile birlikte kullanıma pek uygun değildir, çünkü kohana zaten çerez yazma/okuma sınıfına sahiptir, kohana için yazılacak çerez banlama sınıfı daha kısa olacaktır.

<?php
/**
 * @version $Id$
 * @author angelside
 * @copyright (c) 2011, NetVar <http://www.netvar.net>
 *
 * @licence GPL 3.0  http://www.gnu.org/licenses/gpl.html
 */

// Güvenlik çerezi kontrolü
if (GuvenlikCerezi::oku())
{
  die('Uzak dur');
}

// kontrol sisteminden gelen değer; TRUE/FALSE
$control = TRUE;

// Güvenlik çerezi yazma
if ($control)
{
  GuvenlikCerezi::yaz();
}

// diğer içerik
echo 'Sayfa içeriği';

/**
 * Güvenlik Çerezi sınıfı
 */
class GuvenlikCerezi
{
  /**
   * @var  string  Çerez adı
   */
  public static $isim = 'guvenlik_cerezi';

  /**
   * @var  integer  Çerezin bitiş süresi
   */
  public static $sure_sonu = 0;

  /**
   * @var  string  Çerez yolu
   */
  public static $yol = '/';

  /**
   * @var  string  Çerez alan adı
   */
  public static $alanadi = NULL;

  /**
   * @var  boolean  Güvenli bağlantı
   */
  public static $guvenli = FALSE;

  /**
   * @var  boolean  Sadece HTTP ile erişime izin ver, Javascript ile çereze erişilmesin
   */
  public static $sadecehttp = FALSE;

  /**
   * Çerez oku
   *
   * @static
   * @param null $sure_sonu
   * @return bool
   */
  public static function oku($sure_sonu = NULL)
  {
    if ($sure_sonu === NULL)
    {
      // Varsayılan süre sonu
      $sure_sonu = GuvenlikCerezi::$sure_sonu;
    }

    if ($sure_sonu !== 0)
    {
      // UNIX timestamp
      $sure_sonu += time();
    }

    return setcookie(self::$isim, self::_anahtar(), $sure_sonu, GuvenlikCerezi::$yol, GuvenlikCerezi::$alanadi, GuvenlikCerezi::$guvenli, GuvenlikCerezi::$sadecehttp);
  }

  /**
   * Çerez yaz
   *
   * @static
   * @return bool
   */
  public static function yaz()
  {
    if ( ! isset($_COOKIE[self::$isim]))
    {
      // Çerez mevcut değil
      return FALSE;
    }

    return TRUE;
  }

  /**
   * Çerez sil
   *
   * @static
   * @return bool
   */
  public static function sil()
  {
    // Çerezi sil
    unset($_COOKIE[self::$isim]);

    // Çerezi sıfırla ve süresi dolmuş yap
    return setcookie(self::$isim, NULL, -86400, GuvenlikCerezi::$yol, GuvenlikCerezi::$alanadi, GuvenlikCerezi::$guvenli, GuvenlikCerezi::$sadecehttp);
  }

  /**
   * Değişken çerez anahtarı
   *
   * @static
   * @return string
   */
  private static function _anahtar()
  {
    // rasgele bir sayı üretelim
    $anahtar = self::_rasgele();

    // Kullanıcı ajanı
    $ajan = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : 'bilinmiyor';

    return sha1($ajan.$anahtar);
  }

  /**
   * Rasgele sayı üret
   *
   * @static
   * @return string
   */
  private static function _rasgele()
  {
    return mt_rand().time();
  }

}

?>

 

 

Bir Cevap Yazın