API-Schlüssel im Browser offengelegt? Schnell-Check für OpenAI-, Claude- und Gemini-Keys
Wer OpenAI, Claude oder Gemini direkt aus dem Browser aufruft, legt den API-Schlüssel offen. Ein Blick in die DevTools genügt, um ihn zu kopieren. In 2 Minuten lässt sich überprüfen, ob die eigene App betroffen ist.

Posted on Nov 2 • Originally published at apidog.com
Web uygulamanız OpenAI, Claude veya Gemini'yi doğrudan tarayıcıdan çağırıyorsa, API anahtarınız tarayıcıda açığa çıkar ve DevTools'u açan herkes onu kopyalayabilir. Bunu 2 dakikada doğrulayabilirsiniz: Ağ sekmesini açın, bir AI isteği gönderin ve sağlayıcıya giden bir Authorization, x-api-key veya x-goog-api-key başlığı olup olmadığına bakın. Anahtarınızı orada görürseniz, bugün değiştirin ve çağrıyı bir sunucu rotasının arkasına taşıyın.
Aşağıda: kontrol, düzeltme sırası ve kodlama aracınızın düzeltilen rotayı nasıl test edebileceği.
Tarayıcıda açığa çıkan bir API anahtarı, ön uç kodunuzun veya ağ trafiğinizin içinde taşınan ve her ziyaretçinin okuyabileceği bir sırdır. Tarayıcı anahtarı gönderirse, kullanıcı onu kopyalayabilir ve sağlayıcıyı sizin faturanıza çağırabilir.
Google'ın Gemini API anahtarı kılavuzu, "API anahtarlarını doğrudan web veya mobil uygulamalarda sabit kodlamayın" der çünkü "İstemci tarafı koduna derlenen anahtarlar kullanıcılar tarafından çıkarılabilir" ve "gerçek API çağrılarını yapmak için bir arka uç proxy sunucusu çalıştırın" talimatını verir. OpenAI'ın API anahtarı güvenliği kılavuzu da aynı kuralı verir: istekleri, anahtarı istemciye dağıtmak yerine kendi arka ucunuz üzerinden yönlendirin.
openai-node README, "gizli API kimlik bilgilerinizi ifşa etmemek için" tarayıcı desteğinin varsayılan olarak devre dışı olduğunu ve etkinleştirmek için dangerouslyAllowBrowser: true ayarlamanız gerektiğini söyler. Anthropic'in TypeScript SDK'sı da aynı seçenek adını kullanır ve API'si yalnızca istek anthropic-dangerous-direct-browser-access: true başlığını taşıdığında tarayıcı (CORS) çağrılarını kabul eder; Simon Willison bunu belgelemiştir.
Bu model, AI uygulama oluşturucuları ve kodlama ajanlarıyla hızlı bir şekilde oluşturulan uygulamalarda yaygındır: en kısa çalışma yolu, anahtarın VITE_ veya NEXT_PUBLIC_ değişkeninde olduğu bir React bileşeninden fetch yapmaktır. Çalınan anahtarlar daha sonra toplu çıkarım için yeniden satılır; çalınan AI API anahtarları ve LLMjacking hakkındaki yazımızda ele alındığı gibi ve bunu faturanızda fark edersiniz.
Bu kontrolleri localhost'ta değil, üretim ortamında çalıştırın.
Derleme çıktınızın terminal taraması için:
grep -rnoE "sk-(proj-|ant-)?[A-Za-z0-9_-]{20,}|AIza[0-9A-Za-z_-]{35}" dist/ build/.next/static/ 2>/dev/null grep -rn "dangerouslyAllowBrowser" dist/ build/.next/static/ 2>/dev/null `
Boş çıktı bir geçiştir. Google, 28 Mayıs 2026'dan beri oluşturulan yeni AI Studio anahtarlarının, formatı AIza 'dan farklı olabilecek "kimlik doğrulama anahtarları" olduğunu söylüyor, bu nedenle pakette generativelanguage.googleapis.com için de arama yapın. Yalnızca tarayıcı kendi alan adınızla (örneğin /api/chat ) konuşuyorsa ve hiçbir yerde sağlayıcı ana bilgisayar adı veya anahtar görünmüyorsa geçersiniz.
Önce döndürmek bugünkü açığı kapatır; mimari değişiklik onu kalıcı olarak kapatır.
Eski anahtarı iptal etmeden önce yeni anahtarı sunucu tarafına dağıtın, aksi takdirde AI özelliğiniz çalışmaz. API anahtarı döndürme en iyi uygulamaları kılavuzumuz sıfır kesintili döndürmeyi kapsar. 4. adımda, OpenAI'ın anahtar güvenliği rehberi, yalnızca uyarıların trafiği durdurmadığı için sıkı uygulamalı harcama limitleri önerir; bir Google Cloud faturalandırma bütçesi sizi uyarır ancak kullanımı tek başına durdurmaz.
Bir arka uç proxy rotası, kullanıcının istemini alan, API anahtarını sunucuda ekleyen, sağlayıcıyı çağıran ve yalnızca yanıtı döndüren küçük bir sunucu uç noktasıdır. Tarayıcı anahtarı asla görmez. İşte OpenAI için minimal bir Next.js rotası; Claude ve Gemini aynı yapıyı izler:
`ts // app/api/chat/route.ts (runs on the server only) import OpenAI from "openai"; import { getSession } from "@/lib/auth"; // your auth helper import { checkRateLimit } from "@/lib/limits"; // your per-user limiter
const client = new OpenAI({ [REDACTED CREDENTIAL] }); // no NEXT_PUBLIC_ prefix
export async function POST(req: Request) { const session = await getSession(req); if (!session) return new Response("Unauthorized", { status: 401 });
if (!(await checkRateLimit(session.userId, 20))) { // 20 requests per minute return new Response("Too many requests", { status: 429 }); }
const { message } = await req.json(); if (typeof message!== "string" || message.length > 4000) { return new Response("Bad request", { status: 400 }); }
const response = await client.responses.create({ model: process.env.OPENAI_MODEL!, // pin the model server-side input: message, });
return Response.json({ reply: response.output_text }); // return the answer, nothing else } `
Claude ve Gemini için, SDK'larını ANTHROPIC_API_KEY veya GEMINI_API_KEY ile kullanın. Google'ın web sitesi ve IP kısıtlamaları yardımcı olur, ancak curl'ü olan herkes herhangi bir Referer başlığı gönderebilir, bu yüzden onları ikinci bir katman olarak değerlendirin. Tarayıcı çağrıları için tek adil durum, her kullanıcının kendi anahtarını yapıştırdığı kendi anahtarını getir aracıdır.
Anahtarı taşımak işin yarısıdır; diğer yarısı, ajanınızın yazdığı bir sonraki özellikten sonra taşındığını kanıtlamaktır. Rotayı oluşturan ajanın Apidog CLI ile test etmesine izin verin. Bir kez kurun:
bash npm install -g apidog-cli@latest apidog login --with-token <YOUR_TOKEN> npx -y skills add https://apidog.com # pick your agent when prompted
Ardından Claude Code, Codex, Cursor veya kullandığınız ajana bir istem verin:
`text Create Apidog test cases in project for POST /api/chat on our staging environment that assert:
Ajan şemayı okur, yükünü doğrular, test senaryolarını yazar ve çalıştırır:
bash apidog test-case category --project <id> apidog cli-schema get test-case-create apidog cli-schema validate test-case-create --file case.json apidog test-case create --project <id> --file case.json apidog run --test-case <caseId> --project <id> -e <envId> -r cli,json
İkinci doğrulama en önemlisidir: bir sağlayıcı hata nesnesi veya hata ayıklama alanı anahtarınızı istemciye geri yansıtmaya başladığı anda başarısız olur. Aynı apidog run... -r junit adımını işlem hattınıza koyun, böylece her dağıtım bunu yeniden kontrol eder; Apidog CLI CI/CD kılavuzumuz kurulumu gösterir ve Claude Code'da Apidog CLI ajan tarafını kapsar. Apidog'un Ücretsiz planı 4 kullanıcıya kadar kapsar, böylece küçük bir ekip bunu ücretli bir koltuk olmadan çalıştırabilir.
Aynı sorunun depo tarafı için, tarayıcıya gönderilmek yerine Git'e işlenen anahtarlar, gizli anahtar tarayıcısı ile API anahtarı sızıntısı kontrolü yazımıza bakın. Ajanlarınız müşteri verilerini işleyen araçları çağırıyorsa, AI ajanlarını veri sızıntıları için test etme bir sonraki katmanı kapsar.
OpenAI API anahtarımın tarayıcıda açığa çıkıp çıkmadığını nasıl anlarım? DevTools Ağ sekmesi açıkken bir AI özelliğini tetikleyin. api.openai.com adresine Authorization: Bearer [REDACTED]-... başlığıyla yapılan bir istek, açığa çıktığı anlamına gelir. Ayrıca yüklenen betiklerde sk- ve dangerouslyAllowBrowser için arama yapın.
Bir API anahtarını NEXT_PUBLIC_ veya VITE_ ortam değişkenine koymak güvenli mi? Hayır. Bu önekler değerleri istemci paketine kopyalamak için vardır. Bunların altında saklanan herhangi bir sağlayıcı anahtarı her ziyaretçiye gönderilir. Öneksiz, yalnızca sunucuya özel bir değişken kullanın ve onu bir sunucu rotası içinde okuyun.
Bir Gemini API anahtarını web sitemle sınırlamak onu tarayıcıda güvenli yapar mı? Yardımcı olur, ancak tarayıcı dışındaki bir betik herhangi bir Referer başlığı gönderebilir. Google'ın kendi kılavuzu istemci uygulamaları için bir arka uç proxy'si önerir.
Anahtarımın açığa çıktığını buldum. Önce ne yapmalıyım? Yeni bir anahtar oluşturun, sunucu tarafına dağıtın, ardından eskisini iptal edin. Ardından, çağrıyı kullanıcı başına hız sınırları olan kimlik doğrulamalı bir rotanın arkasına taşıyın ve sağlayıcı harcama limitlerini ayarlayın.
Kodlama ajanım bunu benim için düzeltebilir ve test edebilir mi? Evet. Sağlayıcı çağrısını bir sunucu rotasına taşımasını isteyin, ardından Apidog CLI kullanarak oturum olmadan 401, yanıtlarda anahtar deseni olmaması ve hız sınırınızı aşınca 429 olduğunu doğrulayan testler oluşturup çalıştırın.