מתקפת XSS היא אחת המתקפות המוכרות יותר, ומאלו שניתן להתגונן מפניהם יחסית בקלות, אך עדיין יש הרבה מפתחים ששוכחים ממנה או ממעיטים מערכה.
מה זה מתקפת XSS
מתקפת XSS או בשמה המלא Cross-Site Scripting היא מתקפה המתרחשת בצד הלקוח. מתקפה זאת שמה למטרה את האינטראקציות של המשתמש עם המערכת.
המתקפה מבוצעת ע״י שליחת תגיות HTML וקוד JavaScript ספציפית אשר בפוטנציאל יכולים לשנות את נראות העמוד, הפונקציונליות של רכיבים בעמוד ואף להאזין לפעולות המשתמש בעמוד ולגנוב מידע רגיש.
דוגמאות למתקפת XSS
למתקפה זו ישנם מספר דוגמאות ודרכים להתבצע, אך הדרך הפשוטה והמוכרת ביותר היא הטמעת סקריפט JavaScript בין אם כסקריפט חיצוני או כסקריפט Inline.
דוגמה א׳ – הטמעת סקריפט חיצוני
נניח שיש לנו בלוג באתר, חלק מהמערכת של הבלוג היא היכולת להגיב על פוסטים או עמודים. נניח שיש לנו טופס אשר לא מגן מפני מתקפה זו. על פניו אנו יכולים לכתוב תגובה ולהוסיף תגית <script>...</script>
אשר טוענת קובץ JavaScript חיצוני.
במידה והמערכת לא יודעת לסנן תגיות HTML, בדגש על תגית זו, כאשר מישהו יכנס לעמוד הסקריפט שהצמדנו לתגובה שלנו, ייטען ויתחיל לרוץ.
פוטנציאל הנזק במקרה הזה הוא גניבת כתובות מייל, מספרי טלפון וכל קלט אשר משתמש יזין בטופס שליחת התגובה.
דוגמה ב׳ – שינוי רכיבים בעמוד
נניח שיש לנו עמוד נחיתה אשר מאפשר לכם להשתתף בהגרלה ומעודד אתכם לשלוח לחברים שלכם קישור מותאם אישית ככה כל מי שירשם דרככם לקמפיין או לאתר.
נניח שהקישור שלנו הוא במבנה הבא והוא מאפשר לנו להציג את שם השולח או המפנה ע״י שימוש בפרמטר sender_name
.
https://lp.example.com/?id=123&sender_name=Israel
על פניו, אם אין הגנה מפני הזרקת תגיות HTML, אני יכול לשרשר את קוד JavaScript אשר משנה את התכונה (Attribute) בטופס השליחה שנקרא action
באופן הבא:
https://lp.example.com/?id=123&sender_name=Israel<script>...</script>
פוטנציאל הנזק במקרה הזה הוא שכל מי שימלא פרטים בטופס, במקום שהפרטים ישלחו למערכת של האתר, היא תשלח לגורם צד שלישי, מה שאומר גניבה של שמות משתמש, אימיילים וסיסמאות של משתמשים.
איך להתגונן מפני מתקפות XSS
אחד הכללים הראשונים שלומדים בפיתוח זה שאסור לסמוך אף פעם על הקלט של המשתמש, כלומר שאני תמיד צריך להשים הגנות ולהגן על עצמי מפני התוכן שהגולש שולח.
על כן אני אוסיף וולידציות לכל קלט שאני יכול, אני אסנן תגיות או תוכן מסוכן ע״י שימוש בפונקציות שונות ששפת התכנות שלי מספקת או אפילו על ידי כתיבת ביטויים רגולריים אשר יאפשרו לי לחפש ולהסיר קלט זדוני.
אם נדבר על PHP, ישנן שתי פונקציות עיקריות אשר מאפשרות לנו להתגונן מפני מתקפה זו.
אופציה א׳ – הסרת תגיות HTML
אם אנו לא רוצים לאפשר בכלל להזין תגיות HTML מכל סוג, אנו יכולים פשוט להשתמש בפונקציה strip_tags
.
$comment = strip_tags( $_POST['comment'] );
פונקציה זו תסיר בצורה מלאה תגיות HTML ותגיות XML מהקלט, מה שיאפשר לנו לישון בשקט 😴.
בעולם ורוד זה נחמד, אך במציאות אנו לפעמים נרצה כן לאפשר שימוש בתגיות HTML בסיסיות כמו סגנון בסיסי של הטקסט או הוספה של קישורים, על כן אנו יכולים להעביר פרמטר נוסף לפונקציה אשר יתפקד בתור רשימת תגיות מותרות (Allow List).
$comment = strip_tags( $_POST['comment'], '<strong><a>' );
בדוגמא הנ״ל אנו מנחים את הפונקציה לא להסיר תגיות <strong>
ו-<a>
.
שימו לב, לפי הדוקומנטציה הרישמית של PHP, לא מומלץ להשתמש בפונקציה זו להגן מפני XSS מכיוון שהיא יכולה להסיר טקסט נוסף כאשר מדובר על תגיות HTML אשר לא נסגרו כראוי.
אופציה ב׳ – Escaping לתגיות HTML
פעולת Escaping עובדת כך שהיא לא מסירה תגיות HTML, אלא הופכת אותן ללא שמישות, לרוב זה מבוצע ע״י המרת התווים הבאים <
, >
, "
, '
ו-&
לייצוג שלהם ב-ASCII.
הפונקציה שמבצעת זאת ב-PHP היא htmlspecialchars
.
$comment = htmlspecialchars( $_POST['comment'] );
אם נעביר לדוגמא לפונקציה את הערך הבא:
<script>alert("All Your Base are Belong to Us 🚨");</script>
הפלט של הפונקציה יהיה:
לפונקציה יש מספר פרמטרים אשר מאפשרים לנו לקסטם את הפלט של הפונקציה, ניתן לקרוא עוד בדוקומנטציה הרישמית.
סיכום
מתקפת XSS היא מתקפה ידועה מאוד, ישנם מפתחים אשר לא מבינים את פוטנציאל הנזק במתקפה וזה מגיע למצב שמידע של משתמשים נגנב. קל מאוד להתגונן בפניה ע״י שימוש בפונקציות Stripping או Escaping אשר קיימות במרבית שפות התכנות.
מאמר מעניין מאוד!
היי נתן 👋🏽,
שמח לשמוע, מזמין אותך להירשם לעדכונים במייל או בטלגרם 🙂