הגנה על אופני הפעולה של שרת ColdFusion של Dreamweaver מפני התקפות מסוג החדרת SQL.
סיכון אבטחה של התקפות מסוג החדרת SQL
מסדי נתונים מסוימים מאפשרים לך לשלוח כמה משפטי SQL בשאילתה אחת. לכן ישנם סיכוני אבטחה פוטנציאליים בעת העברת פרמטרים במחרוזת שאילתה אל שאילתת מסד נתונים שנוצרה בצורה דינמית. פורצי מחשבים (האקרים) עשויים לנסות ולשנות כתובות URL או משתני טופס בשאילתה דינמית, על-ידי צירוף של משפטי SQL זדוניים לפרמטרים הקיימים. התקפה מעין זו נקראת בדרך כלל "התקפה מסוג החדרת SQL". יש לשנות חלק מקוד אופן הפעולה של השרת, אשר נוצר על-ידי Dreamweaver, על מנת לצמצם את הסיכון להתקפות מסוג החדרת SQL. למידע רקע נוסף על החדרת SQL, עיין במאמר בוויקיפדיה.
הערה: הבעיה המתוארת במאמר זה תוקנה במעדכן Dreamweaver 8.0.2.
פתרון: עדכון אופני הפעולה של השרת
כאשר אתה מאפשר למחרוזת שאילתה להעביר פרמטר, עליך לוודא שמועבר המידע הצפוי בלבד. Adobe יצרה את מעדכן Dreamweaver 8.0.2, אשר מצמצם את הסיכון להתקפות מסוג החדרת SQL. תיקונים אלה ייכללו בכל המהדורות הבאות של Dreamweaver. לאחר עדכון Dreamweaver 8, עליך להחיל מחדש את אופני הפעולה של השרת על הדפים המשתמשים בהם ולאחר מכן לפרוס מחדש דפים אלה בשרת שלך.
שאר מסמך זה מסביר כיצד לערוך ידנית את הקוד של Dreamweaver MX 2004 כדי למנוע התקפות מסוג החדרת SQL עם מודל השרת ColdFusion. להלן פירוט של אופני הפעולה של השרת אשר חשופים להתקפות אלה, בצירוף התיקונים:
ערכת רשומות עם מסנן
אין צורך לשנות ערכות רשומות ללא סינון, אך צריך לשנות ערכות רשומות עם סינון. בדוגמה שלהלן, ערכת רשומות של Dreamweaver MX 2004 בשם "Recordset1" מסוננת לפי ערך מזהה שהועבר מפרמטר URL. הקוד המודגש שלהלן הוא הקוד שצריך לשנות:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>
כדי להגן על ערכת הרשומות מפני התקפות מסוג החדרת SQL, השתמש בתג cfqueryparam בתוך התג cfquery, המכיל את המשפט SQL SELECT. התג cfqueryparam יאמת את סוג הנתונים של פרמטר השאילתה, ויעזור בהגנה על מסדי הנתונים שלך מפני משתמשים בלתי-מורשים. השורה בצהוב הוא הקוד המאובטח לאחר השינוי:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
אופני פעולת השרת Insert Record (הוספת רשומה) ואשף Record Insertion Form
כדי להגן על ערכת הרשומות מפני התקפות מסוג החדרת SQL, השתמש בתג cfqueryparam בתוך התג cfquery, המכיל את המשפט SQL INSERT. התג cfqueryparam יאמת את סוג הנתונים של פרמטר השאילתה, ויעזור בהגנה על מסדי הנתונים שלך מפני משתמשים בלתי-מורשים.
הקוד המקורי. הקוד המודגש שלהלן הוא הקוד שצריך לשנות:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif> )</cfquery>
הקוד המאובטח לאחר השינויים:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif> )</cfquery>
הערה: בחר בערכי cfslqtype ו-maxlength המתאימים לנתונים שלך.
Update Record (עדכון רשומה) ואשף Record Update Form
לאופן פעולת השרת Update Record (עדכון רשומה) ולאשף Record Update Form נדרש שילוב של התיקונים לעיל. תחילה, חפש את התג cfquery שמכיל את משפט SQL SELECT, ושנה אותו באופן המתואר תחת ערכת רשומות עם מסנן. לאחר מכן, חפש את התג cfquery שמכיל את משפט SQL UPDATE, ושנה אותו באופן המתואר תחת אופני פעולת השרת Insert Record (הוספת רשומה) ואשף Record Insertion Form.
אופן פעולת השרת Delete Record (מחיקת רשומה)
אופן פעולת השרת Delete Record (מחיקת רשומה) דומה לזו של ערכת רשומות עם מסנן.
הקוד המקורי:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>
הקוד המאובטח לאחר השינויים:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
הערה: בחר בערכי cfslqtype ו-maxlength המתאימים לנתונים שלך.
אופן פעולת השרת Log In User (כניסת משתמש)
כדי לתקן את הקוד של אופן הפעולה Log In User (כניסת משתמש), חפש את התגים cfquery, והוסף תגי cfqueryparam.
הקוד המקורי:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#' AND LAST_NAME='#FORM.textfield2#'</cfquery>
הקוד המאובטח לאחר השינויים:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"> AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>
הערה: בחר בערכי cfslqtype ו-maxlength המתאימים לנתונים שלך.
אופן פעולת השרת Check New User (בדיקת משתמש חדש)
עבור אופן פעולת השרת Check New User, יש להוסיף תחילה לדף אופן פעולת שרת של Insert Record. תחילה, חפש את התג cfquery שמכיל את משפט SQL SELECT, ושנה אותו באופן המתואר תחת ערכת רשומות עם מסנן. לאחר מכן, חפש את התג cfquery שמכיל את משפט SQL INSERT, ושנה אותו באופן המתואר תחת אופני פעולת השרת Insert Record (הוספת רשומה) ואשף Record Insertion Form.
הגדרת דף פרטים ראשי
עבור אובייקט היישום Master Detail Page Set (הגדרת דף פרטים ראשי), השינויים נערכים בעיקר בערכת הרשומות ש-Dreamweaver יוצר עבור דף הפירוט. אם אין לך ערכת רשומות מסוננת בדף הראשי, אין צורך בשינויים בדף הראשי. אם יש לך ערכת רשומות מסוננת בדף הראשי, ראה ערכת רשומות עם מסנן לעדכון הקוד של ערכת הרשומות.
עבור דף הפירוט, חפש את התג cfquery שמכיל את משפט SQL SELECT, ושנה אותו באופן המתואר תחת ערכת רשומות עם מסנן.
מידע נוסף
Adobe ממליצה להשתמש בתג cfqueryparam בתוך כל תג cfquery, כדי לסייע בהגנה על מסדי הנתונים שלך מפני משתמשים בלתי-מורשים. למידע נוסף: