| How to write secure PHP Code | | Print | |
This week's tip: How to write secure PHP codePHP קלה מאד לשימוש ומאפשרת גמישות רבה מאד, תכונות שעשו אותה לפופולריות ביותר, אך גם לפגיעה ביותר. מאמר זה סוקר מספר דרכים מעשיות לכתיבה של קוד PHP בטוח. חשוב להדגיש שכאשר אנו בוחנים את מידת האבטחה של אתר או אפליקציית-ווב, ישנם גורמים רבים מאד שיש להתחשב בהם: קינפוג השרת, בסיס הנתונים, נהלי עבודה ועוד. אפליקציה תהיה מאובטחת כמידת האבטחה של החוליה החלשה ביותר בשרשרת. כאן נסקור רק את התחום הצר של כתיבת קוד שיהיה מאובטח בלי קשר לקונפיגורציה של השרת הספציפי. 1. דבר ראשון הוא לדעת מאיפה באים המשתנים. כאשר מצפים לקבל נתונים מהגשה של טופס אסור להניח שהם פשוט נמצאים שם. (הרבה כבר נאמר על שימוש ב register_globals ) יש לדעת מאיפה לצפות למשתנה - מה GET או ה POST , ולהביא אותו משם:
2. יש לאתחל כל משתנה שאנו משתמשים בו. למרות שPHP לא דורשת זאת, רצוי להזין ערך התחלתי לכל משתנה לפני שמשתמשים בו. דוגמא לשימוש לא נכון במשתנים:
3. יש לבצע ולידציה על הנתון. אם אנו מצפים למספר לוודא שאכן הוא מספר. אם אנו מצפים למחרוזת קצרה לוודא שאינה עולה על אורך מסוים. לדוגמא:
4. לאחר שקיבלנו את הנתונים, במידה ואנו רוצים להעביר אותם כחלק מ שאילתת SQL יש לנקוט במשנה זהירות, ולהשתמש בפקודת mysql_real_escape_string . פקודה זו תמיר מרכאות בכל קידוד, לתו מקובל שלא יאפשר לשתול שאילתת SQL לא רצויה. שימוש בפונקציה זו רצוי ללא קשר לאבטחה לעיתים המשתמש ירצה להזין מחרוזת עם מרכאות. אם לא נשתמש בפונקציה הזו נקבל הודעת שגיאה מבסיס הנתונים.
5. אם אנו מכלילים קובץ יש להקפיד שלא משתמשים במשתנה בתור שם הקובץ. אם משתמשים במשתנה, יש לוודא שהוא באמת שם של קובץ מקומי שאנו מצפים לו. זה חוזר על הנקודה שצריך לעשות ולידציה לנתונים, אבל כאן יש לזה משנה חשיבות, מכיוון שנושא זה יצר כבר בעבר פרצות אבטחה קשות. עד כאן זה ממש הבסיס דברים שאם לא נבצע נהיה בצרות. ישנם דברים נוספים שכדאי לחשוב עליהם, גם למען קוד בהיר ותקין. 6. שימוש בפונקציות מקל מאוד על כתיבה, קריאה ושדרוג עתידי של הקוד. יש להקפיד להשתמש בפונקציה עבור כל משימה מובחנת שאנו חוזרים עליה במקומות שונים. כאשר אנו משתמשים בפונקציות אנו מבודדים את המשתנים בהם משתמשת הפונקציה. כך אנו מונעים שגיאות של שימוש חוזר ואיתחול שגוי של משתנים. הקפדה יתרה על scoping של משתנים מוכיחה את עצמה כצעד משתלם לטווח הארוך. כל משתנה שהפונקציה צריכה יועבר אליה כפרמטר. שימוש במשתנים גלובלים אינו מומלץ, אך הוא ניתן לביצוע אם מקפידים להשתמש רק במספר מצומצם מאד של משתנים. 7. כשם שמפרידים את המשימות לפונקציות רצוי מאד להפריד את המשימות לקבצים שונים. לדוגמא קובץ שמבצע ולידציה של המשתמש או קובץ המכיל ספריה לשימוש בבסיס הנתונים. דוגמא מיוחדת ובולטת היא הזנת פרטי ההתחברות של בסיס הנתונים. פרטי ההתחברות כוללים שם משתמש וסיסמא, נתונים שעלולים להשתנות במהלך הזמן. כדי להקל על העדכון שלהם יש להקפיד שהם יופיעו רק בקובץ אחד, וכל דף שזקוק לנתונים אלו יכליל את אותו קובץ. קובץ כזה יכול להכיל את הנתונים בפונקציה:
נשמור את הקובץ בשם db.inc.php , ובתחילת כל דף המשתמש בבסיס הנתונים נרשום:
מקורות ומידע לעיון נוסף:
PHP manual
מאמר זה הוא בגדר טיוטה, הערות והארות יתקבלו בברכה. {moscomment}
|
