İçeriğe geç
Çılgın Yazılım

Siber Güvenlik kod örnekli

LLM API'ye Kişisel Veri Göndermek: Yurt İçi İşleme Yeter mi?

Veri yurt içindeki bir sağlayıcıda işlenip yurt dışından erişilemiyorsa KVKK md. 9 sorusu düşer. Talepteki kimlik, kart ve IBAN numarasını modele gitmeden yakalamak sizin kodunuzun işidir.

Çılgın Yazılım 8 dk okuma

LLM API'ye Kişisel Veri Göndermek: Yurt İçi İşleme Yeter mi?
İçindekiler
  1. Yurt dışındaki bir API için md. 9 ne ister?
  2. Veri Türkiye'de kalınca hangi sorular kalır?
  3. EVREN ne söylüyor, onaylamadan önce ne okunur?
  4. Göndermeden maskeleyin: TCKN, kart, IBAN, telefon, e-posta
  5. Kimlik ve kart numarasını kontrol hanesiyle ayırın
  6. Metni API'ye gitmeden tek fonksiyondan geçirin

Destek talebindeki kişisel veriyi Türkiye'de işleyen bir LLM API'sine göndermek, KVKK'nın yurt dışına aktarım maddesini (md. 9) devreden çıkarabilir. Veriyi hangi hukuki sebeple işlediğiniz, müşteriye bunu söyleyip söylemediğiniz ve modele ne kadarını gönderdiğiniz ise sağlayıcı nerede olursa olsun sizin sorunuzdur. Ürün ekibinin isteği kısadır: "Destek taleplerini modele özetletelim." Bu istek olduğu gibi uygulanırsa talebin içindeki kimlik, kart ve IBAN numarası da API isteğine girer.

Yurt dışındaki bir API için md. 9 ne ister?

Sağlayıcı isteği yurt dışında işliyorsa, istekteki kişisel veri yurt dışına aktarılmış olur ve 6698 sayılı Kanun'un 9. maddesi devreye girer. 7499 sayılı Kanunla değişen madde 1 Haziran 2024'ten beri yürürlükte ve üç basamaklı bir sıra kurar. İlk iki basamakta md. 5 ya da md. 6'daki işleme şartlarından biri de aranır:

  1. Yeterlilik kararı: Kurul bir ülke, sektör ya da uluslararası kuruluş için karar verir ve karar Resmî Gazete'de yayımlanır.
  2. Uygun güvence: Karar yoksa taraflar güvence sağlar. Kanunun saydığı dört güvenceden Kurul izni ya da onayı beklemeyen tek yol standart sözleşmedir. Yurt dışına aktarım yönetmeliğine göre metin değiştirilmeden kullanılır ve imzalardan sonra beş iş günü içinde Kurum'a bildirilir. Bu basamakta ilgili kişinin o ülkede de haklarını kullanabilmesi ve etkili kanun yollarına başvurabilmesi ayrıca şarttır.
  3. Arızi haller: İkisi de yoksa açık rıza (muhtemel riskler anlatılarak) ya da sözleşmenin ifası gibi sınırlı haller kalır.

Kanun üçüncü yolu "arızi olmak kaydıyla" açar ve yönetmelik bu kelimeyi tarif eder: "Düzenli olmayan, tek veya birkaç sefer gerçekleşen, süreklilik arz etmeyen ve olağan faaliyet akışı içinde bulunmayan aktarımlar arızi niteliktedir." Her destek talebini modele gönderen bir entegrasyonu bu tarifle kendiniz karşılaştırabilirsiniz. Kurum'un üretken yapay zekâ rehberi de yurt dışındaki hizmet sağlayıcılar üzerinden kullanılan sistemlerde aktarımın 9. madde ve yönetmeliğe uygun yapılması gerektiğini yazar.

Veri Türkiye'de kalınca hangi sorular kalır?

Veri Türkiye'de işleniyor, yurt dışından erişilemiyor ve sağlayıcı yurt içinde yerleşikse bu sıra devreye girmez. Tablonun öteki beş satırı ise sağlayıcının nerede olduğuna bakmaz:

SoruYurt dışındaki APIYurt içindeki API
Aktarım güvencesi (md. 9)Yeterlilik kararı ya da standart sözleşme ve bildirimGerekmez, veriye yurt dışından erişilemiyorsa
İşleme şartı (md. 5, özel nitelikli veride md. 6)GerekirGerekir
Aydınlatma (md. 10)Sağlayıcı, verinin "kimlere ve hangi amaçla aktarılabileceği" bilgisinde alıcı grubu olarak yer alırAynısı
Ölçülülük (md. 4/2-ç)Modele işin gerektirdiği alanlar giderAynısı
Saklama ve silme (md. 4/2-d, md. 7)Sağlayıcıdaki istem kayıtları da dahilAynısı
Güvenlik (md. 12)Veri işleyenle müştereken sorumlulukAynısı

Sağlayıcının yeri tablonun ilk satırını değiştirir. Yönetmelik aktarımı, verinin yurt dışındaki bir veri sorumlusuna ya da veri işleyene "iletilmesi ya da başka bir suretle erişilebilir hâle getirilmesi" diye tanımlar. Sunucu Türkiye'de olsa da veriye yurt dışından erişilebiliyorsa ilk satır geri gelir. Rolünüz de değişmez: rehber, hazır bir modeli kendi işine entegre edip amacı ve kapsamı belirleyen şirketin veri sorumlusu sayılabileceğini yazar. Rolü sözleşmedeki ifadenin tek başına değil, fiili kontrolün ve karar yetkisinin belirlediğini de ekler. Kanun ayrıca veri işleyenin alacağı güvenlik tedbirlerinde veri sorumlusunu onunla birlikte müştereken sorumlu tutar.

EVREN ne söylüyor, onaylamadan önce ne okunur?

EVREN, verinin yurt içinde kaldığını kendi LLM sayfasında açıkça yazan bir platformdur. Tek bir dil modeli olmadığını, açık ağırlıklı modelleri tek API'den sunduğunu EVREN yapay zekâ platformu yazısında anlattık. LLM çıkarım sayfasındaki beyana göre "istem, yanıt ve kullanım kayıtları Türkiye'de, milli bare-metal altyapıda yürütülür; yurt dışına veri aktarımı yapılmaz".

Bu, platformun kendi sayfasındaki bir beyandır. Tablonun ilk satırını ancak aynı güvence kullanım şartlarında da yazıyorsa kapatır. Cümle en az kullanım kayıtlarının tutulduğunu söylüyor, sayfanın SSS bölümü de kullanım ve maliyet kayıtlarının denetlenebilir biçimde tutulduğunu yazar. İstem ve yanıtların saklanıp saklanmadığı, saklanıyorsa ne kadar süre, kimin erişimiyle tutulduğu ve model geliştirmede kullanılıp kullanılmadığı ise giriş yapmadan açılan sayfalarda yazmıyor. Cevabın aranacağı yer kullanım şartlarıdır. Platformun geliştirici belgesine göre API, şartlar onaylanmadan gelen sohbet isteğini 403 terms_not_accepted ile reddeder ve metnin kendisi GET /v1/terms/text ucundan gelir. Onaylamadan önce o metinde saklama süresini, eğitimde kullanımı ve veri işleyen rolünü arayın. Onay akışını EVREN API'sine PHP ile ilk istek yazısı adım adım gösteriyor.

Platformdaki qwen3-guard-4b modeli kişisel veriyi metinden temizlemez. EVREN'in açıklamasına göre metin üretmez, içeriği Safe, Controversial ya da Unsafe diye sınıflandırır. Model kartındaki risk kategorileri arasında kişisel bilgi (PII) de var. Yine de metin aynen kalır ve denetlemek için onu da platforma göndermiş olursunuz.

Göndermeden maskeleyin: TCKN, kart, IBAN, telefon, e-posta

Ölçülülük ilkesinin bir LLM API isteğindeki karşılığı, modelin işine yaramayan kişisel veriyi istek sunucunuzdan çıkmadan silmektir. Talebi özetleyen ya da sınıflandıran model, müşterinin kimlik, kart ve IBAN numarasına ihtiyaç duymaz. Biçimi sabit olan beş veri türünü küçük bir PHP dosyası yer tutucuyla değiştirebilir.

Kimlik ve kart numarasını kontrol hanesiyle ayırın

On bir haneli her sayı kimlik numarası olmaz: sipariş, fatura ya da abone numarası da 11 hane olabilir. Kimlik numarasının son iki hanesi ilk dokuz haneden, kart numarasının son hanesi Luhn toplamından hesaplanır. Hesabı tutmayan sayıyı olduğu gibi bırakmak, modelin sipariş ya da kargo takip numarasını görmeye devam etmesini sağlar:

PHP
<?php
// Kontrol haneleri tutmayan 11 haneli sayı (sipariş numarası gibi) TCKN sayılmaz.
function tckn_gecerli(string $no): bool
{
    if (! preg_match('/^[1-9]\d{10}$/', $no)) {
        return false;
    }
    $h = array_map('intval', str_split($no));
    $tek = $h[0] + $h[2] + $h[4] + $h[6] + $h[8];
    $cift = $h[1] + $h[3] + $h[5] + $h[7];
    // 7 × tek − çift eksiye düşebilir; PHP'de % eksi sonuç verdiği için 10 eklenir.
    $onuncu = (($tek * 7 - $cift) % 10 + 10) % 10;
    return $h[9] === $onuncu && $h[10] === array_sum(array_slice($h, 0, 10)) % 10;
}

// Luhn toplamı tutmayan 13–19 haneli sayı (kargo takip numarası gibi) kart sayılmaz.
function kart_gecerli(string $rakamlar): bool
{
    $toplam = 0;
    foreach (array_reverse(str_split($rakamlar)) as $i => $r) {
        $r = (int) $r * ($i % 2 + 1);
        $toplam += $r > 9 ? $r - 9 : $r;
    }
    return preg_match('/^\d{13,19}\z/', $rakamlar) === 1 && $toplam % 10 === 0;
}

PHP'nin % işleci eksi bir sayıda eksi sonuç verir: -29 % 10 ifadesi -9 döndürür. Tek sıradaki haneler küçük, çift sıradakiler büyükse fark eksiye düşer. 10 eklenmezse 19090909018 gibi kurala uyan bir numara reddedilir.

Metni API'ye gitmeden tek fonksiyondan geçirin

Üçüncü fonksiyon aynı dosyada durur. E-posta önce işlenir, çünkü adresin içindeki rakamlar da numara kurallarına takılabilir. Her adım hata verirse istisna atar, böylece metin maskelenmeden geri dönmez:

PHP
function kisisel_veri_maskele(string $metin): string
{
    if (! mb_check_encoding($metin, 'UTF-8')) {
        throw new InvalidArgumentException('Metin UTF-8 değil; maskelenmeden gönderilmez.');
    }
    $metin = preg_replace([
        // E-posta önce: yerel kısımdaki rakamlar numara sanılmasın. Bakış geriye, aramayı kelime
        // başlarına indirir; yoksa JIT kapalı sunucuda uzun metinde süre ikinci dereceden büyür.
        '/(?<![\p{L}\p{N}._%+\'\-])[\p{L}\p{N}._%+\'\-]+@[\p{L}\p{N}\-]+(?:\.[\p{L}\p{N}\-]+)+/u',
        '/(?<!\d)TR ?\d{2}(?:[ \-]?\d{4}){5}[ \-]?\d{2}(?!\d)/iu',
    ], ['[E-POSTA]', '[IBAN]'], $metin) ?? throw new RuntimeException(preg_last_error_msg());
    // Kart: bitişik 13–19 hane, dört dörtlü grup, 4-6-5 ya da 4-6-4. Luhn ya da kontrol haneleri
    // tutmayan sayı takip ya da sipariş numarası olarak kalır.
    $metin = preg_replace_callback('/(?<!\d)(?:\d{13,19}|\d{4}(?:[ \-]\d{4}){3}|\d{4}[ \-]\d{6}[ \-]\d{4,5})(?!\d)/',
        fn ($m) => kart_gecerli(preg_replace('/\D/', '', $m[0])) ? '[KART]' : $m[0], $metin)
        ?? throw new RuntimeException(preg_last_error_msg());
    $metin = preg_replace_callback('/(?<!\d)[1-9](?: ?\d){10}(?!\d)/',
        fn ($m) => tckn_gecerli(str_replace(' ', '', $m[0])) ? '[TCKN]' : $m[0], $metin)
        ?? throw new RuntimeException(preg_last_error_msg());
    // 0532 000 00 01, 905320000001, +90 (532) 000-00-01, 0532.000.00.01, 0532/000 00 01
    return preg_replace('/(?<!\d)(?:\(?(?:\+?90|0)[\s.\/\-]{0,3})?\(?[2-5]\d{2}\)?[\s.\/\-]{0,3}\d{3}[\s.\-]{0,3}\d{2}[\s.\-]{0,3}\d{2}(?!\d)/u',
        '[TELEFON]', $metin) ?? throw new RuntimeException(preg_last_error_msg());
}

Uydurma bir destek talebiyle fonksiyonun girdisi ve çıktısı:

Metin
Girdi:
Merhaba, ben Ayşe Yılmaz. TC kimlik no: 10000000146
Sipariş no 20261011483, kart 4111 1111 1111 1111 ile ödedim.
İade TR63 0000 0000 0000 0012 3456 78 hesabına yapılsın.
Bana 0532 000 00 01 ya da ayşe.yılmaz@örnek.example adresinden ulaşın.

Çıktı:
Merhaba, ben Ayşe Yılmaz. TC kimlik no: [TCKN]
Sipariş no 20261011483, kart [KART] ile ödedim.
İade [IBAN] hesabına yapılsın.
Bana [TELEFON] ya da [E-POSTA] adresinden ulaşın.

Sipariş numarası kontrol hanelerini tutmadığı için kaldı, ad da olduğu gibi duruyor. Bu yüzden maskelenmiş talep hâlâ kişisel veridir: ad ve sipariş numarası onu bir kişiye bağlar. Yurt dışındaki bir API'de md. 9'un şartları maskelemeden sonra da aranır. Maskeleme tablonun ölçülülük satırına hizmet eder, aktarım satırına dokunmaz.

Kontrol haneli kurallar yanıldığında fazla maskeler. İlk dokuz hanesi aynı olan her 100 numaradan biri iki kontrol hanesini birden tutturur ve [TCKN] olur. Bitişik ya da kart gibi gruplanmış rastgele 13–19 haneli sayıların onda biri de Luhn kontrolünü geçip [KART] olur. 2–5 ile başlayan 10 haneli her sayı (vergi, fatura ya da sipariş numarası) telefon sanılır. Başında 0 ya da 90 olan ve ardından 2–5 ile devam eden 11 ve 12 haneli numaralar da öyle. Noktalı ya da tireli yazılmış kimlik numarası, dörtlü gruplardan sapan IBAN, yabancı telefon numarası, ad ve adres kuralların dışında kalır. Kartta yakalanan yazımlar bitişik, 4-4-4-4, 4-6-5 ve 4-6-4'tür. 16 haneden kısa ya da uzun dörtlü gruplar (Amex'in 4-4-4-3 yazılışı dahil), 4-4-8, noktalı, çift boşluklu ya da eğik çizgili yazım açıkta kalır. Bölünmez boşlukla (NBSP) ayrılmış kimlik, kart ve IBAN numarası da maskelenmez; bu boşluğu sadece telefon kuralı tanır. Yanıtta değeri geri koymanız gerekiyorsa yer tutucuları numaralandırıp eşleştirmeyi kendi sunucunuzda tutabilirsiniz. Bu takma ad olur; farkı yapay zekâ projelerinde KVKK yazısında anlattık.

Test ortamı: PHP 8.2.12 CLI, Windows 10, PCRE JIT açık ve kapalı. Kod, ?? throw ifadesi yüzünden PHP 8.0 ve üstünü, mb_check_encoding() için mbstring eklentisini ister. Fonksiyonlar yazıdaki hâliyle boş girdi, kurala uyan ve uymayan numaralar, boşluklu, noktalı, eğik çizgili ve 90 önekli telefonlar, boşluklu ve tireli IBAN, kart numaraları, Türkçe harfli e-posta, geçersiz UTF-8 ve 1 MB'lık zorlayıcı metinlerle çalıştırıldı. JIT kapalıyken 1 MB'lık zorlayıcı metinler altı tekrarda en çok 3,3 saniye sürdü. Kanun ve yönetmelik maddeleri mevzuat.gov.tr ve Resmî Gazete metninden, EVREN bilgileri platformun 11 Ekim 2026'daki sayfalarından alındı. Bu yazı genel bilgi verir, hukuki danışmanlık değildir.


Düzenli ifade, biçimi sabit olan veriyi bulur. "Annem geçen hafta ameliyat oldu, iade süresini kaçırdım" cümlesinde rakam ya da @ işareti yoktur, ama içindeki bilgi sağlık verisidir ve KVKK'da özel nitelikli sayılır. Bunu yakalamak için entegrasyonu açmadan önce geçmiş taleplerin her kategorisinden örnek seçin, maskeleyin ve bir kişiye okutun. Gözden kaçan her veri türü ya fonksiyona yeni bir kural olur ya da o form alanının modele hiç gönderilmemesi kararına dönüşür.

Beğeniniz benzer içerikleri öne çıkarmamıza yardımcı olur.

Sık sorulan sorular

ChatGPT'ye müşteri verisi göndermek KVKK'ya aykırı mı?

ChatGPT ya da başka bir servis veriyi yurt dışında işliyorsa, md. 9'un şartları sağlanmadan yapılan gönderim bu maddeye aykırıdır. Yeterlilik kararı yoksa standart sözleşme gibi bir uygun güvence gerekir. İşleme şartı, aydınlatma ve ölçülülük ise servis nerede olursa olsun ayrıca aranır.

KVKK madde 9'da 2024'te ne değişti?

7499 sayılı Kanunla değişen madde 1 Haziran 2024'te yürürlüğe girdi. Önceki metinde kural açık rızaydı. Rıza yoksa md. 5/2 ya da 6/3'teki bir şartla birlikte yeterli korumanın bulunduğu ülke ya da yazılı taahhüt ve Kurul izni gerekirdi. Yeni sıra yeterlilik kararı, uygun güvenceler ve arızi hallerdir. Eski birinci fıkra 1 Eylül 2024'e kadar yeniyle birlikte uygulandı.

TC kimlik numarası algoritması nasıl çalışır?

İlk hane 0 olamaz. Onuncu hane, tek sıradaki beş hanenin toplamının 7 katından çift sıradaki dört hanenin toplamı çıkarılarak bulunur (mod 10). On birinci hane ilk on hanenin toplamının birler basamağıdır. Bu toplam 8 × (tek sıradakilerin toplamı) mod 10'a indiği için son hane hep çifttir. Kurala uyan numara gerçek birine ait olmayabilir.

Yurt içinde kişisel veri aktarımı için hangi şart aranır?

KVKK md. 8'e göre kural açık rızadır. Md. 5'in ikinci fıkrasındaki şartlardan biri, örneğin sözleşmenin ifası ya da meşru menfaat varsa rıza aranmaz. Sağlayıcının veri işleyen mi ayrı bir veri sorumlusu mu olduğu, işleme üzerinde kimin karar verdiğine göre belirlenir.

Yazan

Çılgın Yazılım

Ben Evren Çılgın; yazılım geliştirme, web teknolojileri ve sistem tasarımı alanlarında uzmanlaşmış bir geliştiriciyim. Uzun yıllardır hem frontend hem de backend tarafında üretken, ölçeklenebilir ve kullanıcı dostu çözümler üretiyorum.

Hakkımızda Bize ulaşın

Bu konuda bir projeniz mi var?

İhtiyacınızı birkaç cümleyle anlatın; uygun yaklaşımı birlikte belirleyelim.

Projenizi Anlatın

İlgili yazılar

Yorumlar

Henüz yorum yok. Sorunuzu ya da deneyiminizi ilk siz yazın.

Yorum yazın

Yorumunuz onaylandıktan sonra yayınlanır. Ekibimiz gerekirse konuyla ilgili bir yanıt da paylaşır.

Yayınlanmaz; yalnızca gerektiğinde size ulaşmak için.

En az 10 karakter.

Tüm yazılar