İçeriğe geç

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.

example.html
<!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>

Ö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 verir
  • Secure=true - HTTPS gerektirir (SameSite=None kullanırken zorunludur)

Örnek yapılandırma:

// PHP Örneği
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.domain.com',
'secure' => true,
'httponly' => true,
'samesite' => 'None'
]);
session_start();
// ASP.NET Core Örneği
services.AddSession(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
// Node.js/Express Örneği
app.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 = True
SESSION_COOKIE_SAMESITE = 'None'
SESSION_COOKIE_HTTPONLY = True

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ın

Seçenek B: Belirli origin’e izin verin

# Apache
Header set X-Frame-Options "ALLOW-FROM https://paynkolaytest.nkolayislem.com.tr"
# Nginx
add_header X-Frame-Options "ALLOW-FROM https://paynkolaytest.nkolayislem.com.tr";

Seçenek C: Content-Security-Policy kullanın (modern önerilen yaklaşım)

# Apache
Header set Content-Security-Policy "frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr"
# Nginx
add_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();
});
// PHP
header("Content-Security-Policy: frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr");

Prodüksiyona iframe entegrasyonunu dağıtmadan önce aşağıdakileri kontrol edin:

  • Oturum çerezlerini SameSite=None ve Secure=true ile yapılandırdınız mı?
  • Web sitenizde HTTPS’i etkinleştirdiniz mi? (SameSite=None için gereklidir)
  • iframe içine gömmeye izin vermek için X-Frame-Options header’larını kaldırdınız veya yapılandırdınız mı?
  • frame-ancestors direktifi ile uygun Content-Security-Policy ayarladı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)

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.