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

שלום. שמי סשה ברניק. ב-Mail.Ru Group אני עומד בראש מחלקת פיתוח אתרים, המורכבת מ-15 עובדים. למדנו איך ליצור אתרים לעשרות מיליוני משתמשים ויכולים להתמודד בקלות עם כמה מיליוני קהלים יומיים. אני עצמי עוסק בפיתוח אתרים כ-20 שנה, וב-15 השנים האחרונות אני מתכנת בעיקר ב-PHP לעבודה שלי. למרות שיכולות השפה והגישה לפיתוח השתנו מאוד במהלך הזמן הזה, הבנת הפגיעות העיקריות והיכולת להתגונן מפניהן נותרות כישורי מפתח עבור כל מפתח.

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

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

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

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

  • פגיעה במשתמשים: קבלת גישה לאימייל, סיסמאות, נתונים אישיים, פרטי כרטיס בנק, סודות עסקיים, רשימות אנשי קשר, היסטוריית עסקאות וסודות שמורים (כמו מישהו שקורא לכלב שלו Sparkle). הדלפת נתונים אלו פוגעת במשתמשים (פרטים וחברות). יישומי אינטרנט המשתמשים לרעה בנתונים כאלה ומארחים המנצלים את אמון המשתמש עלולים גם הם לגרום נזק.
  • נזק לחברה X עצמה: עקב הנזק שנגרם למשתמשים, המוניטין מתדרדר, יש לשלם פיצויים, מידע עסקי חשוב אובד, עולות עלויות נוספות - עבור תשתיות, שיפורי אבטחה, חיסול תוצאות, עלויות משפטיות, הטבות גדולות עבור מנהלים בכירים מפוטרים וכו'.
  • אני אתמקד בשתי הקטגוריות הללו מכיוון שהן כוללות את רוב הבעיות שאבטחת יישומי אינטרנט צריכה למנוע. כל החברות שחוו פרצות אבטחה חמורות ממהרות לכתוב בהודעות לעיתונות ובאתרי האינטרנט שלהן עד כמה הן רגישות לכך. אז אני ממליץ לך להרגיש את החשיבות של בעיה זו בכל ליבך לפני שאתה נתקל בה בפועל.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    עקרונות אבטחה בסיסיים בעת פיתוח אמצעי אבטחה, ניתן להעריך את יעילותם באמצעות השיקולים הבאים. כבר ציטטתי כמה למעלה.
  • אל תסמוך על אף אחד או משהו.
  • הנח תמיד את התרחיש הגרוע ביותר.
  • החל הגנה מרובת רמות (הגנה בעומק).
  • היצמד לעקרון "Keep It Simple Stupid" (KISS).
  • היצמד לעקרון "הזכות הקטנה ביותר".
  • התוקפים מריחים עמימות.
  • קרא את התיעוד (RTFM), אך לעולם אל תסמוך עליו.
  • אם זה לא נבדק, זה לא עובד.
  • זו תמיד אשמתך!
  • נעבור בקצרה על כל הנקודות.1. אל תבטח באף אחד או בשום דבר כפי שצוין לעיל, העמדה הנכונה היא להניח שכל דבר וכל מי שיישום האינטרנט שלך מקיים איתו אינטראקציה רוצה לפרוץ אותו. זה כולל רכיבי יישום או שכבות אחרות הדרושים לעיבוד בקשות. הכל והכל. אין חריגים.2. הנח תמיד את התרחיש הגרוע ביותר למערכות אבטחה רבות יש דבר אחד במשותף: לא משנה כמה הן עשויות, כל אחת מהן עלולה להיפרץ. אם תיקחו זאת בחשבון, תבינו במהירות את היתרון של הנקודה השנייה. התמקדות בתרחיש הגרוע ביותר תעזור לך להעריך את היקף וחומרת המתקפה. ואם זה אכן יקרה, ייתכן שתוכל לצמצם את ההשלכות הלא נעימות עם אמצעי אבטחה נוספים ושינויים ארכיטקטוניים. אולי הפתרון המסורתי שבו אתה משתמש כבר הוחלף במשהו טוב יותר?3. השתמש בהגנה רב-מפלסית (הגנה בעומק) הגנה רב-מפלסית שאולה ממדע הצבא, מכיוון שאנשים הבינו מזמן שקירות רבים, שקי חול, ציוד, שריון גוף וצלוחיות המכסות איברים חיוניים מכדורי האויב והלהבים הם הנכון גישה לבטיחות. אתה אף פעם לא יודע איזה מהבאים לעיל לא יגן, ואתה צריך לוודא שמספר שכבות הגנה יאפשרו לך להסתמך על יותר מסתם ביצור שדה או מערך קרב. כמובן, לא מדובר רק בכישלונות בודדים. דמיינו לעצמכם תוקף מטפס על סולם על קיר ענק מימי הביניים רק כדי לגלות שיש עוד קיר מאחוריו שממנו מרעיפים עליו חיצים. האקרים ירגישו אותו דבר.4. Keep It Simple Stupid (KISS) ההגנות הטובות ביותר הן תמיד פשוטות. קל לפתח, ליישם, להבין, להשתמש ולבדוק אותם. הפשטות מפחיתה שגיאות, מעודדת ביצועי יישום נכונים ומקלה על יישום גם בסביבות המורכבות והעוינות ביותר.5. לדבוק בעקרון "הזכות הקטנה ביותר" לכל משתתף בחילופי מידע (משתמש, תהליך, תוכנית) צריכות להיות רק אותן זכויות גישה שהוא צריך כדי לבצע את תפקידיו.6. תוקפים מריח חושך אבטחה באמצעות חושך מבוססת על ההנחה שאם אתה משתמש בהגנה A ולא תגיד לאף אחד מה זה, איך זה עובד, או אם זה בכלל קיים, זה יעזור לך בקסם כי התוקפים נשארים מבולבלים. במציאות, זה רק נותן יתרון קל. לעתים קרובות, תוקף מנוסה יוכל להבין את האמצעים שנקטתם, לכן עליכם להשתמש בהגנות מפורשות. מי שבטוח יתר על המידה שהגנה לא ברורה מבטלת את הצורך בהגנה אמיתית צריך להיענש במיוחד כדי להיפטר מאשליות.7. קרא את התיעוד (RTFM), אך לעולם אל תסמוך עליו. המדריך ל-PHP הוא התנ"ך. כמובן, הוא לא נכתב על ידי מפלצת הספגטי המעופפת, כך שטכנית הוא עשוי להכיל כמה חצאי אמיתות, השמטות, פרשנויות מוטעות או שגיאות שטרם הבחינו או תוקנו. אותו דבר לגבי Stack Overflow.

    מקורות מיוחדים של חוכמת אבטחה (ממוקדת PHP ואחרות) מספקים בדרך כלל ידע מפורט יותר. הדבר הקרוב ביותר לתנ"ך בנושא אבטחת PHP הוא OWASP, שמציע מאמרים, מדריכים וטיפים. אם לא מומלץ לעשות משהו ב-OWASP, לעולם אל תעשה את זה!

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

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

    יחד עם זאת, התקפות על מערכות אבטחה הן לרוב שילובים של התקפות. בנפרד, הם חסרי משמעות, אבל לפעמים הם פותחים את הדרך להתקפות אחרות. לדוגמה, הזרקת SQL דורשת לפעמים שם משתמש ספציפי, אותו ניתן להשיג באמצעות Timing Attack נגד הממשק האדמיניסטרטיבי, במקום ה-brute force היקר והנראה בהרבה. בתורו, הזרקת SQL מאפשרת לך ליישם התקפת XSS על חשבון ניהול ספציפי מבלי למשוך תשומת לב עם מספר רב של ערכים חשודים ביומנים.

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

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

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

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

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

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    המסנן עובר ללא שאלות. הבעיה היא שכתובת ה-php:// שהתקבלה עשויה לעבור לפונקציית PHP שמצפה לקבל כתובת HTTP מרוחקת במקום להחזיר נתונים מסקריפט ה-PHP שמבצע (דרך המטפל ב-PHP). הפגיעות מתרחשת מכיוון שלאפשרות הסינון אין שיטה להגביל URIs חוקיים. למרות שהאפליקציה מצפה לקישור http, https או mailto במקום URI ספציפי ל-PHP. יש להימנע מגישה כללית מדי זו לבדיקה בכל מחיר.

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

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

    מסתבר שאימות נתוני הקלט אינו אמין מטבעו. זה הכי יעיל לחיתוך ערכים לא חוקיים בעליל. נניח כאשר משהו צריך להיות מספר שלם, או מחרוזת אלפאנומרית, או כתובת URL של HTTP. לפורמטים ולערכים כאלה יש מגבלות, ואם הם מאומתים כראוי, יש סיכוי נמוך יותר להוות איום. ערכים אחרים (טקסט בלתי מוגבל, מערכי GET/POST ו-HTML) קשים יותר לאימות ויש סיכוי גבוה יותר שיכילו נתונים זדוניים.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Assert(0 == "0ABC"); //מחזירה TRUE assert(0 == "ABC"); //מחזירה TRUE (גם ללא מספר בהתחלה!) assert(0 === "0ABC"); //מחזיר NULL/נותן אזהרה לגבי חוסר האפשרות לבדוק את ההצהרה
    בעת תכנון מאמתים, הקפד להשתמש בהשוואות קפדניות והמרת סוגים ידנית כאשר ערכי הקלט או הפלט עשויים להיות מחרוזת. לדוגמה, טפסים יכולים להחזיר מחרוזת, אז אם אתה עובד עם נתונים שצריכים להיות מספר שלם, הקפד לבדוק את הסוג שלו:

    הפונקציה checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) ( return false; // מכיל תווים לא ספרתיים ) if (!is_int((int) $int )) ( return false; // ערך אחר שאינו מספר שלם או גדול יותר PHP_MAX_INT ) return ($int >= $min && $int = $min && $int array("verify_peer" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $context);
    UPD. ב-PHP 5.6+, האפשרות ssl.verify_peer מוגדרת ל-TRUE כברירת מחדל.

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

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, false);
    השבתת אימות השרת בהקשר SSL או בעת שימוש ב-curl_setopt() תגרום לפגיעות להתקפות man-in-the-middle. אבל הוא מושבת בדיוק כדי לפתור את הבעיה של שגיאות מעצבנות המעידות על התקפה או על ניסיונות של אפליקציה ליצור קשר עם מארח שתעודת ה-SSL שלו מוגדרת בצורה שגויה או שפג תוקפו.

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

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

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

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

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

    המדינות הטובות ביותר לנשים

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

    2. אבל היזהרו: קנדה היא מקום מצוין להיכנס להריון. נשים קנדיות יכולות להיכנס להריון ב-21% קל יותר מאחרות.

    3. גם נשים אוסטרליות מקיימות יחסי מין לעתים קרובות - 37% יותר ממשתמשי אפליקציה ממוצעים.

    4. מיותר לציין שגם לנשים באוסטרליה יש סיכוי טוב להיכנס להריון? הם גבוהים ב-14% ממשתמשים אחרים.

    5. ארה"ב היא מקום טוב לשמוח בו. לנשים אמריקאיות יש 16% יותר סיכוי מנשים אחרות לקיים יחסי מין.

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

    תיאבון מיני

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

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

    3. רוב הנשים מתחילות לקיים יחסי מין שוב ביום ה-12 למחזור שלהן.

    4. נשים רבות מקיימות יחסי מין קבועים מ-12 עד 14 ימים מהמחזור. אפליקציית Glow מכנה את היום "שיא סקסי".

    5. נשים למעשה מרגישות הכי סקסיות שלהן בימים 13 ו-14 של המחזור שלהן. אבל הנה הדבר המעניין: הם לא בהכרח מקבלים את המין הטוב והמספק ביותר בזמן הזה.

    6. נשים הכי נהנות ממין ביום ה-30 האחרון למחזור שלהן. יום זה בזוהר מוגדר כ"אורגזמות שיא".

    האם נשים מרוצות?

    1. נשים מרגישות הכי מאושרות בימים 15 ו-16 של המחזור שלהן, וגם אם הן קיימו הרבה סקס בימים הקודמים.

    2. משתמשי זוהר רשמו 7.6 מיליון מפגשים מיניים במשך שנתיים.

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

    4. אגב, משתמשים גם דיווחו על הקראש שלהם 2 מיליון פעמים. האפליקציה גם עוקבת אחר מחזורי המין והפוריות של 88,000 זוגות.

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

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



    אהבתם את הכתבה? שתף אותו
    רֹאשׁ