DEV Community

Cover image for NPM Bağımlılıkları Nasıl Güvenli Hale Getirilir? API Geliştiricileri için Eksiksiz Tedarik Zinciri Güvenliği Rehberi
Tobias Hoffmann
Tobias Hoffmann

Posted on • Originally published at apidog.com

NPM Bağımlılıkları Nasıl Güvenli Hale Getirilir? API Geliştiricileri için Eksiksiz Tedarik Zinciri Güvenliği Rehberi

Özet

NPM tedarik zinciri saldırıları, yalnızca 2024 yılında 3.000'den fazla kötü amaçlı pakete yükseldi ve Mart 2026'daki Axios ihlali, ilk 10 paketin bile güvende olmadığını kanıtladı. Bu kılavuz, API geliştiricilerinin ihtiyaç duyduğu her savunma katmanını kapsar: lockfile zorlaması, postinstall betik engelleme, menşe doğrulama, davranışsal analiz araçları ve saldırı yüzeyinizi daraltan mimari seçimleri.

Apidog'u bugün deneyin

Giriş

31 Mart 2026'daki Axios tedarik zinciri saldırısı ilk npm ihlali değildi. Son da olmayacak. Ancak 83 milyon haftalık indirme ve tek bir ele geçirilmiş bakımcı hesabı aracılığıyla dağıtılan çapraz platformlu bir RAT (Uzaktan Erişim Truva Atı) ile JavaScript ekosisteminin aldığı en yüksek sesli uyandırma çağrısı oldu.

Bu durumu alışılagelmiş “bağımlılıklarınızı güncelleyin” tavsiyesinden farklı kılan şey şu: Axios saldırısı her geleneksel savunmayı aştı. Kötü amaçlı kod Axios'un kendisinde değildi. Bir postinstall kancasını tetikleyen hayalet bir bağımlılık aracılığıyla enjekte edildi. Saldırı penceresi sırasında npm install çalıştırdıysanız lockfile'lar yardımcı olmadı. Henüz sabitleme yapmadıysanız sürüm sabitleme de yardımcı olmadı.

API geliştiricileri özellikle savunmasızdır. Test betikleriniz, CI/CD işlem hatlarınız, sahte sunucularınız ve HTTP istemcilerinizin tümü npm'den çekilir. Araç zincirinizdeki tek bir tehlikeye atılmış paket, geliştirme makinenizden API anahtarlarını, veritabanı kimlik bilgilerini ve bulut jetonlarını sızdırabilir.

💡 Apidog, API testi için yerleşik bir HTTP istemcisi sağlayarak büyük bir saldırı vektörünü ortadan kaldırır, böylece test yığınınızda Axios, node-fetch veya got'a ihtiyacınız kalmaz. Aşağıdaki savunma stratejilerini uygularken npm bağımlılık yüzeyinizi azaltmak için Apidog'u ücretsiz indirin.

Bu kılavuz, temel lockfile hijyeninden gelişmiş davranışsal analize kadar yedi koruma katmanını kapsar.


Katman 1: Lockfile Zorlaması

Lockfile'lar Neden Önemlidir?

Bir lockfile, kurulum anındaki her paketin ve geçişli bağımlılığın tam sürümünü kaydeder. Lockfile olmadan, npm install semver aralığınıza uyan en son sürümü çözer. Eğer package.json dosyanızda "axios": "^1.14.0" yazıyorsa ve depoda kötü amaçlı bir 1.14.1 sürümü varsa, kötü amaçlı sürümü alırsınız.

Kurallar

Lockfile'ınızı her zaman commit'leyin.

package-lock.json (npm), yarn.lock (Yarn), pnpm-lock.yaml (pnpm) veya bun.lock (Bun) sürüm kontrolüne dahil olmalı.

CI/CD'de "dondurulmuş kurulumlar" kullanın.

Otomatik ortamlarda asla npm install çalıştırmayın. Dondurulmuş lockfile eşdeğerini kullanın:

# npm
npm ci

# yarn
yarn install --frozen-lockfile

# pnpm
pnpm install --frozen-lockfile

# bun
bun install --frozen-lockfile
Enter fullscreen mode Exit fullscreen mode

npm ci, node_modules'ı siler ve yalnızca lockfile'dan kurulum yapar. Lockfile package.json ile eşleşmezse başarısız olur. Bu, çözümleme sürprizlerini engeller.

Pull request'lerde lockfile farklarını inceleyin.

Bir PR package-lock.json dosyasını değiştirdiğinde, neyin değiştiğini kontrol edin. Yeni bağımlılıklar, sürüm yükseltmeleri ve kayıt defteri URL değişiklikleri dikkatle incelenmeli. Socket.dev gibi araçlar, otomatik olarak şüpheli lockfile değişikliklerini işaretleyebilir.

Lockfile Boşluğu

Lockfile'lar beklenmeyen sürüm çözümlemelerine karşı korur, ancak ilk kuruluma karşı koruma sağlamazlar. Bir saldırı penceresi sırasında bir proje başlatır veya yeni bir bağımlılık eklerseniz, kötü amaçlı sürüm kilitlenir. Lockfile'lar Katman 1'dir, tek katman değildir.


Katman 2: Postinstall Betiklerini Devre Dışı Bırakın

Birincil Saldırı Vektörü

Axios saldırısı, ua-parser-js, event-stream ve diğer birçok saldırı aynı yöntemi kullandı: npm install sırasında rastgele kod çalıştıran bir postinstall betiği. Uygulama kodunuz çalışmadan, paketi incelemeden ve güvenlik aracı müdahale edemeden önce yürütülür.

Betikleri Küresel Olarak Engelleyin

.npmrc dosyanıza ekleyin:

ignore-scripts=true
Enter fullscreen mode Exit fullscreen mode

Veya CLI ile ayarlayın:

npm config set ignore-scripts true
Enter fullscreen mode Exit fullscreen mode

Bu, paket kurulumu sırasında tüm yaşam döngüsü betiklerinin (preinstall, install, postinstall, prepare) yürütülmesini engeller.

Betiklere İhtiyaç Duyan Paketleri Yönetin

Bazı paketler (ör: bcrypt, sharp, sqlite3) derleme için postinstall betiği ister. Seçenekleriniz:

Seçenek 1: Kurulumdan Sonra Betikleri Seçici Olarak Çalıştırın

npm ci --ignore-scripts
npm rebuild bcrypt sharp
Enter fullscreen mode Exit fullscreen mode

Seçenek 2: İzin Listesi Kullanın (npm 10+)

.scriptsrc.json dosyası ile yalnızca belirli paketlere izin verin:

{
  "allowScripts": {
    "bcrypt": true,
    "sharp": true
  }
}
Enter fullscreen mode Exit fullscreen mode

Seçenek 3: Önceden Oluşturulmuş İkilileri Kullanın

Birçok paket artık önceden oluşturulmuş ikili dosyalar sunuyor. Örneğin sharp çoğu platformda postinstall derlemesine gerek bırakmaz.

PackageGate Uyarısı

Ocak 2026'da açıklanan “PackageGate” sıfır günleri, Git tabanlı bağımlılıkların, yaşam döngüsü betikleri devre dışı olsa bile kod yürütmeyi sağlayabildiğini gösteriyor. Eğer package.json bağımlılıklarınız Git URL'si ise, tek başına ignore-scripts yetmez. Bu bağımlılıkları commit hash'lerine sabitleyin ve depo içeriklerini denetleyin.


Katman 3: Tam Sürümleri Sabitleyin

Semver Aralıklarını Kullanmayı Bırakın

Varsayılan npm install --save davranışı, paketleri şapka (^) ile ekler:

{
  "axios": "^1.14.0"
}
Enter fullscreen mode Exit fullscreen mode

^ işareti "1.14.0 ile uyumlu" yani en son 1.x.x sürümünü yükler. Saldırı sırasında bu, kötü amaçlı 1.14.1'i çekmek anlamına gelir.

Bunun yerine tam sürümleri sabitleyin:

{
  "axios": "1.14.0"
}
Enter fullscreen mode Exit fullscreen mode

npm'i varsayılan olarak tam sürümleri kaydetmek için:

# .npmrc
save-exact=true
save-prefix=''
Enter fullscreen mode Exit fullscreen mode

Geçişli Bağımlılıklar İçin Geçersiz Kılmaları Kullanın

Geçişli (transitive) bağımlılıklarınızı overrides veya benzeri ile sabitleyin:

{
  "overrides": {
    "axios": "1.14.0",
    "plain-crypto-js": "npm:empty-npm-package@1.0.0"
  }
}
Enter fullscreen mode Exit fullscreen mode

Yarn için:

{
  "resolutions": {
    "axios": "1.14.0"
  }
}
Enter fullscreen mode Exit fullscreen mode

pnpm için:

{
  "pnpm": {
    "overrides": {
      "axios": "1.14.0"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Avantaj/Dezavantaj

Tam sabitleme, otomatik yama güncellemelerini almayacağınız anlamına gelir. Sürümleri manuel yükseltmeniz gerekecek. Bu ödünleşme, güvenlik açısından hassas projelerde tercih edilmeli.


Katman 4: Paket Menşesini Doğrulayın

Menşe Ne Anlama Gelir?

npm menşe tasdiki, yayımlanmış bir paketi, herkese açık şeffaflık defterine kaydedilmiş Sigstore imzalarını kullanarak kaynak kodu ve derleme ortamına bağlar. Menşe etkinleştirilmiş bir CI/CD hattından yayımlandıysa, paket aşağıdakilerin kriptografik kanıtını içerir:

  • Hangi kaynak deposundan derlendiği
  • Hangi CI/CD sisteminin derlediği
  • Hangi commit'in derlemeyi tetiklediği

Menşe Nasıl Kontrol Edilir?

npm audit signatures
Enter fullscreen mode Exit fullscreen mode

Bu komut, yüklü paketlerin geçerli menşe tasdiklerine sahip olup olmadığını doğrular.

Kötü amaçlı Axios sürümlerinde OIDC menşe yoktu. Otomatik menşe kontrolü standart olsaydı saldırı hemen tespit edilebilirdi.

Kendi Paketleriniz İçin Menşeyi Etkinleştirin

GitHub Actions örneği:

- uses: actions/setup-node@v4
  with:
    node-version: 20
    registry-url: https://registry.npmjs.org
- run: npm publish --provenance
  env:
    NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Enter fullscreen mode Exit fullscreen mode

.npmrc dosyanıza ekleyin:

provenance=true
Enter fullscreen mode Exit fullscreen mode

Sınırlamalar

Menşe isteğe bağlıdır ve çoğu npm paketinde yoktur. Ayrıca sadece paketin nerede derlendiğini kanıtlar, kaynak kodunun güvenliğini değil. Tehlikeye atılmış bir CI/CD hattı geçerli menşe ile kötü amaçlı paket yayımlayabilir.


Katman 5: Davranışsal Analiz Araçlarını Kullanın

Güvenlik Açığı Taramasının Ötesi

npm audit ve Snyk gibi araçlar, bilinen güvenlik açıklarını kontrol eder. Ancak sıfır gün saldırılarını yakalayamazlar. Axios ihlali yayımlandığında hiçbir CVE yoktu.

Davranışsal analiz araçları ise paketlerin ne yaptığına bakar.

Socket.dev

Socket, kurulum ve çalışma zamanı boyunca paket davranışını analiz eder. Aşağıdaki aktiviteleri işaretler:

  • Kurulum sırasında ağ istekleri
  • Paket dizini dışına dosya erişimi
  • Kabuk komutu yürütme
  • Ortam değişkeni toplama
  • Karmaşık kod kalıpları

Socket.dev tarama sonuçları

GitHub ile entegre ederseniz, Socket yeni bağımlılıklarda şüpheli davranış tespit ettiğinde PR'lara yorum bırakır.

Kurulum ve tarama:

# Socket CLI'yi kur
npm install -g @socketsecurity/cli

# Projenizi tarayın
socket scan
Enter fullscreen mode Exit fullscreen mode

Snyk

Snyk, güvenlik açığı yönetimi için risk puanları ve düzeltme rehberi sunar. Bilinen açıklar için etkilidir.

# Snyk CLI'yi kur
npm install -g snyk

# Projenizi test edin
snyk test
Enter fullscreen mode Exit fullscreen mode

Snyk tarama sonuçları

Katmanlı Yaklaşım

Her iki aracı da kullanın. Socket, davranışsal anormallikleri yakalar; Snyk, bilinen açıkları. npm audit ile birlikte üçlü güvenlik duvarı oluşturun:

# Temel
npm audit

# Davranışsal analiz
socket scan

# Güvenlik açığı yönetimi
snyk test
Enter fullscreen mode Exit fullscreen mode

Bu üç aracı CI/CD hattınızda geçit olarak konumlandırın. Kritik bulgu varsa build başarısız olmalı.


Katman 6: Bağımlılık Yüzeyinizi Azaltın

Daha Derin Soru

node_modules'ünüzdeki her paket, bir güven kararıdır. Axios saldırısı, haftalık 83 milyon indirmeye sahip bir paketi tehlikeye attı. Ortalama bir Node.js projesinde yüzlerce geçişli bağımlılık vardır. Her biri potansiyel saldırı vektörüdür.

En etkili savunma, daha az bağımlılığa sahip olmaktır.

Bağımlılık Ağacınızı Denetleyin

# Toplam bağımlılık sayısını sayın
npm ls --all | wc -l

# Tekrarları kontrol edin
npm ls --all | sort | uniq -c | sort -rn | head -20
Enter fullscreen mode Exit fullscreen mode

Her bağımlılık için şu soruları sorun:

  • Dil veya çalışma zamanı bunu yerel olarak sağlıyor mu?

    Node.js 18+ artık fetch, crypto, URL, FormData gibi birçok yardımcı fonksiyonu yerel sunar.

  • Bu bağımlılık çok sayıda geçişli bağımlılık çekiyor mu?

    50 alt bağımlılığı olan bir paket saldırı yüzeyinizi 50 kat artırır.

  • Bunu vendor edebilir misiniz?

    Küçük yardımcı paketler için kaynağı doğrudan projenize dahil edebilirsiniz.

Yaygın Paketler İçin Yerel Alternatifler

Paket Yerel alternatif Şu tarihten itibaren mevcut
axios, node-fetch, got fetch (küresel) Node.js 18
uuid crypto.randomUUID() Node.js 19
dotenv --env-file bayrağı Node.js 20.6
chalk util.styleText() Node.js 21.7
glob fs.glob() Node.js 22
path-to-regexp Yerel URL pattern API Node.js 23

Özellikle API Testi İçin

API test iş akışları genellikle HTTP istemci, assertion kütüphaneleri, test runner ve sahte sunuculara bağımlıdır. Her bağımlılık bir saldırı vektörüdür.

Apidog, API testi için tek bir platform olarak

Apidog, tüm yığını tek bir platformla değiştirir:

  • HTTP istemcisi: Yerleşik, npm bağımlılığı gerekmez
  • Onaylar: Görsel assertion builder
  • Test çalıştırıcı: CLI ile CI/CD entegrasyonu
  • Sahte sunucu: Dinamik yanıtlarla akıllı mock server
  • Dokümantasyon: API spesifikasyonlarınızdan otomatik oluşturulur

API test iş akışınızı Apidog'a taşımak, test altyapınızdaki onlarca npm bağımlılığını ortadan kaldırır. Daha az bağımlılık, daha az güven kararı ve daha az saldırı vektörü anlamına gelir.

API test yığınızı birleştirmek için Apidog'u ücretsiz deneyin.


Katman 7: Ağ ve Çalışma Zamanı İzleme

Bilinen Kötü Amaçlı Alan Adlarını Engelleyin

Herhangi bir tedarik zinciri saldırısında, komuta ve kontrol altyapısını ağ düzeyinde engelleyin:

# /etc/hosts'a ekle
echo "0.0.0.0 sfrclak.com" | sudo tee -a /etc/hosts
Enter fullscreen mode Exit fullscreen mode

CI/CD ortamlarında, dışarıya ağ erişimini bilinen iyi alan adlarıyla sınırlandırın. Çoğu derleme sadece npm registry, git host ve dağıtım hedeflerine erişim ister.

CI/CD İçin StepSecurity Harden-Runner Kullanın

StepSecurity'nin Harden-Runner'ı GitHub Actions iş akışlarını gerçek zamanlı izler. npm install başladıktan sonra 1.1 saniye içinde Axios dropper'ın C2 ile iletişimini tespit etti. Sağladıkları:

  • GitHub Actions için dışarıya ağ izleme
  • Süreç yürütme takibi
  • Dosya bütünlüğü izleme
  • Anormal davranışlar için otomatik uyarı
# GitHub Actions
- uses: step-security/harden-runner@v2
  with:
    egress-policy: audit  # veya katı mod için 'block'
Enter fullscreen mode Exit fullscreen mode

Çalışma Zamanı Süreç İzleme

Geliştirici makinelerinde, Node.js tarafından başlatılan şüpheli alt süreçleri tespit eden EDR araçlarını kullanın. Axios RAT, kurulum sırasında osascript (macOS), cscript (Windows), python3 (Linux) başlattı. Bu süreç kalıpları tespit edilebilir.


Önerilen .npmrc Yapılandırması

Tüm katmanları kapsayan örnek .npmrc:

# Tam sürümleri sabitle
save-exact=true
save-prefix=

# Yaşam döngüsü betiklerini devre dışı bırak
ignore-scripts=true

# Yayımlama için menşeyi etkinleştir
provenance=true

# Resmi kayıt defterini kullan
registry=https://registry.npmjs.org/

# Yayımlama için 2FA gerektir
auth-type=web

# Denetim düzeyi eşiği
audit-level=moderate
Enter fullscreen mode Exit fullscreen mode

Bu dosyayı deponuza commit'leyin. Her ekip üyesi aynı güvenlik ayarlarını kullanmalı.


CI/CD Güvenlik Hattı Örneği

Aşağıda yedi katmanın tamamını uygulayan bir GitHub Actions iş akışı örneği:

name: Secure Build
on: [push, pull_request]

jobs:
  security-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: step-security/harden-runner@v2
        with:
          egress-policy: audit

      - uses: actions/setup-node@v4
        with:
          node-version: 22

      # Katman 1+2: Dondurulmuş lockfile, betik yok
      - run: npm ci --ignore-scripts

      # Katman 3: Beklenmeyen sürüm olmadığını doğrula
      - run: npm ls --all > deps.txt

      # Katman 4: Menşeyi kontrol et
      - run: npm audit signatures

      # Katman 5: Davranışsal analiz
      - run: npx socket scan

      # Katman 5: Güvenlik açığı taraması
      - run: npx snyk test

      # Katman 1: Temel denetim
      - run: npm audit --audit-level=moderate

      # Yalnızca izin verilen yerel bağımlılıkları yeniden derle
      - run: npm rebuild sharp bcrypt
Enter fullscreen mode Exit fullscreen mode

npm Güvenliği İçin Sırada Ne Var?

Popüler Paketler İçin Zorunlu Menşe

npm, yüksek indirmeli paketler için menşe tasdikini zorunlu kılmayı değerlendiriyor. Bu, Axios saldırısını mümkün kılan manuel token tabanlı yayımlamayı önleyecek.

İki Kişilik Sürüm Onayı

Yüksek indirmeli paketler için sürüm yayınında ikinci bakıcı onayı gerekebilir. Tek bir ele geçirilmiş hesap yeterli olmayacak.

Çalışma Zamanı İzin Kapsamlandırma

Deno, betiklerin ağ, dosya sistemi ve ortam değişkenlerine erişimini izin modeline bağladı. Node.js de benzer izin modellerini araştırıyor. Postinstall betikleri, açık izin olmadan ağ isteği veya dosya erişimi yapamayacak.

Paket Yöneticisi Yakınsaması

pnpm'in katı izolasyon modeli (paketler yalnızca beyan ettikleri bağımlılıklara erişebilir), birçok bağımlılık karışıklığı saldırısını önler. npm de benzer katılığı benimsedikçe saldırı yüzeyi azalacak.


Sıkça Sorulan Sorular

npm'de tedarik zinciri saldırısı nedir?

npm'deki bir tedarik zinciri saldırısı, doğrudan uygulamanızı değil, yazılım bağımlılık zincirini hedefler. Saldırganlar paket bakımcı hesaplarını ele geçirir, popüler paketlere kötü amaçlı kod enjekte eder veya benzer adlara sahip typosquat paketleri yayımlar. Bağımlılıkları yüklediğinizde veya güncellediğinizde, kötü amaçlı kod makinenizde veya CI/CD hattınızda yürütülür, kimlik bilgilerini çalar, arka kapılar kurar veya verileri dışarı sızdırır.

<code>npm audit</code> tedarik zinciri saldırılarına karşı yeterli mi?

Hayır. npm audit, bilinen güvenlik açıkları (CVE'ler) veritabanına karşı kontrol yapar. Axios ihlali gibi sıfır gün saldırıları, gerçekleştikleri anda hiçbir CVE veritabanında yer almaz. Paketlerin ne yaptığını inceleyen, Socket.dev gibi davranışsal analiz araçlarına ihtiyacınız var. npm audit'i tek savunmanız olarak değil, bir temel olarak kullanın.

npm'i tamamen kullanmayı bırakmalı mıyım?

Hayır. npm en büyük paket ekosistemi olmaya devam ediyor ve çoğu paket güvenlidir. Amaç; tam sürüm sabitleme, lockfile zorlaması, betik engelleme ve bağımlılık minimizasyonu ile maruziyeti azaltmak. Her bağımlılığın gerekli olup olmadığını sorgulayın, yerel alternatifleri kullanın.

Apidog, npm tedarik zinciri riskini nasıl azaltır?

Apidog, API geliştirme için yerleşik bir HTTP istemcisi, test çalıştırıcısı, sahte sunucu ve dokümantasyon oluşturucu sunar. Axios, node-fetch, Jest, Express gibi npm paketlerine olan ihtiyacı ortadan kaldırır. Daha az npm bağımlılığı, API geliştirme iş akışınızda daha az saldırı vektörü demektir.

npm'de paket menşesi nedir?

Paket menşesi, yayımlanmış bir paketi kaynak deposuna ve CI/CD derleme ortamına kriptografik olarak bağlamak için Sigstore kullanır. Bir paketin nerede ve nasıl oluşturulduğunu kanıtlar. npm audit signatures ile menşeyi doğrulayabilirsiniz. Geliştirici makinelerinden manuel yayımlanan paketlerin menşesi yoktur; yüksek indirmeli paketlerde bu bir kırmızı bayraktır.

Kaç npm paketi kötü amaçlı?

Snyk, 2024'te 3.000'den fazla kötü amaçlı npm paketi tespit etti. 2025'in 4. çeyreğinde Sonatype, tek bir çeyrekte npm, PyPI ve diğer kayıt defterlerinde 120.612 kötü amaçlı yazılım saldırısını engelledi. Çoğu kötü amaçlı paket düşük indirmeli typosquat'lardır; ancak Axios gibi yüksek profilli ihlaller, popüler paketlerin de bağışık olmadığını gösteriyor.

PackageGate güvenlik açığı nedir?

PackageGate, Ocak 2026'da açıklanan ve npm, pnpm, vlt ve Bun'ı etkileyen altı sıfır gün güvenlik açığı setidir. Özetle, Git tabanlı bağımlılıklar yaşam döngüsü betikleri devre dışı da olsa kod yürütmeyi sağlayabiliyor. Bu nedenle Git bağımlılıklarını commit hash'lerine sabitleyin.


Temel Çıkarımlar

  • Lockfile zorlaması temelinizdir, ancak bir saldırı penceresinde ilk kuruluma karşı koruma sağlamaz.
  • .npmrc dosyasında ignore-scripts=true ile postinstall betiklerini küresel olarak devre dışı bırakın.
  • Semver aralığı sürprizlerini önlemek için save-exact=true ile tam sürümleri sabitleyin.
  • Manuel yüklemeleri yakalamak için npm audit signatures ile paket menşesini doğrulayın.
  • Snyk (bilinen güvenlik açıkları) ve npm audit (temel) üzerine Socket.dev'i (davranışsal analiz) katmanlandırın.
  • Node.js yerel API'lerini ve Apidog gibi entegre platformları kullanarak bağımlılık sayınızı azaltın.
  • StepSecurity Harden-Runner ile CI/CD ağ çıkışını izleyin.

Her bağımlılık bir güven kararıdır. Ne kadar az bağımlılığınız olursa saldırı yüzeyiniz o kadar küçük olur. Ne kadar çok doğrulama katmanı uygularsanız, bir saldırganın aradan sıyrılması o kadar zorlaşır. Savunmalarınızı yalıtılmış değil, derinlemesine inşa edin.

API test yığınızı sadeleştirmek için Apidog'u ücretsiz deneyin.

Top comments (0)