PracticU

הגנה מהתקפות SQL Injection

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

הגנה מהתקפות SQL Injection
מה קורה כשטקסט שהמשתמש מקליד בתיבת login נדבק ישירות לתוך שאילתת SQL? ההרצאה מסבירה את הפרצה הנפוצה הזאת, SQL Injection, ומראה איך סוגרים אותה בקוד.
איך הפרצה נוצרת
שם המשתמש והסיסמה (אחרי גיבוב) משולבים כמחרוזת בשאילתת select ... from users where username = ... and password = ..., בתוך גרשיים. גרש שהמשתמש מקליד נקרא על ידי מסד הנתונים כסגירת המחרוזת, ולכן הקלט יכול לשנות את משמעות השאילתה. בדוגמה בהרצאה, שם משתמש שכולל גרש, תנאי שתמיד אמת והערת SQL גרם לשאילתה להחזיר משתמשים, והאתר הכניס את המשתמש הראשון בטבלה בלי שהוזנה סיסמה נכונה. המרצה מציין שהפרצה הזאת יכולה גם להרוס את הדאטאבייס ולמחוק טבלאות.
איך מגנים
1. שאילתות עם סימני שאלה: בשכבת ה-DAL מפעילים תמיכה ב-values, ובשאילתה כותבים ? במקום כל ערך שמגיע מהמשתמש. המערכת מטפלת אוטומטית בגרשיים (escape).
2. מערך ערכים: הערכים מועברים כמערך לפי הסדר. ב-register: first name, last name, username ו-password, וגם ה-uuid. ב-login: credentials.username ו-credentials.password.
3. בכל שאילתה: הטיפול נעשה בכל מקום שיש קלט מהמשתמש, כולל ה-login, ה-register, הפורום ושאילתות לפי uuid. שאילתה בלי קלט, כמו שליפת כל המוצרים, נשארת כמו שהיא.
4. בלי string interpolation: המרצה מדגיש שאין לעבוד עם גרשיים בתוך השאילתה.
בדיקה
אחרי השינוי אותו קלט שפרץ קודם מחזיר "incorrect username or password", והכניסה הרגילה כ-moshiko עם 1234 עובדת.
שימו לב
ההגנה הזאת מכסה את הבסיס ורק חלק מהווריאציות. אפשר להכניס גם תווים כמו נקודה פסיק שיש להם משמעות ב-SQL, ולכן חשוב להבין שהיא נקודת התחלה.
אחרי ההרצאה אפשר לזהות שאילתה פגיעה ולהמיר אותה לשאילתה עם סימני שאלה.
השיעור הבא בקורס: הגנה מהתקפות XSS

פרקי ההרצאה: הגנה מהתקפות SQL Injection

  1. 00:00

    הכרת פרצת SQL Injection

  2. 00:47

    שילוב קלט המשתמש בשאילתת SQL

  3. 02:03

    לוגין עם נתונים שגויים

  4. 02:43

    איך גרש משבש את השאילתה

  5. 04:33

    כניסה לאתר בלי יוזר אמיתי

  6. 05:09

    הדרך להגנה מפני SQL Injection

תמלול ההרצאה: הגנה מהתקפות SQL Injection

הטקסט המלא של הדקות הראשונות בהרצאה «הגנה מהתקפות SQL Injection» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

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

  2. 00:35

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

  3. 00:48

    הטקסט מושיקו והסיסמה שהיא במקרה הזה 1234 שהופכת להיות איזשהו האש מסוים. ואז המידע הזה ניגש לביזנס לוג'יק ומשולב בשאילתת sql. הנה אנחנו רואים, האמת שזה לא זאת, לא רג'יסטר זה לוגין אנחנו רואים את השאילתה הזאת סלקט את כל השדות האלה from users where username שווה מה יש פה בדיוק מה

  4. 01:16

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

  5. 01:37

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

  6. 01:52

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

  7. 02:07

    בואו נראה דוגמא. אם אני כרגע מכניס סתם ג'י בריש ברור שהמערכת אומרת לי incorrect user name הוא פסוורד בסדר אבל בואו נכניס כאן את הסיסמה 123 בעצם אני לא יודע מה הסיסמה סתם אני מכניס ג'י בריש אני רוצה לפרוץ לאתר בתור user שלא יודע מה הuser name והסיסמה אז סתם זרקתי סיסמה

  8. 02:34

    אבל ביוזרניים אני מכניס a. אוקיי, ברור שאין יוזר כזה ואין סיסמה כזאת. הוא אומר לי יוזרניים, incorrect, יוזרניים או פספורט, זה בסדר. אבל מה קורה אם אני מכניס גרש?

  9. 02:47

    עכשיו, הגרש הזאת, אנחנו ראינו כשלמדנו sql, יכולה להתפרש על ידי מסד הנתונים כגרש שסוגרת את השאילתא.

  10. 03:01

    זאת אומרת שמה שכתוב פה עכשיו ביוזרניים זה a, גרש שסוגרת את הגרש הזאת אבל עדיין השאילתה לא בסדר כי יש פה איזושהי גרש נוספת ובכלל אין לי user שנקרא a אבל רגע יש לי פה עוד טבע טקסט אני יכול להוסיף עוד דברים לדוגמה אני יכול לעשות רווח ולרשום or 1 שווה 1 רגע מה זה 1 שווה 1 מבחינת sql זה true אז עכשיו מה בעצם השאילתה הזאת אומרת תבחר לי מהמסד נתונים

  11. 03:38

    את כל השדות האלה מתוך טבלת היוזרים שעבורם היוזרניים שווה a או שעבורם אחד שווה אחד. אף יוזר לא שווה a אבל כל היוזרים עבורם אחד שווה אחד. זאת אומרת שהמשפט הזה יהיה true כי יש פה or.

  12. 03:58

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

  13. 04:25

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

  14. 04:43

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

  15. 05:01

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

  16. 05:21

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

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: הסבר על JWT לאימות משתמשים

ההרצאה הבאה: הגנה מהתקפות XSS

הרצאות קשורות מקורסים אחרים

  • הגנה מהתקפת SQL injection
  • פריצה לאתר אינטרנט - SQL injection - חלק 1
  • הסבר על Dependency Injection
  • הזרקה Process Injection - חלק 1

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React