Πώς να διατηρείτε ασφαλή τα κλειδιά API στην εφαρμογή σας
Για να διατηρήσετε ασφαλή τα κλειδιά API, αποθηκεύστε τα ως μυστικά ή μεταβλητές περιβάλλοντος στον φιλοξενητή σας, χρησιμοποιήστε τα μόνο σε κώδικα του server και μην τα επικολλάτε ποτέ σε συνομιλία, αρχεία κώδικα, στιγμιότυπα οθόνης ή αποθετήριο Git. Δώστε σε κάθε κλειδί το ελάχιστο δικαίωμα που χρειάζεται, ορίστε όρια δαπάνης στον πάροχο και, αν ένα κλειδί διαρρεύσει, ανακαλέστε το — δημιουργήστε νέο και διαγράψτε το παλιό — αντί να απλά το κρύψετε από το σημείο όπου εμφανίστηκε.
Ένα κλειδί API είναι ένας κωδικός πρόσβασης για μια υπηρεσία. Το κλειδί σας OpenAI επιτρέπει σε κάποιον να ξοδέψει τα χρήματά σας σε AI· το μυστικό κλειδί του Stripe επιτρέπει να εκδώσει επιστροφές· το κλειδί του παρόχου email σας επιτρέπει να στέλνει αλληλογραφία στο όνομά σας. Οι εφαρμογές δημιουργίας με AI είναι καλές στο να τα συνδέουν, αλλά δεν είναι πάντα προσεκτικές για το πού καταλήγουν, γι' αυτό αυτός ο οδηγός καλύπτει πώς να τα διατηρείτε ασφαλή και πώς να το ελέγχετε.
Δημόσια κλειδιά και μυστικά κλειδιά
Δεν είναι κάθε κλειδί μυστικό. Η γνώση της διαφοράς σας εμποδίζει να πανικοβάλλεστε για το λάθος κλειδί και να αγνοείτε το σωστό.
| Τύπος | Παραδείγματα | Μπορεί να βρίσκεται στον περιηγητή; |
|---|---|---|
| Δημοσιευμένα / δημόσια κλειδιά | Κλειδί Stripe pk_…, κλειδί χαρτών περιορισμένο στο domain σας, ορισμένα αναγνωριστικά analytics | Ναι — έχει σχεδιαστεί γι' αυτό |
| Μυστικά κλειδιά | Stripe sk_…, κλειδιά OpenAI και Anthropic, κλειδιά παρόχων email, κωδικοί βάσεων δεδομένων | Ποτέ |
| Κλειδιά υπηρεσίας/διαχειριστή | Κλειδιά που παρακάμπτουν τους κανόνες πρόσβασης σε φιλοξενούμενη βάση δεδομένων | Ποτέ — αντιμετωπίστε τα ως τα πιο ευαίσθητα |
Αν δεν είστε σίγουροι τι είδους είναι ένα κλειδί, ελέγξτε την τεκμηρίωση του παρόχου. Σε αμφιβολία, αντιμετωπίστε το ως μυστικό.
Βήμα 1: Αποθηκεύστε τα κλειδιά ως μυστικά, όχι στον κώδικα
Τα κλειδιά ανήκουν στις ρυθμίσεις μεταβλητών περιβάλλοντος ή μυστικών του φιλοξενητή σας. Ο κώδικάς σας τα διαβάζει με το όνομά τους κατά την εκτέλεση (για παράδειγμα process.env.OPENAI_API_KEY), οπότε η τιμή δεν εμφανίζεται ποτέ στα αρχεία σας. Για το υπόβαθρο, δείτε τι είναι οι μεταβλητές περιβάλλοντος και τα μυστικά.
Μετέφερε κάθε κλειδί API από τον κώδικα σε μεταβλητές περιβάλλοντος. Κατάγραψε κάθε κλειδί που βρήκες, σε ποιο αρχείο ήταν, και το όνομα της μεταβλητής που χρησιμοποίησες. Μην μου δείξεις τις τιμές.
Μετά ελέγξτε ότι δεν έμεινε τίποτα:
Αναζήτησε σε όλο το έργο, συμπεριλαμβανομένων των αρχείων ρυθμίσεων και τυχόν αρχείων .env, οτιδήποτε μοιάζει με κλειδί API ή κωδικό πρόσβασης. Ανάφερε το αρχείο και τη γραμμή, όχι την τιμή.
Βήμα 2: Χρησιμοποιήστε μυστικά κλειδιά μόνο στον server
Αυτός είναι ο κανόνας που μετράει περισσότερο. Οτιδήποτε λαμβάνει ο περιηγητής, ο επισκέπτης μπορεί να το διαβάσει — ο πηγαίος κώδικας της σελίδας και τα αρχεία JavaScript είναι όλα ορατά στα εργαλεία προγραμματιστή.
Άρα, αν η εφαρμογή χρειάζεται να καλέσει το OpenAI, ο περιηγητής πρέπει να καλεί τον δικό σας server, και ο server καλεί το OpenAI με το κλειδί. Το κλειδί δεν φεύγει ποτέ από τον server.
Η λειτουργία συνομιλίας καλεί το OpenAI απευθείας από τον περιηγητή. Μετέφερε αυτή την κλήση σε μια διαδρομή API στον server που διαβάζει το OPENAI_API_KEY από το περιβάλλον. Ο περιηγητής πρέπει να καλεί μόνο τη δική μας διαδρομή. Απαίτησε σύνδεση για τη διαδρομή.
Προσέξτε μια συνηθισμένη παγίδα στα frameworks του frontend: οι μεταβλητές με δημόσιο πρόθεμα — VITE_ στο Vite, NEXT_PUBLIC_ στο Next.js — ενσωματώνονται στον κώδικα του περιηγητή σκόπιμα. Ένα μυστικό κλειδί με ένα από αυτά τα προθέματα είναι εκτεθειμένο, παρότι βρίσκεται «σε μεταβλητή περιβάλλοντος».
Βήμα 3: Ελέγξτε ότι τίποτα δεν διαρρέει
Μην εμπιστεύεστε ότι λειτούργησε — ελέγξτε τον ζωντανό ιστότοπο:
- Ανοίξτε την δημοσιευμένη εφαρμογή σε περιηγητή.
- Ανοίξτε τα εργαλεία προγραμματιστή και μετά την καρτέλα Sources ή Network.
- Αναζητήστε σε όλα τα αρχεία τους πρώτους χαρακτήρες κάθε μυστικού κλειδιού (για παράδειγμα
sk_ήsk-). - Ελέγξτε τα αιτήματα δικτύου που κάνει η εφαρμογή. Ένα αίτημα που πηγαίνει απευθείας από τον περιηγητή σε πληρωμένο πάροχο AI είναι κόκκινη σημαία.
Αν βρείτε μυστικό κλειδί, μεταφέρετέ το στον server (βήμα 2) και ανακαλέστε το (βήμα 6), επειδή ήταν ήδη δημόσιο.
Βήμα 4: Περιορίστε τι μπορεί να κάνει κάθε κλειδί
Πολλοί πάροχοι σας επιτρέπουν να περιορίσετε ένα κλειδί:
- Κλειδιά με εύρος ή περιορισμούς που μπορούν να κάνουν μόνο ό,τι χρειάζεται η εφαρμογή σας. Το Stripe, για παράδειγμα, υποστηρίζει περιορισμένα κλειδιά με συγκεκριμένα δικαιώματα.
- Περιορισμοί domain ή IP για κλειδιά που πρέπει να είναι δημόσια, όπως τα κλειδιά χαρτών.
- Ξεχωριστά κλειδιά ανά εφαρμογή και ανά περιβάλλον, ώστε μία διαρροή να μην εκθέτει τα πάντα, και η ανάκληση ενός να μην χαλάει τα άλλα.
- Κλειδιά δοκιμής κατά την ανάπτυξη, και κλειδιά παραγωγής μόνο στη δημοσιευμένη εφαρμογή.
Βήμα 5: Βάλτε ταβάνι στη ζημιά
Ακόμη και ένα καλά προστατευμένο κλειδί μπορεί να καταχραστεί μέσω της ίδιας της εφαρμογής σας — για παράδειγμα, κάποιος που γράφει σενάριο για να καλεί τη λειτουργία AI χιλιάδες φορές.
- Ορίστε όρια δαπάνης ή ειδοποιήσεις σε κάθε πληρωμένο πάροχο.
- Απαιτήστε σύνδεση για κάθε λειτουργία που κοστίζει χρήματα ανά κλήση.
- Προσθέστε όριο ρυθμού ανά χρήστη. Δείτε τι είναι το όριο ρυθμού.
Πρόσθεσε όριο 30 αιτημάτων AI ανά χρήστη την ώρα στο /api/chat. Επέστρεψε ένα σαφές μήνυμα όταν φτάνει το όριο. Απέρριψε αιτήματα από χρήστες που δεν έχουν συνδεθεί.
Βήμα 6: Ανακαλέστε κλειδιά που διέρρευσαν
Αν ένα μυστικό κλειδί εμφανιστεί σε μέρος όπου δεν έπρεπε — μήνυμα συνομιλίας, commit, στιγμιότυπο οθόνης, αίτημα υποστήριξης, κώδικας περιηγητή — θεωρήστε το ότι έχει παραβιαστεί.
- Δημιουργήστε νέο κλειδί στον πάροχο.
- Ενημερώστε το μυστικό στις ρυθμίσεις της εφαρμογής σας.
- Κάντε νέα ανάπτυξη ή δημοσίευση ώστε η ζωντανή εφαρμογή να χρησιμοποιεί το νέο κλειδί.
- Διαγράψτε το παλιό κλειδί στον πάροχο.
- Ελέγξτε τα αρχεία χρήσης του παρόχου για δραστηριότητα που δεν αναγνωρίζετε.
Η διαγραφή του μηνύματος συνομιλίας ή του commit στο Git δεν αρκεί. Το ιστορικό του Git κρατά παλιές εκδόσεις, και ό,τι είναι δημόσιο μπορεί ήδη να έχει αντιγραφεί.
Συχνά λάθη
- Επικόλληση κλειδιού στο prompt. Τώρα βρίσκεται στο ιστορικό της συνομιλίας. Χρησιμοποιήστε αντί γι' αυτό φόρμα μυστικών.
- Δημόσιο πρόθεμα σε μυστική μεταβλητή. Το
VITE_OPENAI_API_KEYστέλνει το κλειδί σε κάθε επισκέπτη. - Commit αρχείου
.env. Βεβαιωθείτε ότι είναι στο.gitignoreπριν την πρώτη αποστολή. - Ένα κλειδί για όλα. Χρησιμοποιήστε ξεχωριστά κλειδιά για δοκιμή και παραγωγή, και για κάθε εφαρμογή.
- Χωρίς όριο δαπάνης. Ένα διαρρεύσαν ή καταχρηστικό κλειδί χωρίς ταβάνι μπορεί να ανεβάσει μεγάλο λογαριασμό πριν το προσέξετε.
- Απόκρυψη αντί για ανάκληση. Μόλις ένα κλειδί εκτεθεί, μόνο ένα νέο κλειδί το διορθώνει.
- Κλειδιά σε στιγμιότυπα οθόνης. Κόψτε ή θολώστε τις σελίδες ρυθμίσεων πριν τις μοιραστείτε για βοήθεια.
Λίστα ελέγχου
- Κάθε κλειδί είναι αποθηκευμένο ως μυστικό ή μεταβλητή περιβάλλοντος, όχι στον κώδικα.
- Κανένα αρχείο
.envή κλειδί δεν έχει γίνει commit στο Git. - Τα μυστικά κλειδιά χρησιμοποιούνται μόνο σε κώδικα του server.
- Καμία μυστική μεταβλητή δεν έχει δημόσιο πρόθεμα όπως
VITE_ήNEXT_PUBLIC_. - Έλεγξα το JavaScript του ζωντανού ιστότοπου για το πρόθεμα κάθε κλειδιού και δεν βρήκα τίποτα.
- Τα κλειδιά έχουν εύρος ή περιορισμούς όπου το επιτρέπει ο πάροχος.
- Τα κλειδιά δοκιμής και παραγωγής είναι ξεχωριστά.
- Οι πληρωμένες λειτουργίες απαιτούν σύνδεση και έχουν όρια ανά χρήστη.
- Κάθε πληρωμένος πάροχος έχει ταβάνι δαπάνης ή ειδοποίηση.
- Ξέρω πώς να ανακαλέσω κάθε κλειδί, και όποιο κλειδί εκτέθηκε ποτέ έχει ανακληθεί.
Διατηρώντας ασφαλή τα κλειδιά στο Mythex
Το Mythex κρατά τα κλειδιά έξω από τον κώδικα και τη συνομιλία σας με δύο τρόπους:
- Κάρτα αιτήματος μυστικών. Όταν ο agent χρειάζεται κλειδί, εμφανίζει κάρτα στη συνομιλία όπου πληκτρολογείτε την τιμή σε πεδία φόρμας, όχι στο πλαίσιο μηνύματος, και αποθηκεύεται ως μυστικό έργου. Δείτε Μυστικά στη συνομιλία.
- Ρυθμίσεις έργου → Μυστικά, ή
/secretsστη συνομιλία, για να προσθέτετε ή να αλλάζετε κλειδιά μόνοι σας. Δείτε Μεταβλητές περιβάλλοντος και μυστικά.
Μετά την αλλαγή μυστικού σε δημοσιευμένη εφαρμογή, δημοσιεύστε ξανά ώστε η ζωντανή εφαρμογή να το πάρει. Οι εξαγόμενες εκδόσεις των έργων δεν περιέχουν μυστικά, οπότε προσθέστε τα ξανά όπου τρέχετε τον κώδικα την επόμενη φορά. Αν ένα κλειδί εμφανιστεί ποτέ στη συνομιλία, ανακαλέστε το στον πάροχο.
Για το υπόλοιπο έλεγχο ασφαλείας πριν το λανσάρισμα, ακολουθήστε τη λίστα ασφάλειας για εφαρμογές χτισμένες με AI. Αν προσθέτετε λειτουργίες AI, το πώς να χρησιμοποιήσετε LLM APIs καλύπτει τα κλειδιά και τα κόστη πιο εκτενώς.
Ερωτήσεις
Είναι ασφαλές να βάλω κλειδί API στον κώδικα του frontend;
Μόνο αν ο πάροχος έχει σχεδιάσει το κλειδί να είναι δημόσιο, όπως το δημοσιευμένο κλειδί του Stripe ή ένα κλειδί χαρτών περιορισμένο στο domain σας. Κάθε κλειδί που μπορεί να ξοδέψει χρήματα ή να διαβάσει ιδιωτικά δεδομένα πρέπει να μένει στον server, επειδή οτιδήποτε στέλνεται στον περιηγητή μπορεί να το διαβάσει οποιοσδήποτε.
Τι πρέπει να κάνω αν επικόλλησα κλειδί API σε συνομιλία ή σε δημόσιο αποθετήριο;
Ανακαλέστε το: δημιουργήστε νέο κλειδί στον πάροχο, ενημερώστε τα μυστικά της εφαρμογής σας, δημοσιεύστε ξανά και μετά διαγράψτε το παλιό κλειδί. Η διαγραφή του μηνύματος ή του commit δεν αρκεί, επειδή μπορεί ήδη να υπάρχουν αντίγραφα.
Πού πρέπει να αποθηκεύονται τα κλειδιά API;
Στις μεταβλητές περιβάλλοντος ή στις ρυθμίσεις μυστικών του φιλοξενητή σας, που τις διαβάζει ο κώδικας του server κατά την εκτέλεση. Δεν πρέπει να γράφονται σε αρχεία πηγαίου κώδικα, να γίνονται commit στο Git ή να εμφανίζονται σε στιγμιότυπα οθόνης.
Πώς μπορώ να δω αν το κλειδί API μου είναι εκτεθειμένο στον ιστότοπό μου;
Ανοίξτε τον ζωντανό ιστότοπό σας, δείτε τον πηγαίο κώδικα της σελίδας και τα αρχεία JavaScript στα εργαλεία προγραμματιστή του περιηγητή, και αναζητήστε την αρχή του κλειδιού. Αν εμφανίζεται, είναι εκτεθειμένο και πρέπει να μεταφερθεί στον server και να ανακληθεί.