คู่มือ

วิธีเก็บคีย์ API ให้ปลอดภัยในแอปของคุณ

หากต้องการเก็บคีย์ API ให้ปลอดภัย ให้เก็บเป็นความลับหรือตัวแปรสภาพแวดล้อมบนโฮสต์ของคุณ ใช้เฉพาะในโค้ดฝั่งเซิร์ฟเวอร์ และอย่าวางลงในแชท ไฟล์โค้ด ภาพหน้าจอ หรือรีโพซิทอรี Git เด็ดขาด ให้สิทธิ์แต่ละคีย์เท่าที่จำเป็นที่สุด ตั้งวงเงินการใช้จ่ายที่ผู้ให้บริการ และหากคีย์เคยรั่วไหล ให้หมุนเวียนมัน คือสร้างคีย์ใหม่และลบคีย์เก่า แทนที่จะซ่อนไว้ตรงที่มันปรากฏ

คีย์ API คือรหัสผ่านของบริการหนึ่ง คีย์ OpenAI ของคุณทำให้ใครบางคนใช้เงินของคุณไปกับ AI ได้ คีย์ลับของ Stripe ทำให้ใครบางคนคืนเงินได้ และคีย์ของผู้ให้บริการอีเมลทำให้ใครบางคนส่งเมลในชื่อคุณได้ เครื่องมือสร้างแอป AI เก่งในการเชื่อมต่อสิ่งเหล่านี้ แต่ไม่ค่อยระมัดระวังว่ามันไปจบที่ไหน คู่มือนี้จึงครอบคลุมวิธีเก็บให้ปลอดภัยและวิธีตรวจสอบ

คีย์สาธารณะกับคีย์ลับ

ไม่ใช่ทุกคีย์เป็นความลับ การเข้าใจความต่างช่วยไม่ให้คุณตื่นตระหนกกับคีย์ที่ไม่สำคัญ และไม่มองข้ามคีย์ที่สำคัญ

ประเภทตัวอย่างอยู่ในเบราว์เซอร์ได้ไหม
คีย์ publishable / คีย์สาธารณะคีย์ pk_… ของ Stripe คีย์แผนที่ที่จำกัดกับโดเมนของคุณ ID การวิเคราะห์บางตัวได้ เพราะออกแบบมาให้ใช้แบบนั้น
คีย์ลับsk_… ของ Stripe คีย์ OpenAI และ Anthropic คีย์ผู้ให้บริการอีเมล รหัสผ่านฐานข้อมูลไม่ได้เด็ดขาด
คีย์บริการ/ผู้ดูแลคีย์ที่ข้ามกฎการเข้าถึงของฐานข้อมูลที่โฮสต์ไว้ไม่ได้เด็ดขาด ถือเป็นความลับสูงสุด

หากไม่แน่ใจว่าคีย์เป็นประเภทใด ให้ตรวจเอกสารของผู้ให้บริการ เมื่อมีข้อสงสัย ให้ถือว่าเป็นความลับ

ขั้นตอนที่ 1: เก็บคีย์เป็นความลับ ไม่ใช่ในโค้ด

คีย์ควรอยู่ในการตั้งค่า ตัวแปรสภาพแวดล้อม หรือ ความลับ ของโฮสต์ โค้ดของคุณอ่านด้วยชื่อขณะรันโปรแกรม (เช่น process.env.OPENAI_API_KEY) ค่าจึงไม่เคยปรากฏในไฟล์ของคุณ สำหรับพื้นฐาน ดู ตัวแปรสภาพแวดล้อมและความลับคืออะไร

ย้ายคีย์ API ทุกตัวออกจากโค้ดไปยังตัวแปรสภาพแวดล้อม ลิสต์คีย์ที่พบแต่ละตัว ไฟล์ที่อยู่ และชื่อตัวแปรที่ใช้ อย่าแสดงค่า

จากนั้นตรวจว่าไม่เหลืออะไร:

ค้นหาทั้งโปรเจกต์ รวมไฟล์คอนฟิกและไฟล์ .env ใด ๆ สำหรับสิ่งที่ดูเหมือนคีย์ API หรือรหัสผ่าน รายงานไฟล์และบรรทัด ไม่ใช่ค่า

ขั้นตอนที่ 2: ใช้คีย์ลับเฉพาะบนเซิร์ฟเวอร์

นี่คือกฎที่สำคัญที่สุด ทุกอย่างที่เบราว์เซอร์ได้รับ ผู้เยี่ยมชมอ่านได้ ซอร์สของหน้าและไฟล์ JavaScript ทั้งหมดมองเห็นได้ในเครื่องมือนักพัฒนา

ดังนั้น หากแอปต้องเรียก OpenAI เบราว์เซอร์ควรเรียก เซิร์ฟเวอร์ของคุณ และเซิร์ฟเวอร์เรียก OpenAI พร้อมคีย์ คีย์ไม่เคยออกจากเซิร์ฟเวอร์

ฟีเจอร์แชทเรียก OpenAI จากเบราว์เซอร์โดยตรง ย้ายการเรียกนั้นไปยัง API route บนเซิร์ฟเวอร์ที่อ่าน OPENAI_API_KEY จากตัวแปรสภาพแวดล้อม เบราว์เซอร์ควรเรียกเฉพาะ route ของเราเท่านั้น และให้ route ต้องลงชื่อเข้าใช้ก่อน

ระวังกับดักที่พบบ่อยในเฟรมเวิร์กฝั่งหน้าบ้าน: ตัวแปรที่มีคำนำหน้าสาธารณะ เช่น VITE_ ใน Vite หรือ NEXT_PUBLIC_ ใน Next.js จะถูกฝังไว้ในโค้ดของเบราว์เซอร์โดยตั้งใจ คีย์ลับที่มีคำนำหน้าเหล่านี้จะหลุดออกไป แม้จะอยู่ใน "ตัวแปรสภาพแวดล้อม" ก็ตาม

ขั้นตอนที่ 3: ทดสอบว่าไม่มีอะไรรั่ว

อย่าเชื่อว่ามันทำงานแล้วโดยไม่ตรวจ ให้ตรวจเว็บไซต์ที่ใช้งานจริง:

  1. เปิดแอปที่เผยแพร่แล้วในเบราว์เซอร์
  2. เปิดเครื่องมือนักพัฒนา แล้วเปิดแท็บ Sources หรือ Network
  3. ค้นหาทุกไฟล์สำหรับตัวอักษรตัวแรกของคีย์ลับแต่ละตัว (เช่น sk_ หรือ sk-)
  4. ตรวจคำขอเครือข่ายที่แอปส่ง คำขอที่ไปจากเบราว์เซอร์ตรงไปยังผู้ให้บริการ AI ที่คิดเงินเป็นสัญญาณอันตราย

หากพบคีย์ลับ ให้ย้ายไปยังเซิร์ฟเวอร์ (ขั้นตอนที่ 2) และหมุนเวียน (ขั้นตอนที่ 6) เพราะมันเป็นสาธารณะไปแล้ว

ขั้นตอนที่ 4: จำกัดว่าแต่ละคีย์ทำอะไรได้บ้าง

ผู้ให้บริการหลายรายให้คุณจำกัดคีย์ได้:

  • คีย์แบบกำหนดขอบเขตหรือจำกัดสิทธิ์ ซึ่งทำได้เฉพาะสิ่งที่แอปต้องใช้ เช่น Stripe รองรับคีย์แบบจำกัดที่มีสิทธิ์เฉพาะ
  • การจำกัดโดเมนหรือ IP สำหรับคีย์ที่ต้องเป็นสาธารณะ เช่น คีย์แผนที่
  • แยกคีย์ต่อแอปและต่อสภาพแวดล้อม เพื่อให้การรั่วไหลครั้งเดียวไม่เปิดเผยทุกอย่าง และการเพิกถอนคีย์หนึ่งไม่ทำให้อีกคีย์พัง
  • ใช้คีย์ทดสอบขณะสร้าง และใช้คีย์จริงเฉพาะในแอปที่เผยแพร่แล้ว

ขั้นตอนที่ 5: จำกัดความเสียหายสูงสุด

แม้คีย์ที่ป้องกันดีแล้วยังถูกใช้ผิดทางผ่านแอปของคุณเองได้ เช่น มีคนสคริปต์ฟีเจอร์ AI ของคุณเป็นพันครั้ง

  • ตั้ง วงเงินการใช้จ่ายหรือการแจ้งเตือน ที่ผู้ให้บริการที่คิดเงินทุกราย
  • บังคับ การลงชื่อเข้าใช้ สำหรับฟีเจอร์ใดก็ตามที่มีค่าใช้จ่ายต่อการเรียก
  • เพิ่ม rate limit ต่อผู้ใช้ ดู rate limiting คืออะไร

เพิ่มขีดจำกัด 30 คำขอ AI ต่อผู้ใช้ต่อชั่วโมงไปยัง /api/chat ส่งข้อความที่ชัดเจนเมื่อถึงขีดจำกัด และปฏิเสธคำขอจากผู้ใช้ที่ยังไม่ได้ลงชื่อเข้าใช้

ขั้นตอนที่ 6: หมุนเวียนคีย์ที่รั่วไหล

หากคีย์ลับปรากฏในที่ที่ไม่ควร เช่น ข้อความแชท คอมมิต ภาพหน้าจอ ตั๋วซัพพอร์ต หรือโค้ดฝั่งเบราว์เซอร์ ให้ถือว่าคีย์นั้นถูกเปิดเผยแล้ว

  1. สร้างคีย์ใหม่ที่ผู้ให้บริการ
  2. อัปเดตความลับในการตั้งค่าแอปของคุณ
  3. ปรับใช้หรือเผยแพร่ใหม่เพื่อให้แอปที่ใช้งานจริงใช้คีย์ใหม่
  4. ลบคีย์เก่าที่ผู้ให้บริการ
  5. ตรวจบันทึกการใช้งานของผู้ให้บริการว่ามีกิจกรรมที่คุณไม่รู้จักหรือไม่

การลบข้อความแชทหรือคอมมิตของ Git ไม่เพียงพอ ประวัติของ Git เก็บเวอร์ชันเก่าไว้ และสิ่งที่เป็นสาธารณะอาจถูกคัดลอกไปแล้ว

ความผิดพลาดที่พบบ่อย

  • วางคีย์ลงในพรอมต์ ตอนนี้มันอยู่ในประวัติแชทแล้ว ให้ใช้ฟอร์มความลับแทน
  • มีคำนำหน้าสาธารณะบนตัวแปรลับ VITE_OPENAI_API_KEY ส่งคีย์ไปให้ผู้เยี่ยมชมทุกคน
  • commit ไฟล์ .env ตรวจให้แน่ใจว่าอยู่ใน .gitignore ก่อนการ push ครั้งแรก
  • คีย์เดียวใช้ทุกที่ ใช้คีย์แยกสำหรับการทดสอบและการใช้งานจริง และแยกต่อแอป
  • ไม่มีวงเงินการใช้จ่าย คีย์ที่รั่วหรือถูกใช้ผิดทางโดยไม่มีเพดานอาจทำให้บิลพุ่งก่อนที่คุณจะสังเกตเห็น
  • ซ่อนแทนการหมุนเวียน เมื่อคีย์เคยถูกเปิดเผยแล้ว มีเพียงคีย์ใหม่เท่านั้นที่แก้ปัญหาได้
  • คีย์ในภาพหน้าจอ ตัดหรือเบลอหน้าการตั้งค่าก่อนแชร์เพื่อขอความช่วยเหลือ

รายการตรวจสอบ

  • คีย์ทุกตัวเก็บเป็นความลับหรือตัวแปรสภาพแวดล้อม ไม่อยู่ในโค้ด
  • ไม่มีไฟล์ .env หรือคีย์ใดถูก commit ลง Git
  • คีย์ลับใช้เฉพาะในโค้ดฝั่งเซิร์ฟเวอร์
  • ไม่มีตัวแปรลับใดใช้คำนำหน้าสาธารณะ เช่น VITE_ หรือ NEXT_PUBLIC_
  • ฉันค้นหาคำนำหน้าของแต่ละคีย์ในไฟล์ JavaScript ของเว็บที่ใช้งานจริงและไม่พบ
  • คีย์ถูกกำหนดขอบเขตหรือจำกัดสิทธิ์ในกรณีที่ผู้ให้บริการรองรับ
  • คีย์ทดสอบและคีย์จริงแยกจากกัน
  • ฟีเจอร์ที่มีค่าใช้จ่ายต้องลงชื่อเข้าใช้และมีขีดจำกัดต่อผู้ใช้
  • ผู้ให้บริการที่คิดเงินทุกรายมีเพดานหรือการแจ้งเตือนการใช้จ่าย
  • ฉันรู้วิธีหมุนเวียนแต่ละคีย์ และคีย์ที่เคยรั่วทุกตัวถูกหมุนเวียนแล้ว

การเก็บคีย์ให้ปลอดภัยบน Mythex

Mythex ช่วยให้คีย์อยู่ให้ห่างจากโค้ดและแชทในสองทาง:

  • การ์ดคำขอความลับ เมื่อเอเจนต์ต้องการคีย์ จะแสดงการ์ดในแชทที่คุณกรอกค่าในช่องฟอร์ม ไม่ใช่กล่องข้อความ และค่านั้นถูกเก็บเป็นความลับของโปรเจกต์ ดู ความลับในแชท
  • การตั้งค่าโปรเจกต์ → Secrets หรือ /secrets ในแชท เพื่อเพิ่มหรือเปลี่ยนคีย์ด้วยตัวคุณเอง ดู ตัวแปรสภาพแวดล้อมและความลับ

หลังเปลี่ยนความลับของแอปที่เผยแพร่แล้ว ให้เผยแพร่ใหม่เพื่อให้แอปที่ใช้งานจริงรับค่าใหม่ โค้ดที่ส่งออกจะไม่มีความลับ ดังนั้นให้เพิ่มกลับในที่ที่คุณรันโค้ดครั้งต่อไป หากคีย์เคยปรากฏในแชท ให้หมุนเวียนที่ผู้ให้บริการ

สำหรับการตรวจความปลอดภัยก่อนเปิดตัวที่เหลือ ดู รายการตรวจความปลอดภัยสำหรับแอปที่สร้างด้วย AI หากคุณกำลังเพิ่มฟีเจอร์ AI วิธีใช้ LLM API ครอบคลุมเรื่องคีย์และค่าใช้จ่ายในเชิงลึกกว่า

คำถาม

ใส่คีย์ API ในโค้ดฝั่งหน้าบ้านปลอดภัยไหม?

ปลอดภัยเฉพาะเมื่อผู้ให้บริการออกแบบคีย์นั้นให้เป็นสาธารณะ เช่น คีย์ publishable ของ Stripe หรือคีย์แผนที่ที่จำกัดให้ใช้ได้กับโดเมนของคุณ คีย์ใดก็ตามที่ใช้จ่ายเงินหรืออ่านข้อมูลส่วนตัวได้ ต้องอยู่บนเซิร์ฟเวอร์เท่านั้น เพราะทุกอย่างที่ส่งไปยังเบราว์เซอร์สามารถถูกใครก็ได้อ่าน

ถ้าฉันวางคีย์ API ลงในแชทหรือรีโพซิทอรีสาธารณะ ควรทำอย่างไร?

หมุนเวียนคีย์นั้น สร้างคีย์ใหม่ที่ผู้ให้บริการ อัปเดตความลับของแอป เผยแพร่ใหม่ แล้วจึงลบคีย์เก่า การลบข้อความหรือคอมมิตไม่เพียงพอ เพราะอาจมีสำเนาอยู่แล้ว

ควรเก็บคีย์ API ไว้ที่ไหน?

ในตัวแปรสภาพแวดล้อมหรือการตั้งค่าความลับของโฮสต์ของคุณ ซึ่งโค้ดฝั่งเซิร์ฟเวอร์อ่านขณะรันโปรแกรม ไม่ควรเขียนไว้ในไฟล์ซอร์ส commit ลง Git หรือปรากฏในภาพหน้าจอ

จะรู้ได้อย่างไรว่าคีย์ API ของฉันหลุดอยู่ในเว็บไซต์?

เปิดเว็บไซต์ที่ใช้งานจริง ดูซอร์สของหน้าและไฟล์ JavaScript ในเครื่องมือนักพัฒนาของเบราว์เซอร์ แล้วค้นหาตอนต้นของคีย์ ถ้าพบ แสดงว่าคีย์หลุดแล้ว ควรย้ายไปไว้บนเซิร์ฟเวอร์และหมุนเวียนคีย์

Mythex · Pricing · สร้างอะไรก็ได้ด้วย AI · เทมเพลตเว็บไซต์และแอป · เปรียบเทียบ Mythex · อภิธานศัพท์การสร้างแอปด้วย AI · เครื่องมือฟรีสำหรับสร้างแอปด้วย AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)