DanLevy.net

שימוש במשתני סביבה ב-Node.js

שימוש ב-dotenv

Hero image for שימוש במשתני סביבה ב-Node.js

טיפול בסודות ובאסימוני API בצורה בטוחה

מאמר קשור: הגן על האסימונים שלך

בואו נזכיר בקצרה את ההבדל בין secret ל-non-secret.



נתמקד בטיפול ב-🔒 מפתחות סודיים באמצעות משתני סביבה במאמר זה.

דוגמאות קוד כלולות בהמשך.

סקירה כללית

כדי לגשת בבטחה לסודות בקוד NodeJS שלך:

  1. החלף מפתחות מקודדים-קשיחים במשתני סביבה. למשל: process.env.API_SECRET
  2. השתמש בספרייה כמו dotenv יחד עם קובץ .env. הוסף את הסודות שהיו מקודדים-קשיחים בעבר לקובץ .env.
  3. ודא שיש שורת .env בקובץ .gitignore שלך!

אל תיצור קובץ .env בשרתים פרוסים. השתמש בכלי ניהול משתני הסביבה של שירותי האירוח שלך (למשל Heroku, Netlify, AWS EC2): לדוגמה לוח בקרה או שורת פקודה.

דוגמת קוד

אנחנו הולכים להגדיר מספר קבצים.

  1. .env
  2. ./db/connection.js
  3. ./api/users.js

ראשית, התקן את חבילת dotenv.

Terminal window
npm install dotenv

לאחר מכן, צור קובץ .env בשורש הפרויקט שלך.

.env
PGDATABASE="postgres"
PGHOST="localhost"
PGPORT=5234
PGUSER="postgres"
PGPASSWORD="password"

לעולם אל תבצע commit לקובץ .env.

❌ הימנע מיצירת קובץ .env בשרתים.

בדוק בתיעוד של ספק האירוח שלך כיצד להגדיר משתני סביבה.

כדי לוודא בקלות שלקובץ .gitignore שלך יש שורה עבור .env.

Terminal window
# Automatically update .gitignore
# Run in terminal:
[ "$(grep '^.env' .gitignore)" == "" ] && echo '.env' >> .gitignore
# note: no output will print

הקובץ ./db/connection.js מספק מופע משותף של pg.Pool. הוא ישמש לשאילתות במסד הנתונים.

./db/connection.js
require('dotenv').config(); // ✅ Load .env file
const pg = require('pg');
const {PGUSER, PGHOST, PGPORT} = process.env;
if (process.env.NODE_ENV === 'development')
console.log(`Connecting to ${PGUSER} @ ${PGHOST}:${PGHOST}`);
// ^^ only for showing debug connection vars
// pg automatically uses PG* env variables
module.exports = new pg.Pool();

התיקייה ./api מכילה ממשקים לטבלאות/תצוגות שלך.

הנה דוגמה לקובץ ./api/users.js עבור טבלת users.

./api/users.js
const db = require('../db/connection.js');
module.exports = {
findUsername: function(username) {
return db.query('SELECT * FROM users WHERE username=$1', username);
}
};

* כל מחשב פיתוח חדש (נייד או שולחני) צריך ליצור מפתחות גישה ואסימונים חדשים. אם זה לא אפשרי, השתמש בזהירות רבה בשיתוף קובץ .env (במקרים שבהם שירות עלול לבטל את כל המפתחות הישנים, או שיש לך אסימון גישה מוגבל של API בתשלום).

⚠️ חשוב: במידת הצורך, השתמש תמיד בשירות הודעות מאובטח (רצוי עם תמיכה בהודעות שפג תוקפן).

בהצלחה וספר לי אם יש לך שאלות! 🎉