אבטחת מידע בטפסים ו - SQL Injection

השימוש ב - SQL Injection (הזרקת SQL) הוא כנראה הדרך הנפוצה ביותר לפריצה לאתרי אינטרנט. הנזק הנגרם לארגונים ולאנשים פרטיים כתוצאה משימוש של האקרים זדוניים למיניהם ב - SQL Injection מוערך במליוני דולרים.בשנה.

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

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

דוגמה לפריצה לאתר המכיל טופס Login

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

<form>
   <label>Password:</label><input type="text" name="Password">
   <button type="submit" >Enter</button>
</form>

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

"SELECT * FROM tblUSERS WHERE Password='123'"

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

' or 'x=x'

תוצאת הקלדה זו תיצור את השאילתה הבאה: 

"SELECT * FROM tblUsers WHERE Paswword='x' or 'x=x'"

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

דוגמה לגרימת נזק לבסיס הנתונים של אתר

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

<form>
  <input type="text" name="ProductName">
  <button type="submit">חפש</button>
</form>

כאשר מדובר במשתמש שאינו בעל כוונות זדון תיראה שאילתת החיפוש כך:

"SELECT * FROM tblProducts WHERE ProducName='some name'"

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

'; DROP DATABASE pubs --'

התוצאה של הזנת ערך זה לשדה החיפוש תהיה השאילתה הבאה:

"SELECT * FROM tblProducts WHERE ProductName=''; DROP DATABASE pubs --'"

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

'; DROP TABLE MEMBERS;

והשאילתה שתיווצר כתוצאה מהזנת ערך זה לשדה החיפוש תהיה:

"SELECT * FROM tblProducts WHERE ProductName=''; DROP TABLE MEMBERS;"

גם אם אין בבסיס הנתונים טבלה בשם זה אזי יכול המשתמש הזדוני לנסות עם שמות בעלי משמעות נוספים כגון: Creditcards, Products ועוד שמות נוספים.


איך להתגונן מפני SQL Injection

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

1. לבדוק את תקינות הקלט לפני שעושים בו שימוש.

2. לכתוב שאילתות קשיחות יותר.

3. לא להשתמש בשמות בעלי משמעות כאשר אתם בונים את בסיס הנתונים באתר.

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

 

מדריכים וכלים רלוונטיים נוספים בנושא זה

אבטחת מידע בשדות קלט בטפסי HTML והתכונה autocomplete

מבוא לטפסים ב - HTML5

אימות נתונים בשדות קלט

המדריך לשדות קלט ולתג <input>

 
© 2010-2013  www.Devschool.co.il | מדיניות פרטיות | מדיניות שימוש