DEV Community

Cover image for API'niz C2PA Meta Verilerini Siliyor: Test Ederek Nasıl Tespit Edilir
Tobias Hoffmann
Tobias Hoffmann

Posted on Originally published at apidog.com

API'niz C2PA Meta Verilerini Siliyor: Test Ederek Nasıl Tespit Edilir

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.

Apidog'u bugün deneyin

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:

  1. C2PA metadata’sının işlem hattınızda kaybolduğunu kanıtlamak
  2. Bildirimi kaldıran dönüşüm adımını bulmak
  3. Yükleme ve teslimat akışını Apidog ile test etmek
  4. Bayt düzeyinde doğrulamayı c2patool ile 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
Enter fullscreen mode Exit fullscreen mode

Test dosyanızın imzalı olduğunu doğrulayın:

c2patool fixtures/signed-sample.png
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Üç 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);
Enter fullscreen mode Exit fullscreen mode

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:

  1. Metadata bloğunu koruyun.
  2. Dönüşümü kaydedin.
  3. Çı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:

  1. Apidog ile HTTP gidiş-dönüş testi
  2. c2patool ile bayt düzeyinde imza doğrulaması

Katman 1: Apidog’da gidiş-dönüş testi

Akış basittir:

  1. İmzalı sabiti yükleyin.
  2. API’nin döndürdüğü teslimat URL’sini yakalayın.
  3. Varlığı bu URL’den indirin.
  4. 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://");
});
Enter fullscreen mode Exit fullscreen mode

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);
});
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
  }
}
Enter fullscreen mode Exit fullscreen mode

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.

  1. Geçerli imzalı dosya

    Beklenen durum: verified

    Aşırı agresif metadata temizliğini yakalar.

  2. Sıyırılmış dosya

    Aynı görüntüden bildirimi exiftool -all= ile kaldırın.

    Beklenen durum: absent

    Bu dosya hata üretmemeli ve kesinlikle verified olarak raporlanmamalıdır.

  3. 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.

  4. Desteklenmeyen biçim

    C2PA bildirimi desteği olmayan bir dosya kullanın.

    Beklenen durum: absent

    Servis 500 dö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>
Enter fullscreen mode Exit fullscreen mode

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:

  1. İmzalı bir test sabiti ekleyin.
  2. Dosyayı gerçek yükleme ve teslimat yolundan geçirin.
  3. Apidog ile HTTP gidiş-dönüşünü test edin.
  4. c2patool ile indirilen dosyayı CI’da doğrulayın.
  5. 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)