Claude artık ürettiği dosyalara imzalı C2PA menşe metadata’sı ekliyor. OpenAI’ın görüntü modelleri de öyle ve Gemini de öyle. Bu, gerçek bir menşe sinyalinin ilk kez yükleme uç noktanıza ulaştığı ve büyük olasılıkla işlem hattınızın bunu kimse görmeden sildiği anlamına geliyor.
Bu genellikle kötü niyetle olmaz; varsayılan davranıştır. sharp().resize(), aksi belirtilmedikçe metadata içermeyen temiz bir dosya üretir. ImageMagick, Pillow ve çoğu görüntü CDN’i de benzer şekilde davranır. Bildirim sisteme girer, daha küçük bir JPEG çıkar ve günlüklerde C2PA’dan hiç söz edilmez.
Bu test edilebilir bir hatadır. Bu yazıda şunları uygulayacaksınız:
- C2PA metadata’sının işlem hattınızda kaybolduğunu kanıtlamak
- Bildirimi kaldıran dönüşüm adımını bulmak
- Yükleme ve teslimat akışını Apidog ile test etmek
- Bayt düzeyinde doğrulamayı
c2patoolile CI’a eklemek
Gerçekte ne kayboluyor?
Bir C2PA bildirimi, dosya kapsayıcısına gömülü ve kriptografik olarak imzalanmış bir bloktur. Dosyayı kimin imzaladığını ve dosya hakkında hangi iddiaların bulunduğunu kaydeder.
İmza, dosya baytlarına bağlıdır. Bildirimi yeniden imzalamadan dosyayı değiştirirseniz, doğrulayıcılar imzanın artık geçersiz olduğunu tespit eder.
Kritik nokta kapsayıcıdır: Görüntü kapsayıcısını yeniden yazarsanız C2PA bildirimi kaybolabilir.
| İşlem | Bildirim varsayılan olarak korunur mu? |
|---|---|
| Bayt bayt kopyalama veya taşıma | Evet |
sharp().resize().toBuffer() |
Hayır |
ImageMagick convert / magick
|
Hayır |
Pillow Image.save()
|
Hayır |
| PNG’den WebP’ye, JPEG’den AVIF’e dönüşüm | Hayır |
| Görüntü CDN otomatik optimizasyonu | Genellikle hayır |
| Ekran görüntüsü alma | Hayır |
| Görüntü düzenleyicide yeniden kaydetme | Hayır |
| Dönüşüm olmadan S3 yüklemesi | Evet |
“Hayır” sütunundaki işlemler, tipik bir web uygulamasında neredeyse her yüklenen görüntüye uygulanır: küçük resim üretme, duyarlı varyantlar, biçim dönüşümü ve gizlilik için EXIF temizliği.
Gizlilik için kullanılan genel -strip alışkanlığı burada özellikle önemlidir. EXIF; GPS koordinatları ve kamera seri numaraları gibi veriler taşıyabilir. Ancak tüm metadata’yı kaldırmak, C2PA bildirimini de siler.
Çözüm, her şeyi sıyırmak değil; hassas EXIF alanlarını seçici biçimde kaldırırken C2PA bildirimini korumaktır.
İki dakikada sorunu kanıtlayın
Önce işlem hattınızın gerçekten bildirimi kaybedip kaybetmediğini doğrulayın.
Geçerli C2PA bildirimi olan bir test dosyasına ihtiyacınız var. Claude tarafından üretilen bir görüntü kullanabilir veya Content Credentials ekosisteminden imzalı bir örnek edinebilirsiniz.
Referans CLI aracını yükleyin:
cargo install c2patool
Test dosyanızın imzalı olduğunu doğrulayın:
c2patool fixtures/signed-sample.png
Komut, iddia oluşturucusunu ve imza durumunu içeren bir JSON raporu döndürmelidir.
Ardından dosyayı gerçek API akışınızdan geçirin:
# Gerçek yükleme uç noktanıza gönderin
curl -sS -X POST https://api.example.com/v1/assets \
-H "Authorization: Bearer $API_TOKEN" \
-F "file=@fixtures/signed-sample.png" \
-o /tmp/upload.json
# Ön ucun kullanacağı teslimat URL'sinden geri indirin
ASSET_URL=$(jq -r '.url' /tmp/upload.json)
curl -sS "$ASSET_URL" -o /tmp/roundtrip.png
# C2PA bildiriminin durumunu kontrol edin
c2patool /tmp/roundtrip.png
Üç sonuçtan birini görürsünüz:
- Geçerli rapor: Bildirim korunmuştur.
- Bildirim bulunamadı: İşlem hattındaki bir adım bildirimi kaldırmıştır.
- Doğrulama hatası: Bildirim dosyada kalmıştır ancak imza artık baytlarla eşleşmiyordur.
Üçüncü durum özellikle önemlidir. Genellikle bir dönüştürme kütüphanesinin pikselleri yeniden yazdığı, fakat eski metadata bloğunu dosyada bıraktığı anlamına gelir. Bu durumda dosya, doğrulayıcılar için kurcalanmış görünür.
Bildirimi kaldıran adımı bulun
Gidiş-dönüş testi başarısızsa tüm sistemi tahmin etmeyin. İşlem hattını aşamalara bölün ve her aşamadan sonra c2patool çalıştırın.
Tipik şüpheliler aşağıdaki sıradadır.
1. Yeniden boyutlandırma veya küçük resim üretimi
En yaygın neden budur. sharp, açıkça istemediğiniz sürece metadata’yı atar:
// C2PA bildirimini kaldırır
await sharp(input)
.resize(1200)
.toFile(output);
// Metadata bloğunu korur
await sharp(input)
.resize(1200)
.keepMetadata()
.toFile(output);
Ancak metadata’yı korumak tek başına yeterli değildir.
Pikseller değiştiği için orijinal imza artık yeni dosya baytları için geçerli olmaz. Geçerli bir menşe zinciri sürdürmek istiyorsanız:
- Metadata bloğunu koruyun.
- Dönüşümü kaydedin.
- Çıktıyı yeniden imzalayın.
Bu dönüşüm genellikle c2pa.resized gibi bir eylem beyanı ile kaydedilir. Rust, Python, JavaScript ve C için sunulan c2pa kütüphaneleri bu iş akışını destekler.
2. Biçim dönüştürme
AVIF veya WebP sunmak yeni bir kapsayıcı üretir. JPEG’den AVIF’e ya da PNG’den WebP’ye dönüştürme, sadece görüntü verisini değil dosya yapısını da değiştirir.
Burada iki seçeneğiniz vardır:
- Bildirimi koruyup çıktıyı yeniden imzalamak
- Menşe zincirinin bu noktada bittiğini kabul etmek ve bunu ürününüzde açıkça belirtmek
3. CDN optimizasyonu
Birçok görüntü CDN’i teslimat sırasında görüntüyü yeniden yazar. Bazıları Content Credentials verisini doğal olarak koruyup yeniden imzalayabilir; çoğu ise tarihsel olarak bu veriyi kaldırmıştır.
Testinizi kaynak dosya URL’sine karşı değil, kullanıcıların gerçekten kullandığı teslimat URL’sine karşı yapın.
Aksi durumda testiniz yeşil olabilir, fakat kullanıcıya sunulan dosyada bildirim bulunmayabilir.
4. Yükleme sırasında normalizasyon
Yükleme aşamasında biçimleri standartlaştırmak için yeniden kodlama yapan servisler sıklıkla unutulur. Bu kod genellikle ana uygulama deposunda değil, altyapı veya medya işleme servisinde bulunur.
Yükleme sonrasında, dönüşüm sonrasında ve CDN teslimatından sonra ayrı ayrı kontrol yapın.
Kontrolü kalıcı bir teste dönüştürün
Tek seferlik bir curl komutu bugünkü durumu gösterir. Ancak bir sonraki sprintte eklenecek yeni bir yeniden boyutlandırma adımını engellemez.
Bu nedenle kontrol CI’da çalışmalıdır.
İki katman kullanın:
- Apidog ile HTTP gidiş-dönüş testi
-
c2patoolile bayt düzeyinde imza doğrulaması
Katman 1: Apidog’da gidiş-dönüş testi
Akış basittir:
- İmzalı sabiti yükleyin.
- API’nin döndürdüğü teslimat URL’sini yakalayın.
- Varlığı bu URL’den indirin.
- HTTP yanıtını ve dosya özelliklerini doğrulayın.
Apidog’da bunu iki adımlı bir test senaryosu olarak oluşturabilirsiniz.
Adım 1: POST /v1/assets
İstek gövdesini, imzalı sabit dosyanızla multipart/form-data olarak ayarlayın. Kurulum mantığı, dosya yükleme API’lerini Apidog ile test etme akışıyla aynıdır.
Beklenen kontroller:
- HTTP durum kodu:
201 - Yanıt gövdesi: Beklenen şemaya uygun
- Yanıtta teslimat URL’si: Mevcut
URL’yi ikinci adıma aktarmak için yanıt sonrası betik kullanın:
const body = pm.response.json();
pm.environment.set("ASSET_URL", body.url);
pm.test("upload returns a delivery URL", function () {
pm.expect(body.url)
.to.be.a("string")
.and.to.include("https://");
});
Adım 2: GET {{ASSET_URL}}
Bu adımda kullanıcının eriştiği gerçek teslimat URL’sini çağırın.
Kontrol edin:
- HTTP durum kodu:
200 -
Content-Type: Beklediğiniz görüntü biçimi - Gövde boyutu: Yüklenen dosyaya makul ölçüde yakın
const uploadedBytes = Number(pm.environment.get("FIXTURE_BYTES"));
const returnedBytes = pm.response.responseSize;
pm.test("asset was not silently re-encoded", function () {
pm.expect(returnedBytes).to.be.above(uploadedBytes * 0.9);
});
Dosya boyutu yalnızca bir sezgiselliktir; C2PA imzasının kanıtı değildir. Ancak dosyanın sessizce yeniden kodlandığını gösteren belirgin değişiklikleri hızlıca yakalayabilir.
Daha fazla örnek için API onaylamaları rehberindeki standart assertion kalıplarını kullanabilirsiniz.
Katman 2: CI’da bayt düzeyinde doğrulama
HTTP istemciniz görüntüyü indirebilir, ancak C2PA imzasını doğrulamak için kapsayıcıyı ayrıştırmanız gerekir. Bu iş c2patool içindir.
Aşağıdaki GitHub Actions örneği, Apidog senaryosunu çalıştırır ve ardından indirilen dosyayı doğrular:
# .github/workflows/provenance.yml
name: provenance
on: [pull_request]
jobs:
c2pa-round-trip:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install c2patool
run: cargo install c2patool
- name: Install Apidog CLI
run: npm install -g apidog-cli
- name: Run the round-trip scenario
run: |
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t "$SCENARIO_ID" \
-e "$ENV_ID" \
-r cli,html \
--out-dir ./apidog-reports
env:
APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}
SCENARIO_ID: ${{ vars.PROVENANCE_SCENARIO_ID }}
ENV_ID: ${{ vars.APIDOG_ENV_ID }}
- name: Verify the manifest survived
run: |
set -euo pipefail
curl -sS "$ASSET_URL" -o /tmp/roundtrip.png
c2patool /tmp/roundtrip.png > /tmp/report.json
jq -e '.validation_status == null or (.validation_status | length) == 0' /tmp/report.json
set -euo pipefail burada önemlidir. Bu ayar olmadan c2patool sıyrılmış veya geçersiz bir dosyada hata verdiğinde işlem hattınız yanlışlıkla başarılı görünebilir.
Apidog senaryolarını GitHub Actions içinde çalıştırmaya yeni başlıyorsanız, GitHub Actions’ta API testlerini otomatikleştirme rehberini kullanabilirsiniz.
Katman 3: İsteğe bağlı doğrulama uç noktası
Menşe kontrolü yalnızca dahili bir test değil, ürün özelliğiyse kendi servisinizde bir doğrulama uç noktası oluşturun.
Bu uç nokta c2pa kütüphanesini çalıştırabilir ve ön ucun doğrudan kullanabileceği yapılandırılmış JSON döndürebilir:
{
"asset_id": "img_9f2c41",
"provenance": {
"status": "verified",
"standard": "c2pa",
"signer": "Anthropic",
"signature_valid": true,
"checked_at": "2026-08-11T09:14:22Z",
"tool": "c2patool/0.9"
}
}
Tek bir boolean kullanmayın. En az şu durumları ayırın:
-
verified: Bildirim mevcut ve imza geçerli -
absent: Bildirim yok -
invalid: Bildirim mevcut ancak imza geçersiz -
unchecked: Doğrulayıcı çalıştırılamadı veya kullanılamıyor
absent ve invalid aynı şey değildir:
-
absent, dosyanın kökeni hakkında bilgi olmadığını ifade eder. -
invalid, dosyanın imzalandıktan sonra değiştirildiğini gösterebilir.
Bu yanıt şemasını OpenAPI tanımınıza ekleyin ve CI’da doğrulayın. Böylece alanların bir yeniden düzenleme sırasında kaybolmasını engellersiniz. Bunun için OpenAPI spesifikasyonlarını doğrulama yaklaşımını uygulayabilirsiniz.
Saklanmaya değer dört test sabiti
C2PA test paketi yalnızca mutlu yol dosyası içermemelidir. Kasıtlı olarak bozuk girdilere de ihtiyacınız vardır.
Geçerli imzalı dosya
Beklenen durum:verified
Aşırı agresif metadata temizliğini yakalar.Sıyırılmış dosya
Aynı görüntüden bildirimiexiftool -all=ile kaldırın.
Beklenen durum:absent
Bu dosya hata üretmemeli ve kesinlikleverifiedolarak raporlanmamalıdır.Kurcalanmış dosya
İmzalandıktan sonra bir baytı değiştirilmiş dosya kullanın.
Beklenen durum:invalid
Bu test, sadece bir C2PA bloğunun varlığını değil imzanın gerçekten doğrulandığını kanıtlar.Desteklenmeyen biçim
C2PA bildirimi desteği olmayan bir dosya kullanın.
Beklenen durum:absent
Servis500dönmemelidir.
Bu dört sabiti test senaryonuzun yanında depoda saklayın. Küçük, sabit ve sürümlenmiş test dosyaları; “geçen test” ile gerçekten anlamlı bir test arasındaki farkı oluşturur.
Neden uğraşmalısınız?
Ürün iddianız için
Arayüzünüzde bir menşe rozeti gösteriyorsanız, fakat yeniden boyutlandırma işlem hattınız bildirimi kaldırıyorsa rozet yanlış bilgi verir.
Bu doğrudan bir kullanıcı güveni problemidir.
Uyumluluk süreciniz için
C2PA’yı Madde 50 gibi uyumluluk gereksinimleriyle ilişkilendiriyorsanız, sıyrılmış bir bildirim çalışmayan bir kontroldür.
API geliştiricileri için AB Yapay Zeka Yasası Madde 50 rehberi, sağlayıcı ve dağıtıcı sorumlulukları arasındaki farkı açıklar.
Menşe sinyalinin kendisi için
Menşe bilgisi yalnızca zincir baştan sona tutarlıysa değerlidir. Bildirimleri sessizce düşüren her işlem hattı, doğrulama ekosistemini daha az kullanışlı hale getirir.
Kendi uç noktalarınız için gidiş-dönüş senaryosunu oluşturmak üzere Apidog’u indirin, ardından sonucu c2patool ile CI’da doğrulayın.
Sıkça sorulan sorular
Bir görüntüyü yeniden boyutlandırmak C2PA metadata’sını kaldırır mı?
Evet, yaygın kütüphanelerde varsayılan davranış genellikle budur. Metadata bloğunu korumak için açık bir ayar gerekir. Geçerli imzayı korumak için ise dönüştürülmüş çıktıyı yeniden imzalamanız gerekir.
Bir dosyada C2PA metadata’sı olduğunu nasıl kontrol ederim?
Komut satırında aşağıdaki komutu çalıştırın:
c2patool <dosya>
Alternatif olarak dosyayı İçerik Kimlik Bilgileri doğrulama sayfasına yükleyebilirsiniz.
Yeniden boyutlandırma sırasında C2PA metadata’sını koruyabilir miyim?
Evet, ancak yalnızca metadata’yı kopyalamak yeterli değildir. Bloğu koruyun, dönüşümü c2pa.resized gibi bir eylem beyanıyla kaydedin ve çıktıyı yeniden imzalayın.
CDN’ler Content Credentials verisini kaldırır mı?
Birçoğu otomatik optimizasyon sırasında kaldırır. Bazıları artık veriyi koruyup yeniden imzalayabilir. Kaynak URL yerine kullanıcıların kullandığı gerçek teslimat URL’sini test edin.
Sıyırılmış bildirim ile geçersiz bildirim arasındaki fark nedir?
Sıyırılmış bildirim, bildirimin bulunmadığı anlamına gelir. Geçersiz bildirim ise bildirimin mevcut olduğu fakat imzanın dosya baytlarıyla eşleşmediği anlamına gelir.
Bu iki durumu ayrı olarak modelleyin.
Apidog C2PA imzasını doğrudan doğrulayabilir mi?
Apidog; yükleme, teslimat URL’si ve HTTP yanıtları için gidiş-dönüş testini düzenler. C2PA kapsayıcısını ve imzasını doğrulama işi ise c2patool tarafından, CI adımında veya kendi doğrulama servisinizde yapılmalıdır.
EXIF’i gizlilik için kaldırırken C2PA’yı koruyabilir miyim?
Hedef bu olmalıdır. Genel bir -strip işlemi hem EXIF’i hem C2PA bildirimini kaldırır. Bunun yerine kaldırmak istediğiniz EXIF alanlarını seçin ve C2PA bildirimini sağlam bırakın.
Çıkarım
Menşe metadata’sı API’nize sağlam şekilde ulaşabilir, ancak yeniden boyutlandırma, biçim dönüşümü veya CDN optimizasyonu sırasında sessizce kaybolabilir.
Bunu önlemek için:
- İmzalı bir test sabiti ekleyin.
- Dosyayı gerçek yükleme ve teslimat yolundan geçirin.
- Apidog ile HTTP gidiş-dönüşünü test edin.
-
c2patoolile indirilen dosyayı CI’da doğrulayın. - Doğrulama hatasında derlemeyi başarısız yapın.
Kısa bir kurulumla, kullanıcı arayüzünüzdeki menşe iddiasını işlem hattınızın gerçekten uyguladığı bir garantiye dönüştürebilirsiniz.
Top comments (0)