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.
Yararlandığım Kaynaklar:
- https://dev.iyzipay.com/tr/sss/samesite-problemi-nedir
- https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.md
- https://stackoverflow.com/questions/59534999/how-to-tell-php-to-use-samesite-none-for-cross-site-cookies
- https://stackoverflow.com/questions/39750906/php-setcookie-samesite-strict
Merhabalar 1.5.6.4 versiyonu için hangi adımları izlememiz gerekiyor yardımcı olursanız ssevinirim.
YanıtlaSilsession_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ıtlaSilTeşekkür Ederim belirmiş olduğunuz gibi ve php.ini ve .htaccess ilede tanımladım sorunsuz çalışmakta.
YanıtlaSilselamlar işlemleri yaptım webpos modülü kullanıyorum bank_id unknown hatası alıyorum konu hakkında yardımcı olabilirmisiniz.
YanıtlaSilselamlar. 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ıtlaSilMerhabalar.
YanıtlaSilOpencart 3.X için çözüm var mıdır acaba.
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.
SilBu yorum yazar tarafından silindi.
YanıtlaSilHocam 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ıtlaSilMerhaba. 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).
SilHocam 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ıtlaSilsession->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.
Silphp 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ş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Ö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ıtlaSilkodları değiştirince satış yapmıyor
YanıtlaSilVerdiğ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ıtlaSilMerhaba 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ıtlaSilMerhaba. php 7.3 yaparak deneyebilir misiniz? Login kısmıyla ilgili bir değişiklik içermiyor hata kodlarını incelemenizi önerebilirim.
SilHızlı geri dönüş için teşekkür ederim, SSL olmadan test yapıyorum bu yüzden olabilir mi ?
SilOlabilir, 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