
select ... from users where username = ... and password = ..., בתוך גרשיים. גרש שהמשתמש מקליד נקרא על ידי מסד הנתונים כסגירת המחרוזת, ולכן הקלט יכול לשנות את משמעות השאילתה. בדוגמה בהרצאה, שם משתמש שכולל גרש, תנאי שתמיד אמת והערת SQL גרם לשאילתה להחזיר משתמשים, והאתר הכניס את המשתמש הראשון בטבלה בלי שהוזנה סיסמה נכונה. המרצה מציין שהפרצה הזאת יכולה גם להרוס את הדאטאבייס ולמחוק טבלאות.values, ובשאילתה כותבים ? במקום כל ערך שמגיע מהמשתמש. המערכת מטפלת אוטומטית בגרשיים (escape).credentials.username ו-credentials.password.הטקסט המלא של הדקות הראשונות בהרצאה «הגנה מהתקפות SQL Injection» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו עוברים לסקיוריטי האק הבא וזה בעצם פרצה מאוד מאוד נפוצה ומאוד פופולרית שקיימת באתרים וכאן אנחנו בעצם הולכים לתיבת טקסט כלשהי, נניח שיש לנו בדף לוגין או שפת מוצר או כל מקום שאנחנו מכניסים מידע למערכת והפרצה הזאת נקראת sql injection, מה זה בעצם אומר?
יש לנו כאן מידע שאנחנו מכניסים לתיבת הטקסט. נניח הכנסנו את מושיקו ו-1234. כאשר אנחנו עושים לוגין, המידע נשלח לשרת. מה נשלח?
הטקסט מושיקו והסיסמה שהיא במקרה הזה 1234 שהופכת להיות איזשהו האש מסוים. ואז המידע הזה ניגש לביזנס לוג'יק ומשולב בשאילתת sql. הנה אנחנו רואים, האמת שזה לא זאת, לא רג'יסטר זה לוגין אנחנו רואים את השאילתה הזאת סלקט את כל השדות האלה from users where username שווה מה יש פה בדיוק מה
שאנחנו הכנסנו לתיבת הטקסט מה שהמשתמש הכניס לתיבת הטקסט and password שווה מה יש פה בדיוק מה שהיוזר הכניס לסיסמה אחרי שהיא עברה האשינג פה כמובן היא עוברת האש וזה מה שהשאילתה, השאילתה מכילה את כל אלה.
אז מה הבעיה עם זה? שאנחנו רואים שיש פה את הגרש הזאת, וזה הסיום שלה, וכאן מה שאנחנו רואים זה מה היוזר הכניס לתיבת הטקסט.
אז מה קורה אם היוזר מכניס איזשהו משפט שמשבש את השאילתה וגורם למסד הנתונים לחשוב שאנחנו רוצים להריץ שאילתה אחרת. זה sql injection.
בואו נראה דוגמא. אם אני כרגע מכניס סתם ג'י בריש ברור שהמערכת אומרת לי incorrect user name הוא פסוורד בסדר אבל בואו נכניס כאן את הסיסמה 123 בעצם אני לא יודע מה הסיסמה סתם אני מכניס ג'י בריש אני רוצה לפרוץ לאתר בתור user שלא יודע מה הuser name והסיסמה אז סתם זרקתי סיסמה
אבל ביוזרניים אני מכניס a. אוקיי, ברור שאין יוזר כזה ואין סיסמה כזאת. הוא אומר לי יוזרניים, incorrect, יוזרניים או פספורט, זה בסדר. אבל מה קורה אם אני מכניס גרש?
עכשיו, הגרש הזאת, אנחנו ראינו כשלמדנו sql, יכולה להתפרש על ידי מסד הנתונים כגרש שסוגרת את השאילתא.
זאת אומרת שמה שכתוב פה עכשיו ביוזרניים זה a, גרש שסוגרת את הגרש הזאת אבל עדיין השאילתה לא בסדר כי יש פה איזושהי גרש נוספת ובכלל אין לי user שנקרא a אבל רגע יש לי פה עוד טבע טקסט אני יכול להוסיף עוד דברים לדוגמה אני יכול לעשות רווח ולרשום or 1 שווה 1 רגע מה זה 1 שווה 1 מבחינת sql זה true אז עכשיו מה בעצם השאילתה הזאת אומרת תבחר לי מהמסד נתונים
את כל השדות האלה מתוך טבלת היוזרים שעבורם היוזרניים שווה a או שעבורם אחד שווה אחד. אף יוזר לא שווה a אבל כל היוזרים עבורם אחד שווה אחד. זאת אומרת שהמשפט הזה יהיה true כי יש פה or.
or אומר אם אחד מהם הוא true אני מחזיר true. זאת אומרת שכל היוזרים יחזרו מהשאילתה הזאת. יש לנו עוד צורך להיפטר מהגרש הזאת שהיא חלק מהמחרוזת אבל זה לא בעיה פשוט אנחנו מכניסים מינוס מינוס מה זה מינוס מינוס בשפת sql הערה מינוס מינוס זה comment שימו לב שפה חייב להיות רווח ופה
חייב להיות רווח זה החוק זה מינוס מינוס רווח עכשיו הכנסתי כאילו מחרוזת שברור שאין לי user כזה וסתם זרקתי פה סיסמה נבצע לוגין ובום פרצנו לאתר והוא מחזיר לי. למה הוא החזיר לי את מוישה אופניק?
כי בדאטאבייס, בטבלת היוזרים, מוישה אופניק הוא הראשון. יוזר ראשון. אם אנחנו מסתכלים על השאילתה, אנחנו רואים שהבאנו פה את האובייקט הראשון, כי גם ככה אמור להיות לנו אובייקט אחד ויחיד.
אז הצלחנו לפרוץ עם איזשהו יוזר. אני לא נכנסתי בתור היוזר של מושיקו, סתם נכנסתי לאיזה יוזר וזה היוזר הראשון שיש אבל אנחנו פרצנו לאתר ואנחנו יכולים לצפות בכל המוצרים אפילו שלא היה לנו בכלל את היוזר הזה.
אז איך אנחנו הולכים להגן על sql injection אז אנחנו למעשה ראינו את זה כשלמדנו גישות לפנייה לsql וכל מה שאנחנו צריכים לעשות זה פשוט ניגשת לדל, איפה הדל שלנו,