Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

Secure Cookies: HttpOnly ve Secure Flagları

Merhaba değerli okuyucular! Bugün, web uygulamalarının güvenliğinde önemli bir rol oynayan secure cookies ve özellikle HttpOnly ve Secure flagları hakkında detaylı bir inceleme yapacağız. Bu önemli güvenlik önlemlerinin nasıl çalıştığını ve nasıl uygulanacağını adım adım ele alacağız. Hazırsanız, çerez güvenliğinin dünyasına dalalım!

Çerezler (Cookies) Nedir ve Neden Önemlidir?

Çerezler, web sunucuları tarafından oluşturulan ve kullanıcının tarayıcısında saklanan küçük veri parçalarıdır. Bunlar genellikle oturum yönetimi, kullanıcı tercihlerini hatırlama ve kullanıcı davranışlarını izleme gibi amaçlar için kullanılır.

Secure Cookies Nedir?

Secure cookies, standart çerezlere ek güvenlik özellikleri eklenmiş çerezlerdir. Bu özellikler, çerezlerin kötüye kullanımını önlemeye yardımcı olur.

1. HttpOnly Flag

HttpOnly flag, bir çerezin JavaScript tarafından erişilmesini engeller. Bu, XSS (Cross-Site Scripting) saldırılarına karşı önemli bir koruma sağlar.

HttpOnly Flag Nasıl Uygulanır?


// Node.js / Express örneği
app.use(session({
    secret: 'your-secret-key',
    cookie: {
        httpOnly: true // HttpOnly flag'i etkinleştirir
    }
}));

// PHP örneği
setcookie("session_id", $session_id, [
    'httponly' => true,
    'expires' => time() + 3600,
    'path' => '/'
]);

2. Secure Flag

Secure flag, çerezin yalnızca HTTPS üzerinden iletilmesini sağlar. Bu, man-in-the-middle saldırılarına karşı koruma sağlar.

Secure Flag Nasıl Uygulanır?


// Node.js / Express örneği
app.use(session({
    secret: 'your-secret-key',
    cookie: {
        secure: true // Secure flag'i etkinleştirir
    }
}));

// PHP örneği
setcookie("session_id", $session_id, [
    'secure' => true,
    'expires' => time() + 3600,
    'path' => '/'
]);

HttpOnly ve Secure Flaglarını Birlikte Kullanma

En iyi uygulama, bu iki flag'i birlikte kullanmaktır:


// Node.js / Express örneği
app.use(session({
    secret: 'your-secret-key',
    cookie: {
        httpOnly: true,
        secure: true
    }
}));

// PHP örneği
setcookie("session_id", $session_id, [
    'httponly' => true,
    'secure' => true,
    'expires' => time() + 3600,
    'path' => '/'
]);

Diğer Önemli Çerez Güvenlik Önlemleri

1. SameSite Attribute

SameSite attribute, CSRF (Cross-Site Request Forgery) saldırılarına karşı koruma sağlar.


// Node.js / Express örneği
app.use(session({
    secret: 'your-secret-key',
    cookie: {
        sameSite: 'strict' // veya 'lax'
    }
}));

// PHP örneği (PHP 7.3+)
setcookie("session_id", $session_id, [
    'samesite' => 'Strict',
    'expires' => time() + 3600,
    'path' => '/'
]);

2. Çerez Ömrünü Sınırlama

Çerezlere kısa bir ömür vermek, potansiyel riskleri azaltır.


// Node.js / Express örneği
app.use(session({
    secret: 'your-secret-key',
    cookie: {
        maxAge: 3600000 // 1 saat
    }
}));

// PHP örneği
setcookie("session_id", $session_id, [
    'expires' => time() + 3600, // 1 saat
    'path' => '/'
]);

Secure Cookies Uygulaması İçin Best Practices

  1. Hassas Bilgileri Çerezlerde Saklamayın: Şifreler veya kredi kartı bilgileri gibi hassas verileri asla çerezlerde saklamayın.
  2. Çerez İçeriğini Şifreleyin: Çerez içeriğini şifreleyerek ek bir güvenlik katmanı ekleyin.
  3. Düzenli Olarak Çerez Rotasyonu Yapın: Özellikle oturum çerezleri için düzenli rotasyon uygulayın.
  4. Path ve Domain Özelliklerini Doğru Ayarlayın: Çerezlerin yalnızca gerekli sayfalarda ve domainlerde kullanılabilir olmasını sağlayın.
  5. Çerez Güvenliğini Test Edin: Düzenli olarak çerez güvenliğinizi test edin ve denetleyin.

Secure Cookies Yönetimi İçin Örnek Sınıf

İşte secure cookies yönetimi için kullanabileceğiniz bir PHP sınıfı örneği:


class SecureCookieManager {
    private $defaultOptions = [
        'httponly' => true,
        'secure' => true,
        'samesite' => 'Strict',
        'path' => '/',
        'domain' => null,
    ];

    public function setCookie($name, $value, $options = []) {
        $options = array_merge($this->defaultOptions, $options);
        $options['expires'] = isset($options['expires']) ? $options['expires'] : time() + 3600;

        if (PHP_VERSION_ID < 70300) {
            setcookie(
                $name,
                $value,
                $options['expires'],
                $options['path'] . '; SameSite=' . $options['samesite'],
                $options['domain'],
                $options['secure'],
                $options['httponly']
            );
        } else {
            setcookie($name, $value, $options);
        }
    }

    public function getCookie($name) {
        return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null;
    }

    public function deleteCookie($name) {
        $this->setCookie($name, '', ['expires' => time() - 3600]);
    }

    public function encryptCookieValue($value, $key) {
        $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext_raw = openssl_encrypt($value, $cipher, $key, $options = OPENSSL_RAW_DATA, $iv);
        $hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary = true);
        return base64_encode($iv . $hmac . $ciphertext_raw);
    }

    public function decryptCookieValue($ciphertext, $key) {
        $c = base64_decode($ciphertext);
        $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
        $iv = substr($c, 0, $ivlen);
        $hmac = substr($c, $ivlen, $sha2len = 32);
        $ciphertext_raw = substr($c, $ivlen + $sha2len);
        $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options = OPENSSL_RAW_DATA, $iv);
        $calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary = true);
        if (hash_equals($hmac, $calcmac)) {
            return $original_plaintext;
        }
        return false;
    }
}

// Kullanım örneği
$cookieManager = new SecureCookieManager();

// Çerez oluşturma
$cookieManager->setCookie('user_id', '123456');

// Şifrelenmiş çerez oluşturma
$encryptedValue = $cookieManager->encryptCookieValue('sensitive_data', 'secret_key');
$cookieManager->setCookie('encrypted_data', $encryptedValue);

// Çerez okuma
$userId = $cookieManager->getCookie('user_id');

// Şifrelenmiş çerez okuma ve çözme
$encryptedData = $cookieManager->getCookie('encrypted_data');
$decryptedData = $cookieManager->decryptCookieValue($encryptedData, 'secret_key');

// Çerez silme
$cookieManager->deleteCookie('user_id');

Secure cookies, özellikle HttpOnly ve Secure flagları, web uygulamalarınızın güvenliğini önemli ölçüde artırabilir. Bu önlemler, XSS ve man-in-the-middle saldırıları gibi yaygın tehditlere karşı güçlü bir savunma hattı oluşturur.

Ancak, çerez güvenliği tek başına yeterli değildir. Güvenli bir web uygulaması için, bu önlemleri diğer güvenlik pratikleriyle birlikte kullanmalı ve sürekli olarak güvenlik stratejinizi güncellemelisiniz.

Siz uygulamalarınızda hangi çerez güvenlik önlemlerini alıyorsunuz? HttpOnly ve Secure flagları dışında kullandığınız başka yöntemler var mı? Deneyimlerinizi ve düşüncelerinizi yorumlarda paylaşın!

Güvenli kodlamalar ve güvenli çerezler dilerim!