המנעות מ-Magic Strings באמצעות env.

מהן מחרוזות קסם ומספרי קסם ולמה זה רעיון רע להשתמש בהן.

אם יש משהו שמדליק לי נורות אדומות כשאני רואה קוד – זה שימוש ב-Magic numbers. מה זה אומר? זה אומר מחרוזות של טקסט או מספרים קבועים בטקסט באמצע הקוד. למשל משהו כזה:

const totalPrice = 1.17 * price;

או משהו בסגנון הזה:

const result = await fetch('https://some-api-url.com/rest/is/awsome');

או משהו בסגנון הזה:

  let transporter = nodemailer.createTransport({
    host: 'smtp.mail.mydomain.com',
    port: 465,
    secure: true, 
    auth: {
      user: process.env.user, 
      pass: process.env.pass,
    },
  });

מה הן מחרוזות הקסם? בדוגמה הראשונה המע"מ. בדוגמה השניה הכתובת של ה-API ובדוגמה השלישית ה-host וה-port.

למה זה בעייתי? כי מדובר בחלקים בקוד שיכולים בהחלט להשתנות בקוד. כתובות של URL יכולים להשתנות. גם הוסטים של כתובות, גם הפורט. וכשהם משתנות, זה גיהנום לאתר את המקומות שבהם משתמשים בהם בכל פינה בקוד וגם קשה לבצע את השינויים. לא תמיד זה עניין של חפש והחלף. לפעמים יש לנו שני וריאציות בקוד כמו למשל:

// בקובץ אחד זה ככה
const result = await fetch('https://some-api-url.com/rest/is/awsome');
// בקובץ שני זה יכול להיות ככה
const baseUrl = 'https://some-api-url.com';
const result = await fetch(`${baseUrl}/rest/is/awsome`);
// בקובץ שלישי זה יכול להיות אחרת לגמרי
const scheme = 'https';
const baseUrl = `${scheme}some-api-url.com`;
const result = await fetch(`${baseUrl}/rest/is/awsome`);

וכן, זה בהחלט יכול להיות בפרויקט של כמה שנים שעובדים עליו כמה וכמה מפתחים. ואז מחליפים את ה-API ל-whatever-api-url.com והמתכנת שצריך להחליף את הכתובת עושה העתק והחלף ל-https://some-api-url.com/rest/is/awsome ואז יש את השינוי והכל בפרודקשן מתחרבש כי מפספסים את הקובץ השני והשלישי, ואז המפתח, שגם ככה הוא בלחץ עושה חפש החלף ל-https://some-api-url.com אבל מפספס את הקובץ השלישי – והכל נורא.

זו הסיבה שבעטיה אנו משתדלים לא להשתמש ב-magic – כי ככה קשה לשנות דברים. המע"מ משתנה? לך תמצא איפה השתמשת בו בכל המקומות. כתובת מסוימת השתנתה? כנ"ל. אנחנו נשתדל להכניס את כל המספרים, מחרוזות הטקסט וההגדרות למקומות מרוכזים.

יש כמה דרכים לעשות את זה ואני אסקור אחת בג'אווהסקריפט – שימוש ב-env. מדובר במודול מאוד חביב של Node.js. המודול, נקרא dotenv והוא פשוט ממש לשימוש. איך משתמשים בו? ראשית, מתקינים אותו כמו כל מודול של npm:

npm install dotenv

טוענים אותו בנקודת הכניסה של הפעלת המערכת שלכם. כאן זה תלוי במערכת אבל בד"כ ב-index.js או ב-app.js אם זה אקספרס באופן הזה:

require('dotenv').config()

מהנקודה הזו ניתן ליצור קובץ env. (הנקודה בהתחלה) שנראה כך:

API_URL=https://some-api-url.com/rest/is/awsome

מהנקודה הזו, ניתן להשתמש בכל מה שיש בקובץ הזה כך:

const result = await fetch(process.env.API_URL);

בכל מקום שבו רוצים להשתמש בכתובת. והמידע נשמר בקובץ ה-env. פשוט וקל.

לא חייבים לטעון את dotenv בהתחלה אלא להשתמש ב-r- כשמריצים את האפליקציה:

node -r dotenv/config your_script.js

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

פוסטים נוספים שכדאי לקרוא

עבודה בהיי טק

איך מראיינים סניורים?

השיטה שלי לבדיקת התאמה טכנית למתכנתות ולמתכנתים בכירים עם כמה שנות ניסיון.

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

תמונה מצוירת של רובוט שמנקה HTML
יסודות בתכנות

סניטציה – למה זה חשוב

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

תמונה של הבית הלבן עם מחשוב ענן וטקסט: FEDRAMP
פתרונות ומאמרים על פיתוח אינטרנט

FedRAMP & FIPS מבוא למתחילים

פרק מיוחד, לצד הקלטה של פרק של עושים תוכנה על אחת התקינות החשובות ביותר עבור חברות שסביר להניח שלא הכרתם

פתרונות ומאמרים על פיתוח אינטרנט

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

גלילה לראש העמוד