Opencart Samesite Hatası ve Çözümü


Samesite Hatası:
Yeni Chrome güncellemesi ile yaşanan Samesite hatası opencart için de sıkıntı oluşturmaktadır. Özellikle ödeme aşamasında 3D güvenlik sms'i için banka sayfasına gidip geri döndüğünüzde oturumunuzun sonlanması durumu ciddi sıkıntılara yol açmaktadır. Ödeme alınsa dahi sipariş oluşmamaktadır. Samesite hatası hakkında ayrıntılı bilgi için: https://dev.iyzipay.com/tr/sss/samesite-problemi-nedir


Çözüm:
Öncelikle kullandığınız php sürümünün 7.3 veya üstü olduğuna emin olunuz. Bu çözüm için en az 7.3 sürümü gereklidir fakat daha düşük bir sürüm kullanıyorsanız verdiğim kaynaklara bakarak kodları değiştirebilirsiniz, ben test edemediğim için eklemedim. Yine bu çözümü opencart 2.3 versiyonu üzerinde denediğimi ve sorunsuz çalıştığını belirtmeliyim. Eksik gördüğünüz bir kısım olursa yorum yazmanızı rica ederim. Ayrıntısını aşağıda vereceğim fakat genel olarak session_start() ve setcookie() komutları öncesine 'samesite' => 'None' ve secure parametrelerini ekleyerek çözdüm.
Not: Bu çözümü opencart için yazdım fakat kendi yazılımınız için de uygulayabilirsiniz. Bulup değiştireceğiniz komutlar yine bu iki komuttur.

Düzenlediğim opencart dosyaları ve değişiklikler:

1. system/library/session.php

Bul:
session_set_cookie_params(0, '/');
session_start();
Değiştir:
if (PHP_VERSION_ID < 70300) {
    session_set_cookie_params(0, '/; samesite=None', '.yoursite.com', true, true);
} else {
    ini_set('session.cookie_samesite', 'None');
    session_set_cookie_params([
        'lifetime' => 0,
        'path' => '/',
        'domain' => '.yoursite.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'None'
    ]);
}
session_start();

Bul:
setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
} else {
    $samsite_cookie_options = array (
        'expires' => ini_get('session.cookie_lifetime'),
        'path' => ini_get('session.cookie_path'),
        'domain' => ini_get('session.cookie_domain'),
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie($key, $this->session_id, $samsite_cookie_options);
}

Bul:
setcookie($key, '', time() - 42000, ini_get('session.cookie_path'), ini_get('session.cookie_domain'));
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie($key, '', time() - 42000, ini_get('session.cookie_path'), ini_get('session.cookie_domain'));
} else {
    $samsite_cookie_options = array (
        'expires' => time() - 42000,
        'path' => ini_get('session.cookie_path'),
        'domain' => ini_get('session.cookie_domain'),
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie($key, '', $samsite_cookie_options);
}

2. catalog/controller/startup/startup.php

Bul:
setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
} else {
    $samsite_cookie_options = array (
        'expires' => time() + 60 * 60 * 24 * 30,
        'path' => '/',
        'domain' => $this->request->server['HTTP_HOST'],
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie('language', $code, $samsite_cookie_options);
}

Bul:
setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
} else {
    $samsite_cookie_options = array (
        'expires' => time() + 3600 * 24 * 1000,
        'path' => '/',
        'domain' => $this->request->server['HTTP_HOST'],
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie('tracking', $this->request->get['tracking'], $samsite_cookie_options);
}

Bul:
setcookie('currency', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie('currency', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
} else {
    $samsite_cookie_options = array (
        'expires' => time() + 60 * 60 * 24 * 30,
        'path' => '/',
        'domain' => $this->request->server['HTTP_HOST'],
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie('currency', $code, $samsite_cookie_options);
}

3. Bütün dosyalarınızı aratarak session_start() ve setcookie() komutlarını yukarıdaki gibi değiştiriniz. Aslında ilk 2 dosya üzerindeki değişiklikler yeterli olmaktadır ama yine de bir süprizle karşılaşmamak için diğer dosyalarınızı da taramanızı öneririm.


...


Gelen sorular üzerine ekliyorum. Opencart 2.1.0.1 için aşağıdaki ekran görüntülerindeki 3 dosyayı düzenlemeniz gerekmektedir. session_start ve setcookie komutlarını arayarak kendiniz de bulabilirsiniz. Bu satırları bulup yukarıdaki örneklerdeki gibi değiştiriniz.





Yorumlar

  1. Merhabalar 1.5.6.4 versiyonu için hangi adımları izlememiz gerekiyor yardımcı olursanız ssevinirim.

    YanıtlaSil
  2. session_start() ve setcookie() komutlarını tüm dosyalarınızda aratarak yukarıda belirttiğim gibi bu satırları değiştirin. Dikkat ederseniz benzer değişiklikler var her dosyada. PHP versiyonunuz 7.3 veya üstü olmalıdır.

    YanıtlaSil
  3. Teşekkür Ederim belirmiş olduğunuz gibi ve php.ini ve .htaccess ilede tanımladım sorunsuz çalışmakta.

    YanıtlaSil
  4. selamlar işlemleri yaptım webpos modülü kullanıyorum bank_id unknown hatası alıyorum konu hakkında yardımcı olabilirmisiniz.

    YanıtlaSil
  5. selamlar. bank_id hatasının neden olduğunu bilmiyorum fakat sorun ödeme modülünüzde bence oraya bakmalısınız. Fakat samesite hatası ile alakalı bir durum değil bu.

    YanıtlaSil
  6. Merhabalar.
    Opencart 3.X için çözüm var mıdır acaba.

    YanıtlaSil
    Yanıtlar
    1. Merhaba. Aslında yazdığım çözüm 3x içinde işe yarayacaktır. Sadece bu işi bul değiştir ile tek tek siz yapın. Ararken "session_start" ve "setcookie" kelimelerini aratın ve yukarıda verdiğim örnekteki mantıkta değiştirin.

      Sil
  7. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  8. Hocam Saygılar. Çok amatörüm opencart ile ilgili. Yukarıda ki dediklerinizi yapmaya çalıştım, hem admin panel hem de site ulaşılamaz hale geldi. Oynadığım dosyaların asıllarını da kaydetmediğim için aynı sürüm opencart dosyaları indirdim. İçlerinden session ve startup dosyalarını alıp bendekilerle değiştirdim. Şimdi panel açılıyor ama site http 500 hatası veriyor. Yardıma ihtiyacım var.

    YanıtlaSil
    Yanıtlar
    1. Merhaba. Bu işlemler için yardım almanızı öneririm. Önemli değişikler içerdiği için tek tek kontrol edilmesi gerekiyor. Sürümünüze göre de değişiklik gösterir. Basitçe önerebileceğim tek çözüm PHP versiyonunuzu 7.3 veya üstüne yükseltin (cPanel den yapılabiliyor kolayca).

      Sil
  9. Hocam ben 3.0.3.1 sürümü kullanıyorum da system/library/session.php de bahsettiğiniz kodlar yok. Bunlar benim kullandığım sürümde farklı bir dosyada olabilir mi?

    YanıtlaSil
    Yanıtlar
    1. session->start($session_id) ve setcookie( olarak dosyalarınızda aratınız ve benzer şekilde bu satırları düzenleyiniz. 3x versiyonlarında system/framework.php ve catalog/controller/startup/session.php dosyaları içerisine bakmanız gerekmektedir. zaten dediğim gibi arama yaparsanız bu sayfalar çıkacaktır.

      Sil
  10. php sürümünü 7.3 e güncelledğimde sitemde ürünler kısmında hata alıyorum o yüzden de test edemiyorum nasıl sorunsuz güncelleme yapabilirim acaba

    YanıtlaSil
    Yanıtlar
    1. şimdi olmasa bile ileride php sürümünüzü güncellemeniz gerekecek. yerinizde olsam php yi son sürüme günceller, ürünler kısmında çıkan hataları çözmeye çalışırdım. örneğin hatalar eski ve desteklenmeyen php komutlarından kaynaklanıyorsa onları değiştirin. tavsiyem bu yönde olacaktır. iyi çalışmalar.

      Sil
  11. Öncelikle teşekkür ederim fakat ben denedim bir 3 olan sitemde çalıştı diğer 2 versiyonda olmadı. https://mfbyazilim.com/isletmenize-ozel-e-ticaret-cozumleri/ şu arkadaşlara denk geldim destek verip çözdüler isteyen olursa iletişime geçebilirler.

    YanıtlaSil
  12. kodları değiştirince satış yapmıyor

    YanıtlaSil
  13. Verdiğim kodlar versiyonlarda denenmiş ve çalışır haldedir halen. Fakat temanız veya farklı eklentilerinizden kaynaklı sisteminize uygun düzenlemeleri siz yapmalısınız. İyi çalışmalar.

    YanıtlaSil
  14. Merhaba Opencart2.3.0.2 kullanıyorum php versiyonum 8.1 bu dediğiniz yerleri değiştirdim ancak bu sefer login olamıyorum konu ile ilgili bir fikriniz var mı acaba

    YanıtlaSil
    Yanıtlar
    1. Merhaba. php 7.3 yaparak deneyebilir misiniz? Login kısmıyla ilgili bir değişiklik içermiyor hata kodlarını incelemenizi önerebilirim.

      Sil
    2. Hızlı geri dönüş için teşekkür ederim, SSL olmadan test yapıyorum bu yüzden olabilir mi ?

      Sil
    3. Olabilir, bunu anlamak için session_set_cookie_params parametrelerinde değişiklik yaparak deneyebilirsiniz. Varsa Errorlog larını da incelemeniz yol gösterebilir. Rica ederim.

      Sil

Yorum Gönder