Iframe içinde Sanal POS kullanımı
Aşağıdaki örnek kodda olduğu gibi Sanal POS’u iframe içinde açabilirsiniz. iframe içinde yüklenen web sitesi kendi domain’iniz olmalıdır. Test amaçlı olarak web sitenizde sayfa 3’teki örnek formu kullanabilirsiniz.
<!doctype html><html><head><!-- Required meta tags --><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS --><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<title>iframe</title></head><body>
<div class="container"><script src="https://paynkolaytest.nkolayislem.com.tr/VPos/js/paynkolay-iframe-resizer.js"></script>
<!-- iframe içinde çağırdığınız web sitesi sizin web siteniz olmalıdır. Burada sayfa 3'teki örnek formu kullanabilirsiniz. --><iframe src="https://paynkolay.com.tr/entegrasyon/sanal-pos-test-ortam-iframe" id="paynkolayiframe" frameborder="0" scrolling="no" style="width: 100%;"></iframe><script>iFrameResize({},'#paynkolayiframe');</script></div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</body></html>Yaygın Sorunlar ve Çözümleri
Section titled “Yaygın Sorunlar ve Çözümleri”Ödeme işlemi tamamlandıktan sonra, successUrl adresinize yapılan yönlendirmenin düzgün çalışmaması veya kullanıcı oturumlarının beklenmedik şekilde sonlanması gibi sorunlar yaşayabilirsiniz. Bu sorunlar genellikle modern tarayıcıların güvenlik politikalarından kaynaklanmaktadır. Aşağıda en yaygın teknik nedenler ve çözümleri bulunmaktadır.
1. SameSite Çerez Kısıtlamaları (En Yaygın)
Section titled “1. SameSite Çerez Kısıtlamaları (En Yaygın)”Sorun:
Modern tarayıcılar (özellikle Chrome ve Safari), iframe içerisinde farklı domainlerden gelen yönlendirmelerde çerezleri (session cookies) varsayılan olarak engellemektedir. Paynkolay successUrl adresinize post yaptığında, tarayıcı bunu “üçüncü taraf (cross-site)” isteği olarak görür ve mevcut oturum çerezlerini (örneğin PHPSESSID) güvenlik nedeniyle bloklar. Bu durum, yazılımınızın kullanıcıyı “oturumu kapalı” veya aktif oturumu yok olarak algılamasına neden olur.
Çözüm:
Yazılımınız, oturum çerezlerini aşağıdaki parametrelerle yapılandırmalıdır:
SameSite=None- Çerezlerin cross-site bağlamlarda gönderilmesine izin verirSecure=true- HTTPS gerektirir (SameSite=Nonekullanırken zorunludur)
Örnek yapılandırma:
// PHP Örneğisession_set_cookie_params([ 'lifetime' => 0, 'path' => '/', 'domain' => '.domain.com', 'secure' => true, 'httponly' => true, 'samesite' => 'None']);session_start();// ASP.NET Core Örneğiservices.AddSession(options =>{ options.Cookie.SameSite = SameSiteMode.None; options.Cookie.SecurePolicy = CookieSecurePolicy.Always;});// Node.js/Express Örneğiapp.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false, cookie: { secure: true, httpOnly: true, sameSite: 'none' }}));# Django Örneği (settings.py)SESSION_COOKIE_SECURE = TrueSESSION_COOKIE_SAMESITE = 'None'SESSION_COOKIE_HTTPONLY = True2. X-Frame-Options Header Engellemesi
Section titled “2. X-Frame-Options Header Engellemesi”Sorun:
Sunucunuz veya yazılımınız, güvenlik nedeniyle sayfaların iframe içinde açılmasını engelleyecek şekilde yapılandırılmış olabilir. Eğer successUrl sayfanız sunucu yanıtında X-Frame-Options: DENY veya X-Frame-Options: SAMEORIGIN başlığı gönderiyorsa, tarayıcı güvenlik gereği bu sayfayı iframe içinde göstermeyi reddeder.
Çözüm:
Ödeme dönüş sayfanız (successUrl) için bu kısıtlamayı kaldırmanız veya belirli domaini izin vermeniz gerekmektedir.
Seçenek A: Header’ı tamamen kaldırın (kullanım durumunuz için güvenliyse)
# Apache (.htaccess)Header unset X-Frame-Options# Nginx# Mevcut add_header X-Frame-Options direktiflerini kaldırın veya yoruma alınSeçenek B: Belirli origin’e izin verin
# ApacheHeader set X-Frame-Options "ALLOW-FROM https://paynkolaytest.nkolayislem.com.tr"# Nginxadd_header X-Frame-Options "ALLOW-FROM https://paynkolaytest.nkolayislem.com.tr";Seçenek C: Content-Security-Policy kullanın (modern önerilen yaklaşım)
# ApacheHeader set Content-Security-Policy "frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr"# Nginxadd_header Content-Security-Policy "frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr";// ASP.NET Core (Startup.cs veya Program.cs)app.Use(async (context, next) =>{ context.Response.Headers.Add("Content-Security-Policy", "frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr"); await next();});// PHPheader("Content-Security-Policy: frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr");iframe Entegrasyonu için Kontrol Listesi
Section titled “iframe Entegrasyonu için Kontrol Listesi”Prodüksiyona iframe entegrasyonunu dağıtmadan önce aşağıdakileri kontrol edin:
- Oturum çerezlerini
SameSite=NoneveSecure=trueile yapılandırdınız mı? - Web sitenizde HTTPS’i etkinleştirdiniz mi? (
SameSite=Noneiçin gereklidir) - iframe içine gömmeye izin vermek için
X-Frame-Optionsheader’larını kaldırdınız veya yapılandırdınız mı? -
frame-ancestorsdirektifi ile uygunContent-Security-Policyayarladınız mı? - Başarı ve hata senaryoları dahil olmak üzere tam ödeme akışını test ettiniz mi?
- Ödeme tamamlandıktan sonra kullanıcı oturumlarının devam ettiğini doğruladınız mı?
- Birden fazla tarayıcıda test ettiniz mi? (Chrome, Safari, Firefox, Edge)
Teknik Arka Plan
Section titled “Teknik Arka Plan”Yukarıda açıklanan sorunlar, tarayıcı üreticileri tarafından kullanıcıları clickjacking saldırılarından ve cross-site veri sızıntısından korumak için uygulanan güvenlik iyileştirmelerinden kaynaklanmaktadır. Bu korumalar genel olarak web güvenliğini artırsa da, ödeme gateway’leri gibi meşru iframe tabanlı entegrasyonları uygularken dikkatli yapılandırma gerektirir.
SameSite çerez özelliği, Cross-Site Request Forgery (CSRF) saldırılarını önlemek için tanıtılmıştır. Varsayılan olarak, tarayıcılar artık çerezleri SameSite=Lax olarak işler ve bunları iframe’ler içindeki cross-site POST isteklerinde engeller. SameSite=None ayarı açıkça önceki davranışı kabul eder, ancak çerezlerin yalnızca şifreli bağlantılar üzerinden iletilmesini sağlamak için Secure bayrağını gerektirir.
Benzer şekilde, X-Frame-Options ve Content-Security-Policy header’ları, hangi sitelerin sayfalarınızı frame’lere gömebileceğini kontrol ederek clickjacking’e karşı koruma sağlar. Ödeme entegrasyonları için, yetkisiz frame’lemeye karşı korumayı sürdürürken güvenilir ödeme sağlayıcı domainlerinden gömmeye seçici olarak izin vermeniz gerekir.