הגנה על MySQL החף מהזרקת SQL
מחבר:
Ashfaq אנסארי

נסקר על ידי:
דרוג:
5
על אוקטובר 19, 2012
השתנה לאחרונה:ינואר 18, 2013

תקציר:

מדריך מפורט על איך למנוע זריקת MySQL ב-PHP. Secure כללים ופונקציות קידוד כדי למנוע הזרקת SQL.

מבוא

 

זהו מדריך קצר על איך להגן על החפים מפשע שלך MySQL מסד הנתונים מ הזרקת SQL התקפות.
 

מה זה הזרקת SQL?

 

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

קוד לכך יכול להיראות משהו כזה:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?PHP
// לקבל את המשתמש וסיסמא מהבקשה POST
$USER_NAME = $_POST[ "שם משתמש" ];
$סיסמא  = $_POST[ "סיסמא" ];

$שאלה = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מusers_table איפה = שם משתמש '$USER_NAME"וסיסמא = '$סיסמא' ";

$תוצאה = mysql_query( $שאלה );

// לבדוק אם MySQL מצא שום דבר, ולקבל את את השיא אם זה הצליח
אם ( mysql_num_rows( $תוצאה ) > 0 ) {
    $נתונים = mysql_fetch_assoc( $תוצאה );
    הד 'ברוכים הבאים' . $משתמש . '!';
    הד "מספר החשבון שלך הוא: ' . $נתונים[ "ACCOUNT_NUMBER ' ] . '';
} //להדפיס את הודעת errorr
אחר {
    הד "שם משתמש או סיסמא אינה חוקית! אנא נסה שוב!';
}
?>

 

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

נניח שאני נכנסתי “הדגמה” כשם המשתמש שלי, ו - “demopass” כסיסמה שלי, אז השאילתה SQL שהוא עבר לMySQL תהיה נראית כך:
 

1
לבחור FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מן users_table איפה שם משתמש = "הדגמה" ו סיסמא = "Demopass ' ;

 

אם נתוני הקלט שלנו הוא תוקף בהצלחה באתר, אז תוכל להיות מחובר למערכת ואנחנו יוצגו עם מספר החשבון אחר שאנו לא יקבלו גישה למערכת ואנחנו יוצגו עם הודעת שגיאה “שם משתמש או סיסמא אינה חוקית! אנא נסה שוב!
 

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

נניח שהמשתמש מנסה להתחבר כשם משתמש dem'o ואת הסיסמה של כ demopass.
 

עכשיו, בואו לראות איך נראה כמו משפט SQL.
 

1
לבחור FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מן users_table איפה שם משתמש = "'o"וסיסמא = 'demopass' ;

 

כשהוא מבצע את MySQL ההצהרה, זה יתייחס רק “dem” כשם משתמש וכאשר הוא נתקל אחר ‘o", אז זה מתייחס ‘o‘ כפקודת SQL וזה יהיה לזרוק וטעייה הודעה כפי שהוא אינו מכיר ב ‘o‘ כפקודת SQL חוקית.
 
שגיאה 1064 (42000): יש לך שגיאה בתחביר SQL שלך; לבדוק את המדריך המתאים לגרסת שרת MySQL שלך עבור תחביר הזכות להשתמש ליד 'o’ וסיסמא =”demopass”; ” בקו 1
 

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

עכשיו, בואו נראה מה קורה אם המשתמש הזדוני נכנס כשם משתמש (‘ 'או' 1 '= 1) ואת הסיסמה של כ “demopass“.

שאילתת SQL תיראה כך:

1
לבחור FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מן users_table איפה שם משתמש = '' או '1 '='1 ' ו סיסמא = "Demopass ' ;

 

מה שאילתת SQL מעל אומרת? זה אומר לי MySQL כדי למצוא את כל השורות עם שם משתמש שווה ל “” (ריק) או (1= 1) וסיסמא שווה “demopass“.
 

בואו לייצג את שאילתת SQL מעל באופן הגיוני יותר להבין מה לא בסדר בעצם עם משפט SQL:
 

שם משתמש = “” או “1= 1” וסיסמא = “demopass”
 

עכשיו, אנחנו כבר יודעים כי 1 = 1 הוא תמיד הולך להיות אמיתי. לפיכך, המשתמש יוכל להתחבר למערכת אם הסיסמה נכונה והשם המשתמש לא בסדר.
 

בואו לנתח תרחיש גרוע יותר עם מחרוזת התקפה שונה.
 

מחרוזת התקפה: ‘ או 1 = 1–
 

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

עכשיו, אנו מניחים כי התוקף אפילו לא יודע את הסיסמה.
 

1
לבחור FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מן users_table איפה שם משתמש = '' או 1=1--"וסיסמא = 'idonotknow' ;

 

ראה כיצד משפט SQL מתפרש על ידי MySQL.
 

שם משתמש = “” או 1 = 1– וסיסמא = “idonotknow”
 

לתשומת לבך בהצהרה לעיל. כפי שאנו יודעים כי היא הצהרת שליחות קטלנית ב-SQL ו 1= 1 הוא תמיד נכון, לאחר ששאר שליחות קטלנית הדוח על השאילתה SQL לא יבוצעו.
 

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

בואו לעזור MySQL התמים
 

ציטוטי קסם

 

ציטוטי קסם היא תכונה שנויה במחלוקת של הפקודות שפת PHP, שבו תווים מיוחדים מכין-הסתיימו עם קו נטוי הפוך לפני שעבר על.
 

ציטוטי קסם היו מופעל כברירת מחדל בהתקנות חדשות של PHP3 ו - PHP4, ומכיוון שהפעולה שלהם היא מאחורי הקלעים ולא ברורה באופן מיידי, מפתחים יכולים להיות מודעים לקיומם ואת הבעיות הפוטנציאליות שהם יכולים להציג.
 

נצטרך להפעיל את ציטוטי קסם בתוך php.ini קובץ באינטרנט השורש של האתר.
 

כיצד ציטוטי Magic עוזר?

 

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

So usename = dem'o הופך להיות "דעם O , ו-MySQL יכול לעבוד עם זה מרכאות כפי שהוא “מוגן” על ידי הקו הנטוי.
 

בואו לראות מה קורה כאשר ציטוטי קסם מופעל. בואו לראות איך התוקף מושפע עם ציטוטים קסם.
 

1
לבחור FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מן users_table איפה שם משתמש = '\' או 1 = 1 - ' ו סיסמא = 'Idonotknow' ;

 

שם המשתמש מתפרש: \’ או 1 = 1–

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

בעיות עם ציטוטים קסם

 

ציטוטי קסם רק להוסיף קו נטוי הפוך לפני כמה תווים, לא יותר. זה מגן עלינו מפני הזרקת SQL רק במקרים מסוימים מסוימים כמו לעיל ורק על ידי צירוף מקרים. אם יש לנו display_errors ON, אנחנו פשוט נעשו התוקף מאוד שמח עם פרטי מסד הנתונים שלך outputted ממש לפני עיניו. גם אם אין לך, עדיין קיימת אפשרות של הזרקת SQL עיוורת ושימוש בשיטות הזרקת SQL מראש אפשר לעקוף magic_quotes_gpc פונקציה.
 
כך, שאנחנו זקוקים לדרך של בריחת נתונים, כי היא לא crappy, אינו נוטה לבעיות להגדיר אופי כמו, ואינו נוטה ציטוטים קוצצו רבייה קסם.
 
בתוך נובמבר 2005 מפתחי PHP הליבה החליטו על חשבון הבעיות האלה כי ציטוטי קסם תכונה יוסר מ-PHP 6.
פעם אחת ציטוטי קסם בתכונות הן נסוגה, אז יש הולך להיות כמה בעיות מרכזיות, צצות.
 

SQL Injection מקלים
 

ישנן מספר דרכים כדי למנוע MySQL זריקות בתוך PHP. הדרכים הנפוצות ביותר הן שימוש בפונקציות כגון addslashes() ו - mysql_real_escape_string().
 

addslashes()

 

addslashes() יחזיר מחרוזת עם קו נטוי הפוך לפני תווים שצריכים להיות מחוטא בשאילתות מסד נתונים. דמויות אלה הן בגרשיים בודדים (‘ = ’) מרכאות כפולות (” = ”) וnullbyte (%00 = \0).
 

addslashes() יפעל רק אם מחרוזת השאילתה היא עטופה במרכאות. מחרוזת כגון הבא עדיין תהיה פגיעה להזרקת SQL:
 

1
2
3
$USER_NAME = addslashes( $_POST[ "שם משתמש" ] );
$סיסמא  = addslashes( $_POST[ "סיסמא" ] );
$שאלה = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מusers_table איפה = שם משתמש '$USER_NAME"וסיסמא = '$סיסמא' ";

mysql_real_escape_string()

 

mysql_real_escape_string() הוא קצת יותר חזק מאשר addslashes() כפי שהוא מכנה את פונקצית הספרייה של MySQL mysql_real_escape_string, אשר מוסיף את הלוכסנים לתווים הבאים: \x00, \n, \r, \, ", ” ו X1A.
 

כמו עם addslashes(), mysql_real_escape_string() יפעל רק אם מחרוזת השאילתה היא עטופה במרכאות. מחרוזת כגון הבא עדיין תהיה פגיעה להזרקת SQL:
 

1
2
3
$USER_NAME = mysql_real_escape_string( $_POST[ "שם משתמש" ] );
$סיסמא  = mysql_real_escape_string( $_POST[ "סיסמא" ] );
$שאלה = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מusers_table איפה = שם משתמש '$USER_NAME"וסיסמא = '$סיסמא' ";

 

sprintf()

 

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

1
2
3
$USER_NAME = $_POST[ "שם משתמש" ];
$סיסמא  = $_POST[ "סיסמא" ];
$שאלה = sprintf("SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מusers_table איפה = שם משתמש '%של"וסיסמא = '%של' ", $USER_NAME, $סיסמא);

 

htmlentities($היה, ENT_QUOTES)

 

htmlentities() בשיתוף עם הפרמטר השני האופציונלי quote_style, מאפשר השימוש ENT_QUOTES, שיהיה להמיר ציטוטים שניהם כפולות ויחיד. זה יעבוד באותו המובן כמו addslashes() ו - mysql_real_escape_string() בכל הקשור למרכאות, אולם, במקום prepending קו נטוי, זה יהיה להשתמש בישות ה-HTML של הגרש.
 

בנוסף לשימוש ENT_QUOTES בתוך htmlentities(), פרמטר שלישי ניתן להגדיר שמאלץ את השימוש בתווים בתוך גיור. זה יעזור לעצור תוצאות לא צפויות מהשימוש multibyte תווים בערכות תווים כגון כ Big5 ו - GPK.
 

להלן דוגמה של קוד אשר תעזור למנוע הזרקת SQL ב-PHP.
 

1
2
3
4
5
$USER_NAME = $_POST[ "שם משתמש" ];
$USER_NAME = htmlentities( $USER_NAME, ENT_QUOTES, "UTF-8" );
$סיסמא  = $_POST[ "סיסמא" ];
$סיסמא  = htmlentities( $סיסמא, ENT_QUOTES, "UTF-8" );
$שאלה = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER מusers_table איפה = שם משתמש '$USER_NAME"וסיסמא = '$סיסמא' ";

 

מטב SQL קוד

 

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

להשבית הודעת שגיאת SQL ברירת מחדל

 

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

לאחסן אישורי מסד נתונים אופן מאובטח

 

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

שימוש בעיקרון הרשאות לפחות

 

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

השבת צדפים

 

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

השתמש בכלי הזרקת SQL לבדוק פגיעויות

 

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

רב תודות. אני מקווה שכולכם ודאי נהניתי. בבקשה לתת הערות, כך שנוכל לעשות יותר טוב.

 
 

28,910 סה"כ צפיות, 9 צפיות היום

שתי הכרטיסיות הבאות לשנות את התוכן בהמשך.

Ashfaq אנסארי

חוקר אבטחה
Ashfaq אנסארי הוא המייסד של HackSys צוות שם קוד "Panthera". הוא חוקר אבטחה עם ניסיון בהיבטים שונים של אבטחת המידע. הוא חיבר "נהג פגיע HackSys קיצוני" ו - "Shellcode מוות". הוא גם כתב ופרסם סקירות טכניות שונות על ניצול תוכנה ברמה נמוכה. עניין הליבה שלו טמון ב "ניצול רמה נמוך", "הנדסה הפוכה", "ניתוח תכנית" ו - "Fuzzing ההיברידית". הוא fanboy של בינה המלאכותית ומערכות לומדות. הוא הפרק להוביל ל null פונה.

ההודעות אחרונות על ידי Ashfaq אנסארי (לראות את כל)

השאר תגובה

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *