שפר את האבטחה של היישומים שלנו באמצעות PHP

{title}

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

אבטחת יישומי אינטרנט


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

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

סינון נתונים


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

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

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

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

סוגי סינון


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

{title}


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

$config[ads_text5] not found

{title}


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

הגנה מפני סקריפטים מאתרים אחרים


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

$config[ads_text5] not found

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

הזרקת SQL


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

$config[ads_text5] not found

{title}


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

$config[ads_text6] not found

{title}


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