אבטחת Cookies (עוגיות) ו-Sessions (סשנים) בPHP

מבוא לקריפטוגרפיה, הצפנה וגיבוב

עוגיות, סשנים ומה שבינם

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

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

הקדמה

כדי לאבטח את האתר שאנחנו בונים בצורה מקסימלית צריך תמיד לחשוב מחוץ לקופסא, שכן הפתרונות שאנחנו מציעים תמיד נראים לנו כטובים ביותר – אבל עין אוביקטיבית תמצא בהם את הפגם במהירות. בפוסט זה אתחיל להסביר כיצד ניתן לאבטח את קוד הPHP שלנו בצורה נכונה, אבל כמובן שאבטחת קוד PHP אינה מספקת. כשמאבטחים אתרים דינאמיים תמיד צריך לחשוב על פרצות אחרות, מסוכנות לא פחות, כדוגמאת הזרקת SQL כשמשתמשים במסדי נתונים ובSQL, הזרקות קוד כשאנחנו מאפשרים למשתמש להכניס קוד JavaScript ללא השגחה מתאימה וכו'.

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

עוגיות

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

המאפיינים הנפוצים של העוגיה בהם נשתמש הם אלו: שם העוגיה, איתו ניתן לגשת אל העוגיה, ערך העוגיה – הטקסט החבוי בתוך קובץ הטקסט ותאריך תפוגה.

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

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

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

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

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

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

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

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

הוסף תגובה