Այս 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- ի փոփոխականի օգտվողի արժեքը կտրվի $ $ փոփոխականի:
Այն անմիջապես տեղադրվում է SQL հայտարարության մեջ, ինչը հնարավորություն է տալիս օգտվողին խմբագրել SQL հայտարարությունը:
$ name = "admin 'OR 1 = 1 -"; $ query = "ԸՆՏՐԵԼ գաղտնաբառ tbl_user WHERE name = '$ name'";
Քայլ 3. SQL տվյալների բազան այնուհետև կստանա SQL քաղվածքը հետևյալ կերպ
ԸՆՏՐԵԼ գաղտնաբառ tbl_users WHERE name = 'admin' OR 1 = 1 - '
-
Սա վավեր SQL է, բայց օգտվողին մեկ գաղտնաբառ վերադարձնելու փոխարեն, քաղվածքը կվերադարձնի tbl_user աղյուսակի բոլոր գաղտնաբառերը: Սա այն չէ, ինչ ցանկանում եք ձեր վեբ ծրագրերում:
2 -րդ մաս 2 -ից. Օգտագործելով mySQLi ՝ պատրաստված հայտարարություններ ստեղծելու համար
Քայլ 1. Ստեղծեք mySQLi SELECT հարցումը:
Օգտագործեք ստորև բերված կոդը ՝ mySQLi Prepared Statements- ի միջոցով աղյուսակից տվյալներ ընտրելու համար:
$ name = $ _GET ['օգտվողի անուն']; if ($ stmt = $ mysqli-> պատրաստել («ԸՆՏՐԵԼ գաղտնաբառ tbl_users WHERE name =?»)) {// Փոփոխականը միացրեք պարամետրին որպես տող: $ stmt-> bind_param ("s", $ name); // Կատարել հայտարարությունը: $ stmt-> կատարել (); // Ստացեք փոփոխականները հարցումից: $ stmt-> bind_result ($ pass); // Բեռնել տվյալները: $ stmt-> վերցնել (); // Displayուցադրել տվյալները: printf (" %s օգտվողի գաղտնաբառը %s / n է", $ name, $ pass); // Փակեք պատրաստված հայտարարությունը: $ stmt-> փակել (); }
Նշում. $ Mysqli փոփոխականը mySQLi միացման օբյեկտ է:
Քայլ 2. Ստեղծեք mySQLi INSERT հարցումը:
Օգտագործեք ստորև բերված ծածկագիրը ՝ տվյալները տեղադրելու համար աղյուսակում ՝ օգտագործելով mySQLi Պատրաստված հայտարարությունները:
$ name = $ _GET ['օգտվողի անուն']; $ գաղտնաբառ = $ _GET ['գաղտնաբառ']; if ($ stmt = $ mysqli-> պատրաստել («ՄՏԱԵՔ tbl_users (անուն, գաղտնաբառ) ԱՐUԵՔՆԵՐ (?,?)")) {// Փոփոխականները միացրեք պարամետրին որպես տողեր: $ stmt-> bind_param ("ss", $ name, $ գաղտնաբառ); // Կատարել հայտարարությունը: $ stmt-> կատարել (); // Փակեք պատրաստված հայտարարությունը: $ stmt-> փակել (); }
Նշում. $ Mysqli փոփոխականը mySQLi միացման օբյեկտ է:
Քայլ 3. Ստեղծեք mySQLi UPDATE հարցումը:
Օգտագործեք ստորև բերված ծածկագիրը ՝ mySQLi Preparated Statements- ի միջոցով աղյուսակում տվյալները թարմացնելու համար:
$ name = $ _GET ['օգտվողի անուն']; $ գաղտնաբառ = $ _GET ['գաղտնաբառ']; if ($ stmt = $ mysqli-> պատրաստել ("UPDATE tbl_users SET password =? WHERE name =?")) {// Փոփոխականները միացրեք պարամետրին որպես տողեր: $ stmt-> bind_param ("ss", $ գաղտնաբառ, $ name); // Կատարել հայտարարությունը: $ stmt-> կատարել (); // Փակեք պատրաստված հայտարարությունը: $ stmt-> փակել (); }
Նշում. $ Mysqli փոփոխականը mySQLi միացման օբյեկտ է:
Քայլ 4. Ստեղծեք mySQLi DELETE հարցումը:
Ստորև բերված սցենարը այն է, թե ինչպես ջնջել տվյալները աղյուսակից ՝ օգտագործելով mySQLi- ի պատրաստված հայտարարությունները:
$ name = $ _GET ['օգտվողի անուն']; $ գաղտնաբառ = $ _GET ['գաղտնաբառ']; if ($ stmt = $ mysqli-> պատրաստել ("DEՆTEԵԼ tbl_users WHERE name =?")) {// Փոփոխականը պարամետրի հետ կապել որպես տող: $ stmt-> bind_param ("s", $ name); // Կատարել հայտարարությունը: $ stmt-> կատարել (); // Փակեք պատրաստված հայտարարությունը: $ stmt-> փակել (); }