WikiHow זה מלמד אותך כיצד למנוע הזרקת SQL באמצעות הצהרות מוכנות ב- PHP. הזרקת SQL היא אחת הפגיעות הנפוצות ביותר ביישומי אינטרנט כיום. הצהרות מוכנות משתמשות בפרמטרים קשורים ואינן משלבות משתנים עם מחרוזות SQL, מה שמאפשר לתוקף לשנות את משפט SQL.
הצהרות מוכנות משלבות את המשתנה עם משפט SQL המורכב, כך שה- SQL והמשתנים נשלחים בנפרד. המשתנים מתפרשים אז כמחרוזות בלבד ולא כחלק מהצהרת SQL. באמצעות השיטות בשלבים שלהלן, לא תצטרך להשתמש בכל טכניקות סינון הזרקת SQL אחרות כגון mysql_real_escape_string ().
צעדים
חלק 1 מתוך 2: הבנת הזרקת SQL
שלב 1. הזרקת SQL היא סוג של פגיעות ביישומים המשתמשים במסד נתונים של SQL
הפגיעות מתעוררת כאשר משתמשים בקלט משתמש בהצהרת SQL:
$ name = $ _GET ['שם משתמש']; $ query = "בחר סיסמה מתוך tbl_user WHERE name = '$ name'";
שלב 2. הערך שהמשתמש מכניס לשם המשתמש של משתנה ה- URL יוקצה למשתנה $ name
לאחר מכן הוא ממוקם ישירות במשפט SQL, ומאפשר למשתמש לערוך את משפט SQL.
$ name = "admin 'OR 1 = 1 -"; $ query = "בחר סיסמה מתוך tbl_user WHERE name = '$ name'";
שלב 3. לאחר מכן מסד הנתונים של SQL יקבל את משפט SQL כדלקמן:
בחר סיסמה מ- tbl_users WHERE שם = 'מנהל' או 1 = 1 - '
-
זהו SQL חוקי, אך במקום להחזיר סיסמה אחת למשתמש, המשפט יחזיר את כל הסיסמאות בטבלה tbl_user. זה לא משהו שאתה רוצה ביישומי האינטרנט שלך.
חלק 2 מתוך 2: שימוש ב- mySQLi ליצירת הצהרות מוכנות
שלב 1. צור את שאילתת mySQLi SELECT
השתמש בקוד שלהלן כדי לבחור נתונים מטבלה באמצעות הצהרות מוכנות של mySQLi.
$ name = $ _GET ['שם משתמש']; if ($ stmt = $ mysqli-> Prepar ("בחר סיסמה מתוך tbl_users WHERE שם =?")) {// לאגד משתנה לפרמטר כמחרוזת. $ stmt-> bind_param ("s", $ שם); // בצע את ההצהרה. $ stmt-> execute (); // קבל את המשתנים מהשאילתה. $ stmt-> bind_result ($ מעבר); // תביא את הנתונים. $ stmt-> להביא (); // הצג את הנתונים. printf ("הסיסמה למשתמש %s היא %s / n", $ name, $ pass); // סגור את ההצהרה המוכנה. $ stmt-> close (); }
הערה: המשתנה $ mysqli הוא אובייקט החיבור mySQLi
שלב 2. צור את שאילתת mySQLi INSERT
השתמש בקוד להלן כדי להכניס נתונים לטבלה באמצעות הצהרות מוכנות של mySQLi.
$ name = $ _GET ['שם משתמש']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> Prepar ("הכנס ל- tbl_users (שם, סיסמה) VALUES (?,?)"))) {// נקשר את המשתנים לפרמטר כמחרוזות. $ stmt-> bind_param ("ss", $ שם, $ סיסמה); // בצע את ההצהרה. $ stmt-> execute (); // סגור את ההצהרה המוכנה. $ stmt-> close (); }
הערה: המשתנה $ mysqli הוא אובייקט החיבור mySQLi
שלב 3. צור את שאילתת UPDATE של mySQLi
השתמש בקוד שלהלן כדי לעדכן נתונים בטבלה באמצעות הצהרות מוכנות של mySQLi.
$ name = $ _GET ['שם משתמש']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> prepare ("UPDATE tbl_users SET password =? WHERE name =?")) {// לאגד את המשתנים לפרמטר כמחרוזות. $ stmt-> bind_param ("ss", $ password, $ name); // בצע את ההצהרה. $ stmt-> execute (); // סגור את ההצהרה המוכנה. $ stmt-> close (); }
הערה: המשתנה $ mysqli הוא אובייקט החיבור mySQLi
שלב 4. צור את שאילתת מחיקת mySQLi
התסריט שלהלן הוא כיצד למחוק נתונים מטבלה באמצעות הצהרות מוכנות של mySQLi.
$ name = $ _GET ['שם משתמש']; $ password = $ _GET ['password']; if ($ stmt = $ mysqli-> prepare ("DELETE FROM tbl_users WHERE name =?")) {// לאגד את המשתנה לפרמטר כמחרוזת. $ stmt-> bind_param ("s", $ שם); // בצע את ההצהרה. $ stmt-> execute (); // סגור את ההצהרה המוכנה. $ stmt-> close (); }