วิธีเก็บคีย์ 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: ทดสอบว่าไม่มีอะไรรั่ว
อย่าเชื่อว่ามันทำงานแล้วโดยไม่ตรวจ ให้ตรวจเว็บไซต์ที่ใช้งานจริง:
- เปิดแอปที่เผยแพร่แล้วในเบราว์เซอร์
- เปิดเครื่องมือนักพัฒนา แล้วเปิดแท็บ Sources หรือ Network
- ค้นหาทุกไฟล์สำหรับตัวอักษรตัวแรกของคีย์ลับแต่ละตัว (เช่น
sk_หรือsk-) - ตรวจคำขอเครือข่ายที่แอปส่ง คำขอที่ไปจากเบราว์เซอร์ตรงไปยังผู้ให้บริการ AI ที่คิดเงินเป็นสัญญาณอันตราย
หากพบคีย์ลับ ให้ย้ายไปยังเซิร์ฟเวอร์ (ขั้นตอนที่ 2) และหมุนเวียน (ขั้นตอนที่ 6) เพราะมันเป็นสาธารณะไปแล้ว
ขั้นตอนที่ 4: จำกัดว่าแต่ละคีย์ทำอะไรได้บ้าง
ผู้ให้บริการหลายรายให้คุณจำกัดคีย์ได้:
- คีย์แบบกำหนดขอบเขตหรือจำกัดสิทธิ์ ซึ่งทำได้เฉพาะสิ่งที่แอปต้องใช้ เช่น Stripe รองรับคีย์แบบจำกัดที่มีสิทธิ์เฉพาะ
- การจำกัดโดเมนหรือ IP สำหรับคีย์ที่ต้องเป็นสาธารณะ เช่น คีย์แผนที่
- แยกคีย์ต่อแอปและต่อสภาพแวดล้อม เพื่อให้การรั่วไหลครั้งเดียวไม่เปิดเผยทุกอย่าง และการเพิกถอนคีย์หนึ่งไม่ทำให้อีกคีย์พัง
- ใช้คีย์ทดสอบขณะสร้าง และใช้คีย์จริงเฉพาะในแอปที่เผยแพร่แล้ว
ขั้นตอนที่ 5: จำกัดความเสียหายสูงสุด
แม้คีย์ที่ป้องกันดีแล้วยังถูกใช้ผิดทางผ่านแอปของคุณเองได้ เช่น มีคนสคริปต์ฟีเจอร์ AI ของคุณเป็นพันครั้ง
- ตั้ง วงเงินการใช้จ่ายหรือการแจ้งเตือน ที่ผู้ให้บริการที่คิดเงินทุกราย
- บังคับ การลงชื่อเข้าใช้ สำหรับฟีเจอร์ใดก็ตามที่มีค่าใช้จ่ายต่อการเรียก
- เพิ่ม rate limit ต่อผู้ใช้ ดู rate limiting คืออะไร
เพิ่มขีดจำกัด 30 คำขอ AI ต่อผู้ใช้ต่อชั่วโมงไปยัง /api/chat ส่งข้อความที่ชัดเจนเมื่อถึงขีดจำกัด และปฏิเสธคำขอจากผู้ใช้ที่ยังไม่ได้ลงชื่อเข้าใช้
ขั้นตอนที่ 6: หมุนเวียนคีย์ที่รั่วไหล
หากคีย์ลับปรากฏในที่ที่ไม่ควร เช่น ข้อความแชท คอมมิต ภาพหน้าจอ ตั๋วซัพพอร์ต หรือโค้ดฝั่งเบราว์เซอร์ ให้ถือว่าคีย์นั้นถูกเปิดเผยแล้ว
- สร้างคีย์ใหม่ที่ผู้ให้บริการ
- อัปเดตความลับในการตั้งค่าแอปของคุณ
- ปรับใช้หรือเผยแพร่ใหม่เพื่อให้แอปที่ใช้งานจริงใช้คีย์ใหม่
- ลบคีย์เก่าที่ผู้ให้บริการ
- ตรวจบันทึกการใช้งานของผู้ให้บริการว่ามีกิจกรรมที่คุณไม่รู้จักหรือไม่
การลบข้อความแชทหรือคอมมิตของ 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 ในเครื่องมือนักพัฒนาของเบราว์เซอร์ แล้วค้นหาตอนต้นของคีย์ ถ้าพบ แสดงว่าคีย์หลุดแล้ว ควรย้ายไปไว้บนเซิร์ฟเวอร์และหมุนเวียนคีย์