קוד מאובטח

קוד מאובטח

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

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

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

עדכוני אבטחה בקוד חייב להתבצע למרות המשאבים הרבים הנדרשים לביצועם לצורך שילובם בכל חלקי המערכת.

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

להלן קווים מנחים לכתיבת קוד מאובטח:

קוד

  1. אימות הקלט יעשה בצד המשתמש ובצד הלקוח. אין לוותר על צד הלקוח היות והוא כולל התראות למשתמש. בצד השרת נבדוק את תקינות הקלט.
  2. לקוחות המערכת נדרשים לקבל הרשאות מינימאליות לשימוש. רצוי מאוד שכל משתמש לקוח יקבל הרשאות מדויקות ליכולות הנדרשות עבורו.
  3. שליחת נתונים מהשרת תעשה ב json המכיל את המידע שיוצג ללא html שיוזרק לדף. קוד ה javascript יקבל את הנתונים ויצייר את תגי ה html בהתאם לקוד שביקש את המידע ותכולתו. הזרקת html יכולה להכיל קוד המושתל על ידי המשתמש.
  4. נדרש להימנע מפקודת eval בקוד java script עקב אי בדיקת המידע לפני הרצתו ויכולת המשתמש לשתול קוד שיורץ במערכת. המידע צריך להתקבל ולהישלח באמצעות json וקריאת המידע מאובייקטים.
  5. נדרש להביא רק את המידע שהלקוח ביקש לדף. אין לשלוח את כל ערכי הטבלה ויש לבצע סינון תוצאות. פעולה זאת גורמת לדף לפעול לאט וכן לחשוף פרטים נוספים למשתמש.
  6. המנע ממשתנים גלובליים בקוד js, היות והמשתמש יכול לראות את פרטיהם ב console ולעדכן את ערכם. עדכון פרטי מאפיינים גלובליים חייבים להיבדק בצד שרת בעת קבלתם מהמשתמש. במקרה הצורך אף נדרש בדיקת המידע שהתקבל ביחס למידע הקיים במסד הנתונים לפני עדכון המידע.
  7. ספריות ורכיבים בהן נעשה שימוש בפיתוח, יילקחו ממקורות מוכרים ומאושרים על ידי סביבת הפיתוח. נדרש לתת עדיפות לגרסה האחרונה של הספרייה, וספריות שעדיין בפיתוח.
  8. שליחת בקשות בשיטת POST ולא GET, היות ושיטה זאת מקשה על התוקף לשליחת ההודעה.
  9. כל בקשת מידע מהשרת צריכה להכיל מפתח אקראי המכיל משתנה זמן מוצפן שישלח עם הבקשה. רק אם הקוד תואם את הגדרות המפתח בשרת, ישלח מידע ללקוח או יבוצע עדכון נתונים.
  10. יש להגדיר את סוגי הקבצים הניתנים להעלאה על ידי המשתמש ובדיקה שאכן רק הם עולים לשרת. אין לאפשר העלאת קובץ קוד על ידי המשתמש.
  11. שגיאות ריצת קוד המערכת צריכות להיתפס בזמן הרצת הקוד ואין להציג למשתמש את השגיאה היות ושגיאת הרצה יכולה להדריך פורץ היכן טעה ומה עליו לתקן להרצה מוצלחת. הודעה למשתמש אודות אי הצלחת פעולה תכיל הודעת שגיאה כללית.

מסד נתונים

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

    קוד דינאמי חשוף לניהול המידע על ידי הלקוח בהיותו ללא הגבלת אורך, סוג פרמטרים והעידר מגבלות נוספות של מסד הנתונים. בפרוצדורות המשתנים מונעים sql injection ומניעת עדכון מבנה השאילתא.

  2. קיימת חשיבות ליצירת משתמש והרשאה עבור כל מסד נתונים. באופן זה גם לאחר פריצה לא ניתן יהיה לפנות למסדי נתונים נוספים תחת אותו מסד נתונים בשרת.
  3. אין לפנות לערכים במסד הנתונים באמצעות ID של הרשומה אלא באמצעות קוד רשומה המכיל אותיות ומספרים. מזהה ID הינו מספר רץ ולכן קל למשתמש לעדכן ערכים נוספים באמצעות שינוי ה ID שנשלח. באופן זה ניתן לבקש תוצאות עבור כל הטבלה על ידי שימוש בלולאה שתחזיר את כל הערכים. לא נעים להיות קורבן גניבת נתונים בקוד המכיל 5 שורות...
  4. במעקב אחר הכנסת מידע חריג לטבלאות המערכת, רצוי לזהות את המשתמש שהזין את הנתונים וזמן הביצוע. מידע זה יגלה לנו האם הוא השתמש בכלי להרצת המידע או באופן ידני. זיהוי המשתמש יאפשר לנו להגביל אותו במקרה הצורך.

סביבת עבודה והצפנת מידע

  1. אין להתייחס לגורמי הגנה חיצוניים המותקנים בסביבת הייצור כאמצעי אבטחה.

    יש להתייחס למערכת כאילו אין שום הגנה מלבד הקוד המגן על המערכת וזאת ממספר סיבות:

    • אפשרות שלקוח שישתמש במערכת בסביבה אחרת מסביבת העבודה המוכרת לנו כרגע.
    • כלי הגנה חיצוניים מכילים הגדרות רבות ובמידה והכלי לא הוגדר כראוי תיווצר לנו נקודת תורפה שדרכה התוקף יכול לפגוע במערכת.
  2. נדרש לעדכן את השרת לעיתים תכופות היות ורוב העדכונים כוללים עדכוני אבטחה קריטיים לאבטחתו.

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

  3. גיבוי המידע למקור חיצוני מהשרת חשוב לשרידות המערכת והמידע.
  4. במידה והשרת בסביבת התקנה ציבורית ולא רק שלנו נדרש לבדוק מי עוד משתמש בשרת.
    • לוודא שמשתמשי השרת הנוספים הינם ללא גישה למידע העסקי שלנו.
    • לוודא שבעל חוות השרתים לא יכול לגשת למידע.
  5. נדרש להבדיל בין סביבת פיתוח לסביבת הרצת המערכת (production). הסביבות צריכות להיות נפרדות לחלוטין וההתחברות תהיה באמצעות vpn.
  6. הקוד העולה לסביבת העבודה נדרש להיות מוצפן. ניתן לפתוח קובץ exe בכל שפה ולקרוא את הקוד ומפתחות ההצפנה. עקב כך נדרש לעלות לשרת גרסה מוצפנת סגורה. (בכל מקרה אסור שקוד המקור יהיה על השרת).
  7. מידע רגיש כדוגמת סיסמאות, ערכי כסף ועוד, יש להצפין במסד הנתונים.

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

  8. הצפנת הגישה למסד הנתונים ב Connection string. במידה ומישהו פרץ לשרת נדרש להגביל את צעדיו בגישה למסד הנתונים.
  9. חשוב להשתמש במספר סוגי הצפנות מקובלות הנתמכות בקוד הפיתוח של המערכת. השימוש בסוגים שונים של הצפנות, יספק קודים מורכבים שאינם חוזרים על עצמם.
  10. שמירת נתונים רגישים של המערכת כקבציי cookie צריכים לכלול מידע מוצפן במינימום ההכרחי.

    קבצים אלה חשופים לעיניי המשתמש וביכולתו לעדכנם בקלות מכל דפדפן.

  11. המערכת צריכה לזהות את המשתמש באופן חד ערכי גם אם קבצי ה cookie של הלקוח נגנבו והפורץ מנסה להיכנס באמצעותם למערכת.
  12. נדרש להצפין נתוני session היות וניתן לגנוב גם אותם. session נשמר בצד הלקוח ולכן המשתמש יכול למוצאו.
  13. בסביבת ייצור שליחת הנתונים תהיה תחת פרוטוקול SSL.
  14. יש לקיים בדיקת קבלת נתונים בהתאם לפרוטוקול האבטחה של סביבת ריצת המערכת. במידה והסביבה תומכת ב SSL המידע חייב להתקבל בהתאם להגדרת האבטחה.
  15. מעקב אחר משתמשים המנסים לעדכן פרטי אבטחה כדוגמת cookie לגניבת זהות והצגת אזהרה.
  16. קובץ הגדרת מנגנוני אבטחה - htaccess /webconfig למערכת צריך להכיל XSS-Protection למניעת גניבת מידע באתר אחר באמצעות js.
  17. במידה והקבצים שהמשתמש העלה למערכת שייכים למערכת מומלץ לשמור אותם ב base64 ולהצפין את הערך בהצפנה דו כיוונית. בעת בקשה לצפייה בקובץ נפתח את ההצפנה במערכת ל base64 ונציג את המידע.

    באופן זה גם אם פרצו לשרת לא יוכלו לגנוב את הקבצים וניתן לצפות בהם רק באמצעות המערכת.

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

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

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