Verileriniz nereye gidiyor?
Yüklediğiniz soy belgesinden sunucuya yalnızca ad ve soyadlar açık olarak gider. Kayıt yeri ile cilt-hane-birey numarası tarayıcınızda geri açılamayacak şekilde şifrelenir (teknik adı: Argon2id özeti); ham hâlleri sunucuya hiç ulaşmaz. T.C. kimlik numarası hiç okunmaz. Belgenin kendisi cihazınızdan çıkmaz.
Bu sayfa o cümleyi kanıtlamak için var. Bize inanmak zorunda değilsiniz — aşağıdakileri kendiniz kontrol edebilir ya da bir yapay zekaya kontrol ettirebilirsiniz.
Teknik bilginiz yoksa: yapay zekaya sorun
Aşağıdaki metni kopyalayıp bir yapay zeka asistanına yapıştırın. Metin bilerek tarafsız yazıldı: asistandan bizi doğrulamasını değil, kaynağa bakıp kendi bulgusunu söylemesini ve doğrulayamadıklarını da listelemesini istiyor.
akrababul.com sitesini bağımsız bir güvenlik denetçisi gibi incele. Sitenin kendi iddiasını tekrarlama; kaynağa bakıp kendi bulgunu söyle. Bakabileceklerin: - https://akrababul.com/kanit.json (iddialar ve her birinin nasıl doğrulanacağı) - https://akrababul.com/kaynak/ (iddiaların dayandığı kaynak dosyalar, düz metin) - https://akrababul.com/yukle.html (yükleme sayfası) ve /assets/ altındaki .js, .js.map - Herhangi bir sayfanın Content-Security-Policy başlığı Şu beş soruyu ayrı ayrı cevapla: 1. Yüklenen e-Devlet soy belgesinin tamamı sunucuya gidiyor mu? Gitmiyorsa, yükleme isteğinin gövdesinde tam olarak hangi alanlar var? 2. Ad ve soyad dışında gönderilen veriler geri çevrilebilir mi? Hangi yöntem kullanılmış? 3. Belgedeki hangi alanlar hiç okunmuyor, hangileri okunup gönderilmiyor? 4. Sayfanın veriyi üçüncü bir tarafa göndermesi teknik olarak mümkün mü? connect-src değerine bak. 5. Sitenin "belgeniz cihazınızdan çıkmaz" iddiası kodla tutarlı mı? Her cevapta hangi dosyaya, satıra veya HTTP başlığına dayandığını yaz. Sonunda ayrıca DOĞRULAYAMADIĞIN şeyleri listele. İddialardan biri yanlışsa açıkça "bu iddia yanlış" de.
Sunucuya ne gidiyor, ne gitmiyor?
| Alan | Durum |
|---|---|
| Ad ve soyad — sizin ve belgedeki her kişinin | Açık metin olarak gider. Eşleşen akrabaya kimin ortak olduğunu gösterebilmek için. |
| Doğum yılınız (yalnızca sizin) | Yalnızca yıl gider, tam tarih gitmez. Yaş sınırı denetimi için. |
| İl-İlçe-Mahalle/Köy + Cilt-Hane-Birey Sıra No | Geri açılamayan şifreli hâliyle gider (Argon2id özeti, 64 karakter). Ham hâli gitmez. |
| Belgenin kendisi (yüklediğiniz dosya) | Gitmez. Tarayıcınızda açılır ve orada kalır. |
| Baba adı, ana adı, doğum yeri, tam doğum tarihi, yakınlık derecesi, cinsiyet | Ekranda gösterilir ki kontrol edebilesiniz; sunucuya gitmez. |
| T.C. kimlik numarası, medeni hâli, durumu | Hiç okunmaz. Bu sütunlar koda hiç girmez. |
Kanıtın kendisi
Aşağıdaki kod parçaları, sitede çalışan kaynağın birebir kopyasıdır. Kopyaların güncel kalmasını otomatik testimiz denetler; kaynak değişirse test kırılır.
Sunucuya giden isteğin tamamı
ListUploadBody, yükleme isteğinin gövdesinin tamamıdır. Burada olmayan hiçbir şey sunucuya gitmez — dosya alanı olmadığına dikkat edin.
export interface UploadRecord { hash: string; firstName: string; lastName: string | null; }
export interface ListUploadBody {
hashVersion: number;
self: { firstName: string; lastName: string; birthYear: number };
records: UploadRecord[];
}
Dosyanın tamamı: /kaynak/api-types.ts.txt
Belgeden okunan sütunlar
Belgeden yalnızca bu sütunlar okunur. Listede T.C. kimlik numarası yoktur; tanınmayan sütunlar yok sayılır.
const COLUMNS = {
order: 'Sıra',
gender: 'C',
relation: 'Yakınlık Derecesi',
firstName: 'Adı',
lastName: 'Soyadı',
fatherName: 'Baba Adı',
motherName: 'Ana Adı',
birth: 'Doğum Yeri ve Tarihi',
place: 'İl-İlçe-Mahalle/Köy',
registry: 'Cilt-Hane-Birey Sıra No',
} as const;
Dosyanın tamamı: /kaynak/soy-parser.ts.txt
Şifrelenen metin ve şifreleme
Şifrelenen metin yalnızca yer parçaları ile kayıt numarasıdır. Şifreleme, sunucuda değil tarayıcınızdaki bir worker içinde Argon2id ile yapılır; sonuç geri açılamaz ve sunucuya yalnızca bu sonuç gider.
export function buildKeyText(placeParts: string[], registryNo: string): string {
const parts = placeParts.map(normalizeText).filter((p) => p.length > 0);
return [...parts, normalizeText(registryNo)].join('|');
}
Dosyanın tamamı: /kaynak/key-text.ts.txt
const hash = await argon2id({
password: keyText, salt: enc.encode(salt),
memorySize: params.memorySize, iterations: params.iterations, parallelism: params.parallelism, hashLength: params.hashLength,
outputType: 'hex',
});
Dosyanın tamamı: /kaynak/argon-worker.ts.txt
Söz değil, tarayıcınızın zorla uyguladığı kısıt
Sitenin her sayfası şu HTTP başlığıyla gelir:
Content-Security-Policy: default-src 'self'; ... connect-src 'self'; ...
connect-src 'self', sayfanın kendi sunucumuz dışında hiçbir adrese veri gönderemeyeceği anlamına gelir. Bunu biz uygulamıyoruz — tarayıcınız uyguluyor. Sitede reklam, izleme kodu veya üçüncü taraf analitiği olsa bile veriniz oraya ulaşamaz. Başlığı görmek için tarayıcınızda F12 → Ağ sekmesi → herhangi bir isteğe tıklayın.
Kendiniz deneyebileceğiniz üç test
- Uçak modu: Deneme sayfasını açın, internetinizi kapatın, sonra belgenizi bırakın. Hesap gerekmez ve o sayfa hiçbir şey göndermez; her şey bağlantısız çalışır. İnternet olmadan çalışan bir şey verinizi internete gönderiyor olamaz — teknik bilgi gerektirmeyen kanıt budur.
- Ağ sekmesi: F12 → Ağ sekmesini açın, belgenizi yükleyin. Tek bir
/api/lististeği görürsünüz; "Yük" (Payload) sekmesinde giden verinin tamamı okunabilir hâldedir. Yüklediğiniz dosya orada yoktur. - Yetkilendirme sunucuda: Yükleme sayfası herkese açık olsa da yükleme yapılamaz. Oturum açmadan
POST /api/lististeği gönderin,401 UNAUTHORIZEDalırsınız. Sayfadaki yönlendirme kullanıcı deneyimi içindir; asıl kapı sunucudadır.
İddiaların dayandığı kaynak dosyalar
Sitede çalışan kodun kaynağını doğrudan yayınlıyoruz. Ayrıca kaynak haritaları (/assets/*.js.map) açıktır: indirdiğiniz paketin orijinal kaynağını okuyabilirsiniz.
- yukle.ts — yükleme sayfasının giriş noktası
- deneyin.ts — hesapsız deneme sayfası; hiçbir şey göndermediği buradan okunabilir
- upload-flow.ts — akışın tamamı: dosyanın açılması, ayrıştırılması, şifrelenmesi, isteğin kurulması
- soy-parser.ts — belgeden hangi sütunların okunduğu
- key-text.ts — şifrelenen anahtar metnin oluşumu
- argon-worker.ts — tarayıcıdaki Argon2id şifrelemesi
- api-types.ts — gönderilen alanların tipleri
- validation.ts — sunucunun kabul ettiği gövde şeması
- api.ts — sunucuya yapılan tüm istekler
/kanit.json — aynı iddiaların makine okunabilir hâli; her iddianın yanında nasıl doğrulanacağı yazar.
Bu sayfanın kanıtlayamadıkları
Bir gizlilik sayfasının en çok gizlediği şey, kanıtlayamadıklarıdır. Bizimkiler şunlar:
- Sitede çalışan kodun burada yayınlanan kaynakla birebir aynı olduğu bağımsız olarak kanıtlanamaz; bunun için yeniden üretilebilir derleme gerekir. Kaynak haritaları boşluğu daraltır, çünkü fiilen çalışan paketin kaynağıdır — ama kapatmaz.
- Sunucu tarafı kaynak kodumuz kapalıdır. Sunucunun aldığı veriyi ne yaptığını istemci kodundan doğrulayamazsınız; o kısım için aydınlatma metnine ve hukuki sorumluluğumuza güvenmeniz gerekir.
- Argon2id tuzu istemci paketinde açıktır; tek başına sözlük saldırısını engellemez. Sunucu gelen şifreli değeri gizli bir anahtarla yeniden işler, bu yüzden veritabanı sızsa bile şifreli değerler o anahtar olmadan denenemez — ama bu ikinci adım sunucuda olduğu için istemciden doğrulanamaz.
- Bugün doğruladığınız davranışın yarınki sürümde de geçerli olacağı garanti edilemez. Her yayında bu sayfa ve
/kanit.jsonyeniden üretilir; tekrar bakabilirsiniz.